用VB设计汉诺塔动画游戏

合集下载

VB动画奔跑的小白马

VB动画奔跑的小白马

VB动画奔跑的小白马
作者:
来源:《电脑报》2020年第41期
你小时候肯定应该见过翻页书,它是最早的动画片形式之一,每页书上绘出角色连续的动作,一页就是动画的一帧,随着快速翻页原本一页页的图片就形成了电影一样的效果。

今天我们用VB来完成一个简单的动画——奔跑的小白马。

首先扫码下载素材包,里面有7张小白马奔跑的图片。

接下来就需要将7张图片連接起来组合成动画片。

小白马从左跑向右,当小白马跑出舞台区域后,回到左边重新循环,不停重复。

这与我们最初学习Scratch的小猫移动类似,只是用VB制作稍微复杂一点。

首先将图片按顺序命名,比如H1、H2……H6、H7。

接下来在舞台的区域处增加一个Image图片和两个时钟的设置,这里肯定有同学好奇了,为什么要设置两个时钟呢?因为一个时钟用来控制舞台图片的移动,另外一个时钟用来控制外部图片的次序变化。

当程序运行后同时触发时钟。

第一个时钟控制舞台Image图片的向右移动,每次移动60,图片向右移动直到舞台的边缘。

小白马到边缘就消失了,要给它一个条件当触碰到舞台边缘后,立即回到最左边(0-Image.width)重新向右移动。

第二个时钟用来控制外部图片的次序变化,小马移动的图片是外部的图片导入进来的,通过LoadPicture的方式将外部图片连接起来,从H1到H7每次加1直到超出8时跳转回起始1的位置。

当这些步骤完成之后,点击运行就可以看见一匹白色的小马在无忧无虑快乐地奔跑了。

其实在我们的生活中经常能够看见一些新颖、有趣的东西,例如游戏或应用题。

通过我们的转化可以把它变成我们编程的一部分,这样既扩展了你的思维,又增加了不少的可玩性呢。

【C语言程序设计】汉诺塔问题,用C语言实现汉诺塔!

【C语言程序设计】汉诺塔问题,用C语言实现汉诺塔!

【C语⾔程序设计】汉诺塔问题,⽤C语⾔实现汉诺塔!汉诺塔问题是指:⼀块板上有三根针 A、B、C。

A 针上套有 64 个⼤⼩不等的圆盘,按照⼤的在下、⼩的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 C 针上,每次只能移动⼀个圆盘,移动过程可以借助 B 针。

但在任何时候,任何针上的圆盘都必须保持⼤盘在下,⼩盘在上。

从键盘输⼊需移动的圆盘个数,给出移动的过程。

算法思想对于汉诺塔问题,当只移动⼀个圆盘时,直接将圆盘从 A 针移动到 C 针。

若移动的圆盘为 n(n>1),则分成⼏步⾛:把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针);A 针上的最后⼀个圆盘移动到 C 针;B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。

每做⼀遍,移动的圆盘少⼀个,逐次递减,最后当 n 为 1 时,完成整个移动过程。

因此,解决汉诺塔问题可设计⼀个递归函数,利⽤递归实现圆盘的整个移动过程,问题的解决过程是对实际操作的模拟。

程序代码#include <stdio.h>int main(){int hanoi(int,char,char,char);int n,counter;printf("Input the number of diskes:");scanf("%d",&n);printf("\n");counter=hanoi(n,'A','B','C');return0;}int hanoi(int n,char x,char y,char z){int move(char,int,char);if(n==1)move(x,1,z);else{hanoi(n-1,x,z,y);move(x,n,z);hanoi(n-1,y,x,z);}return0;}int move(char getone,int n,char putone){static int k=1;printf("%2d:%3d # %c---%c\n",k,n,getone,putone);if(k++%3==0)printf("\n");return0;}调试运⾏结果:当移动圆盘个数为 3 时,具体移动步骤如下所⽰:Input the number of diskes:31: 1 # A---C2: 2 # A---B3: 1 # C---B4: 3 # A---C5: 1 # B---A6: 2 # B---C7: 1 # A---C总结:本实例中定义的 hanoi() 函数是⼀个递归函数,它有四个形参"n""x""y""z"。

汉诺塔游戏用C编

汉诺塔游戏用C编

#ifndef HANIO_H_#define HANIO_Hclass Stack{private:enum{ MAX=50 };int m_node[MAX];int m_top;int m_size;int m_index;public:Stack();~Stack() { };bool Isfull() { return m_top==MAX-1 ;}; ush(i); utPrint();}void Hanio::print(char ch,int n){for(int i=1;i<=n;i++)std::cout<<ch;}void Hanio::DrawPaletes(char ch){int max;max=m_stack[0].Size()>m_stack[1].Size() ? m_stack[0].Size() : m_stack[1].Size();max=m_stack[2].Size()>max ? m_stack[2].Size() : max;etIndex(max-1);m_stack[1].SetIndex(max-1);m_stack[2].SetIndex(max-1);for(int i=1;i<=max;i++){int data1=m_stack[0].MoveToNext();int data2=m_stack[1].MoveToNext();int data3=m_stack[2].MoveToNext();if(data1==0)print(' ',20);else{print(' ',10-data1);print(ch,2*data1);print(' ',10-data1);}if(data2==0)print(' ',20);else{print(' ',10-data2);print(ch,2*data2);print(' ',10-data2);}if(data3==0)print(' ',20);else{print(' ',10-data3);print(ch,2*data3);print(' ',10-data1);}std::cout<<std::endl;}}bool Hanio::MoveFromTo(int x,int y){m_steps++; sempty()){std::cout<<x<<" pallete is empty ! continue !"<<std::endl;std::();return false;}if(m_stack[y].Isempty()){int data;m_stack[x].Pop(&data);m_stack[y].Push(data);return true;}else{if(m_stack[x].TopValue()>m_stack[y].TopValue()){std::cout<<"The board can't move from "<<x<<" plate to " <<y<<" plate!"<<std::endl;std::();return false;}else{int data;m_stack[x].Pop(&data);m_stack[y].Push(data);return true;}}}bool Hanio::IsFinished(){return m_stack[2].Top()==m_num-1;}void Hanio::GameStart(){using namespace std;UINT StartTime=::GetTickCount();UINT EndTime;while(1){system("cls");print('-',80);cout<<"steps: "<<m_steps; print(' ',20);cout<<"Used time: "<<m_times<<endl;print('-',80);cout<<endl; cout<<endl; print(' ',10); cout<<"A";print(' ',19); cout<<"B"; print(' ',19);cout<<"C"<<endl<<endl;Hanio::DrawPaletes();cout<<endl; cout<<endl;print('-',80);."<<endl;();}char ch1=toupper(szCommand[0]);char ch2=toupper(szCommand[1]);if( ch1=='A' && ch2=='B')Hanio::MoveFromTo(0,1);else if ( ch1=='A' && ch2=='C')MoveFromTo(0,2);else if ( ch1=='B' && ch2=='A')MoveFromTo(1,0);else if ( ch1=='B' && ch2=='C')MoveFromTo(1,2);else if ( ch1=='C' && ch2=='A')MoveFromTo(2,0);else if ( ch1=='C' && ch2=='B')MoveFromTo(2,1);else{cout<<"Bad command !"<<endl;();}每天只能动一个盘,而且只能从最上面的铁盘开始搬动."<<endl; print(' ',5);cout<<"2. 必须维持较小的铁盘在上方的原则"<<endl;cout<<endl;cout<<"这两个原则,则当24个铁盘完全般到另一个木桩时,世界就回永久和平!!"<<endl;cout<<"游戏的玩法可以在命令行中输入HELP查看"<<endl;cout<<endl;cout<<endl;cout<<endl;cout<<endl;cout<<endl;cout<<"再此输入你要搬的铁盘数(建议在1--10值间,太多回花费很长时间的)"<<endl; print('=',80);cout<<">>";cin>>number;();system("cls");return number;}。

(完整版)vb小游戏代码

(完整版)vb小游戏代码

数字排序小游戏Option ExplicitDim Label2X As Integer '记录标签控件数组中要移动的标签控件左上角X的位置Dim Label2Y As Integer '记录标签控件数组中要移动的标签控件左上角Y的位置'让标签数组中的每个标签控件上显示的数字是随机的,无重复的Private Sub Init()RandomizeDim a(7) As IntegerDim i As Integer, k As IntegerLabel1.Caption = ""For i = 0 To 7a(i) = iNextFor i = 0 To 7k = Int(Rnd * 8)Do While a(k) = -1 'a(k)=-1表示该数组元素对应的数字已经被使用过了k = Int(Rnd * 8) '重新生成k的值,直到a(k)的值不等于-1LoopLabel2(i).Caption = Trim(Str(a(k)))a(k) = -1 'a(k)的值已经使用了,不能再用,重新赋值为-1与其他的元素值相区别Next iEnd SubPrivate Sub Command1_Click()Dim x As Integer, y As IntegerDim z As IntegerInitPicture1.Enabled = True'让空白标签Label1出现的位置随机Randomize'记录下空白标签Label1的位置x = Label1.Lefty = Label1.Topz = Int(Rnd * 8)'将空白标签Label1和标签控件数组任一控件交换位置Label1.Move Label2(z).Left, Label2(z).TopLabel2(z).Move x, yCommand1.Enabled = FalseEnd SubPrivate Sub Command2_Click()EndEnd SubPrivate Sub Form_Load()Dim i As IntegerPicture1.Enabled = False'在标签中显示游戏说明信息Label3.Caption = "如左图所示,将数字按0-7顺" & vbCrLf & vbCrLf & "序依次排列,即取得胜利。

vb小游戏代码

vb小游戏代码

数字排序小游戏Option ExplicitDim Label2X As Integer '记录标签控件数组中要移动的标签控件左上角X的位置Dim Label2Y As Integer '记录标签控件数组中要移动的标签控件左上角Y的位置'让标签数组中的每个标签控件上显示的数字是随机的,无重复的Private Sub lnit()RandomizeDim a(7) As IntegerDim i As Integer, k As IntegerLabel1.Caption =""Fori = 0 To 7 a(i) = iNextFori = 0 To 7k = Int(Rnd * 8)Do While a(k) = -1 'a(k)=-1表示该数组元素对应的数字已经被使用过了k = Int(Rnd * 8)'重新生成k的值,直到a(k)的值不等于-1LoopLabel2(i).Caption = Trim(Str(a(k)))a(k) = -1 'a(k)的值已经使用了,不能再用,重新赋值为-1与其他的元素值相区别Next iEnd SubPrivate Sub Command1_Click()Dim x As Integer, y As IntegerDim z As IntegerInitPicture1.Enabled = True'让空白标签Label1 出现的位置随机Randomize'记录下空白标签Label1 的位置x = Label1.Lefty = Label1.Topz = Int(Rnd * 8)'将空白标签Label1 和标签控件数组任一控件交换位置Label1.Move Label2(z).Left, Label2(z).TopLabel2(z).Move x, yCommand1.Enabled = FalseEnd SubPrivate Sub Command2_Click()EndEnd SubPrivate Sub Form_Load() Dim i As Integer Picture1.Enabled = False'在标签中显示游戏说明信息Label3.Caption = "如左图所示,将数字按0-7 顺" & vbCrLf & vbCrLf & " 序依次排列,即取得胜利'在标签中显示排列规则后的数字顺序Label1.Caption = 0For i = 0 To 6Label2(i).Caption = i + 1NextEnd SubPrivate Sub Label1_DragDrop(Source As Control, x As Single, y As Single)Dim Label1X As Integer ' 记录空白控件Label1 左上角X 的位置Dim Label1Y As Integer ' 记录空白控件Label1 左上角Y 的位置Dim flag(3) As Boolean'获取空白控件Label1 的位置Label1X = Label1.LeftLabel1Y = Label1.Top'要移动的控件位于空白控件Label1 的正左侧flag(0) = (Label2X = Label1X - Source.Width) And (Label2Y = Label1Y)'要移动的控件位于空白控件Label1 的正右侧flag(1) = (Label2X = Label1X + Source.Width) And (Label2Y = Label1Y)'要移动的控件位于空白控件Label1 的正上方flag(2) = (Label2X = Label1X) And (Label2Y = Label1Y - Source.Height)'要移动的控件位于空白控件Label1 的正下方flag(3) = (Label2X = Label1X) And (Label2Y = Label1Y + Source.Height)If flag(0) Or flag(1) Or flag(2) Or flag(3) ThenLabel1.Move Label2X, Label2YSource.Move Label1X, Label1YEnd IfWinEnd SubPrivate Sub Label2_MouseDown(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single) If Button = vbLeftButton Then '如果按下鼠标左键'记录下要拖动控件的位置Label2X = Label2(Index).LeftLabel2Y = Label2(Index).TopLabel2(Index).Drag 1 '启动拖动操作End IfEnd SubPrivate Sub Label2_MouseUp(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single) Label2(Index).Drag 2 '结束拖动操作End SubPrivate Sub Win()Dim winner As IntegerDim i As IntegerDim answer As Integer'对于给定的标签控件数组中的任一标签控件,可以落在符合要求( 对应位置应显示对应数字)'的八个位置中的任一位置'利用循环语句对标签控件数组中的每个标签控件进行检查,如果其落在某一符号要求的位置,'则变量winner 的值加1 ,如果所有标签控件都落在符号要求的位置,则变量winner 的值应为8For i = 0 To 7If Label2(i).Left = 0 And Label2(i).Top = 0 And _Label2(i).Caption = 0 Thenwinner = winner + 1ElseIf Label2(i).Left = Label2(i).Width And Label2(i).Top = 0 And _Label2(i).Caption = 1 Thenwinner = winner + 1ElseIf Label2(i).Left = 2 * Label2(i).Width And Label2(i).Top = 0 And _Label2(i).Caption = 2 Thenwinner = winner + 1ElseIf Label2(i).Left = 0 And Label2(i).Top = Label2(i).Height And _Label2(i).Caption = 3 Thenwinner = winner + 1ElseIf Label2(i).Left = Label2(i).Width And Label2(i).Top = Label2(i).Height And _ Label2(i).Caption = 4 Thenwinner = winner + 1ElseIf Label2(i).Left = 2 * Label2(i).Width And Label2(i).Top = Label2(i).Height And _ Label2(i).Caption =5 Then winner = winner + 1ElseIf Label2(i).Left = 0 And Label2(i).Top = 2 * Label2(i).Height And _Label2(i).Caption = 6 Thenwinner = winner + 1ElseIf Label2(i).Left = Label2(i).Width And Label2(i).Top = 2 * Label2(i).Height And _ Label2(i).Caption =7 Thenwinner = winner + 1End IfNext iIf winner = 8 ThenMsgBox " 恭喜您,胜利了!", 0 + 64 + 0, "提示" Picture1.Enabled = Falseanswer = MsgBox(" 还继续吗?", 4 + 32 + 0, " 提示")If answer = vbYes ThenCommandl.Enabled = TrueElseEndEnd IfEnd IfEnd Sub弹球游戏Dim x_step As IntegerDim y_step As IntegerPrivate Sub command1_Click()If Timer1.Enabled = True ThenTimer1.Enabled = FalseElseTimer1.Enabled = TrueEnd IfIf command1.Caption ="暂停"Then command1.Caption ="继续" Else command1.Caption ="暂停End IfEnd SubPrivate Sub Form_Load()x_step = 200y_step = 200End SubPrivate Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 37 ThenIf Line1.X1 < 0 ThenLine1.X1 = 0: Line1.X2 = 2000ElseLine1.X1 = Line1.X1 - 100: Line1.X2 = Line1.X2 - 100End IfEnd IfIf KeyCode = 39 ThenIf Line1.X1 > Picture1.Width ThenLine1.X1 = Picture1.Width - 2000: line2.X2 = Picture.Width ElseLine1.X1 = Line1.X1 + 100: Line1.X2 = Line1.X2 + 100 End IfEnd IfEnd SubPrivate Sub Timer1_Timer()If Shape1.Top < 0 ThenShape1.Top = 0: y_step = -y_stepEnd IfIf Shape1.Left < 0 ThenShape1.Left = 0x_step = -x_stepEnd IfIf Shape1.Left > Picture1.Width - Shape1.Width Then Shape1.Left = Picture1.Width - Shape1.Widthx_step = -x_stepEnd IfIf Shapel.Left >= Linel.XI And Shapel.Left <= Line1.X2 And Shapel.Top >= Linel.YI - Shapel.Height Then Shapel.Top = Linel.YI - Shapel.Height y_step = -y_step * 1.01 x_step = x_step * 1.01Label2.Caption = Label2.Caption + 1End IfShape1.Top = Shape1.Top + y_stepShape1 .Left = Shape1.Left + x_stepIf Shape1.Top >= Picture1.Height - Shape1.Height ThenMsgBox "游戏结束" command1.Caption ="开始Timer1.Enabled = FalseShape1.Top = 1000Label2.Caption = 0End IfEnd Sub打字游戏Dim score As Integer:::::盯问没宜:竽ifiFF希iS匿述:Dim speed As IntegerDim typetime As IntegerPrivate Sub init()Randomizelblletter1.Caption = Chr(Int(Rnd * 42) + 48) lblletter1.Left = Int(Rnd * 2800) + 1 lblletter1.Top = 0End SubPrivate Sub init1()Randomize lblletter2.Caption = Chr(Int(Rnd * 25) + 97) lblletter2.Left = Int(Rnd * 2800) + 1 lblletter2.Top = 0 End SubPrivate Sub Command1_Click()score = Int(lblscore.Text)initinit1Timer1 = TrueTimer2 = TrueHScroll1.Enabled = FalseCommand1.Enabled = FalseCommand2.Enabled = FalseHScroll1.Enabled = FalseIf lbltime.Text <= 0 ThenTimer1 = FalseTimer2 = Falselblletter1.Caption = "" lblletter2.Caption = ""End IfEnd SubPrivate Sub Command2_Click() typetime = InputBox(" 请输入打字时间。

小时候经典游戏用VB编的编写实例教程大全全!

小时候经典游戏用VB编的编写实例教程大全全!

这些游戏以前玩过吧,快下载看它们是怎么编写的!目录:·编写趣味撞球小游戏·用VB6.0设计简易赛车游戏·Visual Basic小游戏:猜英雄·VB游戏写作技巧(1)秀图篇·VB游戏写作技巧(2)网络篇·VB 贪吃蛇单人版游戏(一)·VB 贪吃蛇单人版游戏(二)·VB 贪吃蛇单人版游戏(三)·VB 贪吃蛇单人版游戏(四)·用VB开发即时战略游戏正文:编写趣味撞球小游戏文章来源:沐风经典文章作者:佚名Visual Basic是一个功能强大的工具,它有一大特点就是易学易用,下面我们就通过写一个“趣味撞球”的程序来初步体会一下。

首先启动VB5,新建一个标准的EXE工程。

此时可以看到,工程包括一个Form1框体。

在Form1边框的右下角按住鼠标左键不放,拖动鼠标把Form1的面积改为适当大小,比如6930×4320。

再在属性框中把Form1的ScaleMode 属性改为3-Pixel,表明我们将以像素为我们的坐标计算单位,把Form1的StartUpPosition 属性设为2-CenterScreen,使运行时窗体出现在屏幕正中。

现在,在控件面板上选取CommandButton(命令按钮)控件,为Form1添加Command1和Command2两个按钮控件,把它们的大小设为121×25,再在属性框中把Command1的Caption填为“&GO”,把Command2的Caption填为“&QUIT”,并把Command1放到框体的右上角,把Command2放到框体的右下角。

然后,在控件面板上选取Timer(时钟)控件,为Form1添加一个Timer1时钟控件。

再在属性框中把它的Enabled属性改为False,Interval属性改为50,前一个值表示该时钟控件是否激活,后一个值决定该时钟控件产生Timer事件的间隔时间,我们将用它来控制小球的移动频率。

VB程序设计之扫雷程序

VB程序设计之扫雷程序

VB程序设计之扫雷程序《VB 程序设计之扫雷程序》扫雷,这个经典的小游戏,相信大家都不陌生。

在计算机编程领域,我们可以使用 VB(Visual Basic)来设计实现一个扫雷程序。

接下来,就让我们一步步走进这个充满挑战与乐趣的编程之旅。

扫雷程序的基本原理其实并不复杂。

它是在一个二维的方格矩阵中,随机埋下一定数量的“地雷”。

玩家通过点击方格来揭示其状态,如果是空白格,则会显示周围 8 个方格中地雷的数量;如果点击到地雷,则游戏结束。

在 VB 中,我们首先需要创建一个合适的界面。

这包括一个用于显示方格的区域,以及一些用于控制游戏的按钮,比如开始新游戏、暂停、显示地雷位置等。

对于方格的显示,我们可以使用 PictureBox 控件来实现。

通过设置 PictureBox 的大小和位置,来构建出整齐的方格矩阵。

接下来是数据的存储和处理。

我们需要一个二维数组来记录每个方格的状态,比如是否为地雷、是否被标记、是否被点击以及周围地雷的数量等。

在程序初始化时,随机生成地雷的位置,并计算每个方格周围地雷的数量。

当玩家点击一个方格时,程序会根据方格的状态进行相应的处理。

如果是空白格且周围没有地雷,就需要使用递归算法来自动展开周围的空白区域,以提高游戏的流畅性。

如果点击到地雷,那么游戏结束,显示所有地雷的位置。

在实现过程中,还需要处理一些细节问题。

比如,如何判断鼠标点击的位置对应的是哪个方格;如何处理玩家标记方格为地雷的操作;如何在游戏结束时显示正确的结果等等。

为了让游戏更加友好和美观,我们还可以添加一些特效和提示。

比如,当鼠标悬停在方格上时,显示一些提示信息;当玩家成功完成一局游戏时,弹出祝贺的消息框。

在代码编写方面,我们需要合理地组织函数和过程,使代码具有良好的可读性和可维护性。

例如,可以将方格的处理、数据的计算、界面的更新等分别放在不同的函数中。

以下是一个简单的示例代码,展示了如何在 VB 中处理鼠标点击事件:```vbPrivate Sub PictureBox1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)Dim col As IntegerDim row As Integercol = Int(X / PictureBox1Width)row = Int(Y / PictureBox1Height)'这里添加对点击方格的具体处理代码End Sub```总之,通过VB 程序设计扫雷程序,不仅能够锻炼我们的编程能力,还能让我们更深入地理解算法、数据结构和用户交互等方面的知识。

用VB编写的齿轮的动画 全部程序

用VB编写的齿轮的动画 全部程序

(1)Private Sub Command1_Click()Unload MeLoad Form2Form2.ShowEnd SubPrivate Sub Label1_Click()End SubPrivate Sub Timer1_Timer()Static p As Integerp = p + 1If p = 16 Thenp = 0End IfLabel1.ForeColor = QBColor(p Mod 14)Label2.ForeColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256)) Label3.ForeColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256)) Label4.ForeColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256))End SubPrivate Sub Timer2_Timer()Command1.BackColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256)) End Sub(2)Private Sub Command1_Click()Command1.Visible = FalseCommand2.Visible = TruePicture1.Visible = TruePicture1.ClsCommand2.Value = FalseCommand3.Value = FalseTimer1.Enabled = FalseTimer2.Enabled = False'开始画第一个齿轮rb1 = 170 / 2 * Cos(PI / 9)ra1 = 190 / 2rf1 = (17 - 2 - 0.5) * 10 / 2Picture1.Scale (-120, -200)-(370, 200)'画渐开线——Picture1.DrawWidth = 1.2Picture1.Circle (0, 0), 2, QBColor(15)'rk1 = rb1'i = jiao * PI / 180For a1 = 19 / 17 * i + 0 To 2 * PI + 19 / 17 * i Step 2 * PI / 17mn1 = a1 + 14 * PI / 180mm1 = a1 + 12.5 * PI / 180z21 = rf1 * Cos(mn1)z22 = rf1 * Sin(mn1)X1112 = rb1 * Cos(mm1)Y1112 = rb1 * Sin(mm1)Picture1.Line (z21, z22)-(X1112, Y1112), QBColor(15)gk1 = Tan(Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1)) - Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1) '展角与rk的关系b1 = a1 + gk1sb1 = PI * 10 / 2 * Cos(PI / 9) - 10 * 17 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X1111 = rb1 * Cos(b1 - gk1)Y1111 = rb1 * Sin(b1 - gk1)'画齿根圆弧For p1 = a1 - 7 * PI / 180 To a1 - 1 * PI / 180 Step 0.4 * PI / 180z11 = rf1 * Cos(p1)z12 = rf1 * Sin(p1)Picture1.PSet (z11, z12), QBColor(15)Next p1Picture1.Line (z11, z12)-(X1111, Y1111), QBColor(15)For rk1 = rb1 To ra1 Step 0.4gk1 = Tan(Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1)) - Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1) '展角与rk的关系b1 = a1 + gk1sb1 = PI * 10 / 2 * Cos(PI / 9) - 10 * 17 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X1 = rk1 * Cos(b1)Y1 = rk1 * Sin(b1)If b1 = a1 Thenbx1 = X1By1 = Y1Picture1.PSet (bx1, By1), QBColor(15)ElsePicture1.PSet (X1, Y1), QBColor(15)End IfNext rk1sb1 = PI * 10 / 2 * Cos(PI / 9) - 10 * 17 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))w1 = sb1 / rb1For rk1 = rb1 To ra1 Step 0.4gk1 = Tan(Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1)) - Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1) '展角与rk的关系d1 = a1 + w1 - gk1sb1 = PI * 10 / 2 * Cos(PI / 9) - 10 * 17 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X12 = rk1 * Cos(d1)Y12 = rk1 * Sin(d1)If d1 = w1 Thenbx12 = X12By12 = Y12Picture1.PSet (bx12, By12), QBColor(15)ElsePicture1.PSet (X12, Y12), QBColor(15)End IfNext rk1Next a1For k1 = 0 + 19 / 17 * i To 2 * PI + 19 / 17 * i Step 2 * PI / 17For k11 = k1 + gk11 + 4.5 * PI / 180 To k1 + sb1 / rb1 - gk11 - 3.8 * PI / 180 Step 0.3 * PI / 180 x111 = ra1 * Cos(k11)y111 = ra1 * Sin(k11)Picture1.PSet (x111, y111), QBColor(15)Next k11Next k1'第一个齿轮结束'开始画第二个齿轮rb2 = 190 / 2 * Cos(PI / 9)ra2 = (19 + 2) * 10 / 2rf2 = (19 - 2 - 0.5) * 10 / 2'画渐开线——Picture1.Circle (183, 0), 2, QBColor(12)For a2 = 0 + 7.88 * PI / 180 - i To 2 * PI + 7.88 * PI / 180 - i Step 2 * PI / 19 mn2 = a2 - 6.5 * PI / 180mm2 = a2 - 7.5 * PI / 180z2121 = 183 + rf2 * Cos(mn2)z2222 = rf2 * Sin(mn2)X2112 = 183 + rb2 * Cos(mm2)Y2112 = rb2 * Sin(mm2)Picture1.Line (z2121, z2222)-(X2112, Y2112), QBColor(12)X2111 = 183 + rb2 * Cos(a2)Y2111 = rb2 * Sin(a2)'画齿根圆弧For p2 = a2 - 6 * PI / 180 To a2 - 0.8 * PI / 180 Step 0.4 * PI / 180 z111 = 183 + rf2 * Cos(p2)z121 = rf2 * Sin(p2)Picture1.PSet (z111, z121), QBColor(12)Next p2Picture1.Line (z111, z121)-(X2111, Y2111), QBColor(12)For rk2 = rb2 To ra2 Step 0.4gk2 = Tan(Atn(Sqr(1 - rb2 / rk2 * rb2 / rk2) / rb2 * rk2)) - Atn(Sqr(1 - rb2 / rk2 * rb2 / rk2) / rb2 * rk2) '展角与rk的关系b2 = a2 + gk2sb2 = PI * 10 / 2 * Cos(PI / 9) - 10 * 19 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X2 = 183 + rk2 * Cos(b2)Y2 = rk2 * Sin(b2)If b2 = a2 Thenbx2 = X2By2 = Y2Picture1.PSet (bx2, By2), QBColor(12)ElsePicture1.PSet (X2, Y2), QBColor(12)End IfNext rk2sb2 = PI * 10 / 2 * Cos(PI / 9) - 10 * 19 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))w2 = sb2 / rb2For rk2 = rb2 To ra2 Step 0.4gk2 = Tan(Atn(Sqr(1 - rb2 / rk2 * rb2 / rk2) / rb2 * rk2)) - Atn(Sqr(1 - rb2 / rk2 * rb2 / rk2)/ rb2 * rk2) '展角与rk的关系d2 = a2 + w2 - gk2sb2 = PI * 10 / 2 * Cos(PI / 9) - 10 * 19 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X22 = 183 + rk2 * Cos(d2)Y22 = rk2 * Sin(d2)If d2 = w2 Thenbx22 = X22By22 = Y22Picture1.PSet (bx22, By22), QBColor(12)ElsePicture1.PSet (X22, Y22), QBColor(12)End IfNext rk2'齿根圆圆弧Next a2For k2 = 0 + 7.88 * PI / 180 - i To 2 * PI + 7.88 * PI / 180 - i Step 2 * PI / 19gk22 = Tan(Atn(Sqr(1 - rb2 / ra2 * rb2 / ra2) / rb2 * ra2)) - Atn(Sqr(1 - rb2 / ra2 * rb2 / rk2) / rb2 * ra2)For k22 = k2 + gk22 To k2 + sb2 / rb2 - gk2 Step 0.3 * PI / 180x222 = 183 + ra2 * Cos(k22)y222 = ra2 * Sin(k22)Picture1.PSet (x222, y222), QBColor(12) Next k22Next k2End SubPrivate Sub Command2_Click()Label1.Visible = TrueLabel2.Visible = TrueCommand4.Visible = TrueVScroll1.Visible = TrueCommand3.Visible = TrueCommand1.Visible = FalseIf Command2.Caption = "白色齿轮顺时针转" Then Command2.Caption = "白色齿轮逆时针转" Timer1.Enabled = TrueTimer2.Enabled = FalseConst jiao = 0Timer1.Interval = 100 - VScroll1.ValueElseCommand2.Caption = "白色齿轮顺时针转" Timer1.Enabled = FalseTimer2.Enabled = TrueTimer2.Interval = 100 - VScroll1.ValueEnd IfEnd SubPrivate Sub Command3_Click()VScroll1.Visible = FalseLabel1.Visible = FalseLabel2.Visible = FalseTimer1.Enabled = FalseTimer2.Enabled = FalseEnd SubPrivate Sub Command4_Click()i = MsgBox("真的要退出?", vbOKCancel + vbQuestion + vbDefaultButton1, "请注意!") If i = 1 ThenEndEnd IfEnd SubPrivate Sub Command5_Click()Unload MeLoad Form2Form3.ShowEnd SubPrivate Sub Form_Load()VScroll1.Visible = FalseCommand4.Visible = FalseLabel1.Visible = FalseLabel2.Visible = FalsePicture1.Visible = FalseCommand2.Visible = False Command3.Visible = FalseEnd SubPrivate Sub Timer1_Timer()Timer1.Interval = 100 - VScroll1.Value Picture1.Cls'开始画第一个齿轮rb1 = 170 / 2 * Cos(PI / 9)ra1 = 190 / 2rf1 = (17 - 2 - 0.5) * 10 / 2Picture1.Scale (-120, -200)-(370, 200) '画渐开线——Picture1.DrawWidth = 1.2Picture1.Circle (0, 0), 2, QBColor(15) 'rk1 = rb1'i = jiao * PI / 180For a1 = 19 / 17 * i + 0 To 2 * PI + 19 / 17 * i Step 2 * PI / 17mn1 = a1 + 14 * PI / 180mm1 = a1 + 12.5 * PI / 180z21 = rf1 * Cos(mn1)z22 = rf1 * Sin(mn1)X1112 = rb1 * Cos(mm1)Y1112 = rb1 * Sin(mm1)Picture1.Line (z21, z22)-(X1112, Y1112), QBColor(15)gk1 = Tan(Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1)) - Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1) '展角与rk的关系b1 = a1 + gk1sb1 = PI * 10 / 2 * Cos(PI / 9) - 10 * 17 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X1111 = rb1 * Cos(b1 - gk1)Y1111 = rb1 * Sin(b1 - gk1)'画齿根圆弧For p1 = a1 - 7 * PI / 180 To a1 - 1 * PI / 180 Step 0.4 * PI / 180z11 = rf1 * Cos(p1)z12 = rf1 * Sin(p1)Picture1.PSet (z11, z12), QBColor(15)Next p1Picture1.Line (z11, z12)-(X1111, Y1111), QBColor(15)For rk1 = rb1 To ra1 Step 0.4gk1 = Tan(Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1)) - Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1) '展角与rk的关系b1 = a1 + gk1sb1 = PI * 10 / 2 * Cos(PI / 9) - 10 * 17 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X1 = rk1 * Cos(b1)Y1 = rk1 * Sin(b1)If b1 = a1 Thenbx1 = X1By1 = Y1Picture1.PSet (bx1, By1), QBColor(15)ElsePicture1.PSet (X1, Y1), QBColor(15)End IfNext rk1sb1 = PI * 10 / 2 * Cos(PI / 9) - 10 * 17 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))w1 = sb1 / rb1For rk1 = rb1 To ra1 Step 0.4gk1 = Tan(Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1)) - Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1) '展角与rk的关系d1 = a1 + w1 - gk1sb1 = PI * 10 / 2 * Cos(PI / 9) - 10 * 17 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X12 = rk1 * Cos(d1)Y12 = rk1 * Sin(d1)If d1 = w1 Thenbx12 = X12By12 = Y12Picture1.PSet (bx12, By12), QBColor(15)ElsePicture1.PSet (X12, Y12), QBColor(15)End IfNext rk1Next a1For k1 = 0 + 19 / 17 * i To 2 * PI + 19 / 17 * i Step 2 * PI / 17For k11 = k1 + gk11 + 4.5 * PI / 180 To k1 + sb1 / rb1 - gk11 - 3.8 * PI / 180 Step 0.3 * PI / 180 x111 = ra1 * Cos(k11)y111 = ra1 * Sin(k11)Picture1.PSet (x111, y111), QBColor(15)Next k11Next k1'第一个齿轮结束'开始画第二个齿轮rb2 = 190 / 2 * Cos(PI / 9)ra2 = (19 + 2) * 10 / 2rf2 = (19 - 2 - 0.5) * 10 / 2'画渐开线——Picture1.Circle (183, 0), 2, QBColor(12)For a2 = 0 + 7.88 * PI / 180 - i To 2 * PI + 7.88 * PI / 180 - i Step 2 * PI / 19 mn2 = a2 - 6.5 * PI / 180mm2 = a2 - 7.5 * PI / 180z2121 = 183 + rf2 * Cos(mn2)z2222 = rf2 * Sin(mn2)X2112 = 183 + rb2 * Cos(mm2)Y2112 = rb2 * Sin(mm2)Picture1.Line (z2121, z2222)-(X2112, Y2112), QBColor(12)X2111 = 183 + rb2 * Cos(a2)Y2111 = rb2 * Sin(a2)'画齿根圆弧For p2 = a2 - 6 * PI / 180 To a2 - 0.8 * PI / 180 Step 0.4 * PI / 180z111 = 183 + rf2 * Cos(p2)z121 = rf2 * Sin(p2)Picture1.PSet (z111, z121), QBColor(12)Next p2Picture1.Line (z111, z121)-(X2111, Y2111), QBColor(12)For rk2 = rb2 To ra2 Step 0.4gk2 = Tan(Atn(Sqr(1 - rb2 / rk2 * rb2 / rk2) / rb2 * rk2)) - Atn(Sqr(1 - rb2 / rk2 * rb2 / rk2) / rb2 * rk2) '展角与rk的关系b2 = a2 + gk2sb2 = PI * 10 / 2 * Cos(PI / 9) - 10 * 19 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X2 = 183 + rk2 * Cos(b2)Y2 = rk2 * Sin(b2)If b2 = a2 Thenbx2 = X2By2 = Y2Picture1.PSet (bx2, By2), QBColor(12)ElsePicture1.PSet (X2, Y2), QBColor(12)End IfNext rk2sb2 = PI * 10 / 2 * Cos(PI / 9) - 10 * 19 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))w2 = sb2 / rb2For rk2 = rb2 To ra2 Step 0.4gk2 = Tan(Atn(Sqr(1 - rb2 / rk2 * rb2 / rk2) / rb2 * rk2)) - Atn(Sqr(1 - rb2 / rk2 * rb2 / rk2) / rb2 * rk2) '展角与rk的关系d2 = a2 + w2 - gk2sb2 = PI * 10 / 2 * Cos(PI / 9) - 10 * 19 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X22 = 183 + rk2 * Cos(d2)Y22 = rk2 * Sin(d2)If d2 = w2 Thenbx22 = X22By22 = Y22Picture1.PSet (bx22, By22), QBColor(12)ElsePicture1.PSet (X22, Y22), QBColor(12)End IfNext rk2'齿根圆圆弧Next a2For k2 = 0 + 7.88 * PI / 180 - i To 2 * PI + 7.88 * PI / 180 - i Step 2 * PI / 19gk22 = Tan(Atn(Sqr(1 - rb2 / ra2 * rb2 / ra2) / rb2 * ra2)) - Atn(Sqr(1 - rb2 / ra2 * rb2 / rk2) / rb2 * ra2)For k22 = k2 + gk22 To k2 + sb2 / rb2 - gk2 Step 0.3 * PI / 180x222 = 183 + ra2 * Cos(k22)y222 = ra2 * Sin(k22)Picture1.PSet (x222, y222), QBColor(12)Next k22Next k2jiao = jiao + 1'第二个齿轮结束End SubPrivate Sub Timer2_Timer()Picture1.ClsTimer2.Interval = 100 - VScroll1.Value'开始画第一个齿轮rb1 = 170 / 2 * Cos(PI / 9)ra1 = 190 / 2rf1 = (17 - 2 - 0.5) * 10 / 2Picture1.Scale (-120, -200)-(370, 200)'画渐开线——Picture1.DrawWidth = 1.2Picture1.Circle (0, 0), 2, QBColor(15)'rk1 = rb1'i = jiao * PI / 180For a1 = 19 / 17 * i + 0 To 2 * PI + 19 / 17 * i Step 2 * PI / 17mn1 = a1 + 14 * PI / 180mm1 = a1 + 12.5 * PI / 180z21 = rf1 * Cos(mn1)z22 = rf1 * Sin(mn1)X1112 = rb1 * Cos(mm1)Y1112 = rb1 * Sin(mm1)Picture1.Line (z21, z22)-(X1112, Y1112), QBColor(15)gk1 = Tan(Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1)) - Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1) '展角与rk的关系b1 = a1 + gk1sb1 = PI * 10 / 2 * Cos(PI / 9) - 10 * 17 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X1111 = rb1 * Cos(b1 - gk1)Y1111 = rb1 * Sin(b1 - gk1)'画齿根圆弧For p1 = a1 - 7 * PI / 180 To a1 - 1 * PI / 180 Step 0.4 * PI / 180z11 = rf1 * Cos(p1)z12 = rf1 * Sin(p1)Picture1.PSet (z11, z12), QBColor(15)Next p1Picture1.Line (z11, z12)-(X1111, Y1111), QBColor(15)For rk1 = rb1 To ra1 Step 0.4gk1 = Tan(Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1)) - Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1) '展角与rk的关系b1 = a1 + gk1sb1 = PI * 10 / 2 * Cos(PI / 9) - 10 * 17 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X1 = rk1 * Cos(b1)Y1 = rk1 * Sin(b1)If b1 = a1 Thenbx1 = X1By1 = Y1Picture1.PSet (bx1, By1), QBColor(15)Picture1.PSet (X1, Y1), QBColor(15)End IfNext rk1sb1 = PI * 10 / 2 * Cos(PI / 9) - 10 * 17 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))w1 = sb1 / rb1For rk1 = rb1 To ra1 Step 0.4gk1 = Tan(Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1)) - Atn(Sqr(1 - rb1 / rk1 * rb1 / rk1) / rb1 * rk1) '展角与rk的关系d1 = a1 + w1 - gk1sb1 = PI * 10 / 2 * Cos(PI / 9) - 10 * 17 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X12 = rk1 * Cos(d1)Y12 = rk1 * Sin(d1)If d1 = w1 Thenbx12 = X12By12 = Y12Picture1.PSet (bx12, By12), QBColor(15)ElsePicture1.PSet (X12, Y12), QBColor(15)End IfNext a1For k1 = 0 + 19 / 17 * i To 2 * PI + 19 / 17 * i Step 2 * PI / 17For k11 = k1 + gk11 + 4.5 * PI / 180 To k1 + sb1 / rb1 - gk11 - 3.8 * PI / 180 Step 0.3 * PI / 180 x111 = ra1 * Cos(k11)y111 = ra1 * Sin(k11)Picture1.PSet (x111, y111), QBColor(15)Next k11Next k1'第一个齿轮结束'开始画第二个齿轮rb2 = 190 / 2 * Cos(PI / 9)ra2 = (19 + 2) * 10 / 2rf2 = (19 - 2 - 0.5) * 10 / 2'画渐开线——Picture1.Circle (183, 0), 2, QBColor(12)For a2 = 0 + 7.88 * PI / 180 - i To 2 * PI + 7.88 * PI / 180 - i Step 2 * PI / 19 mn2 = a2 - 6.5 * PI / 180mm2 = a2 - 7.5 * PI / 180z2121 = 183 + rf2 * Cos(mn2)z2222 = rf2 * Sin(mn2)X2112 = 183 + rb2 * Cos(mm2)Y2112 = rb2 * Sin(mm2)Picture1.Line (z2121, z2222)-(X2112, Y2112), QBColor(12)X2111 = 183 + rb2 * Cos(a2)Y2111 = rb2 * Sin(a2)'画齿根圆弧For p2 = a2 - 6 * PI / 180 To a2 - 0.8 * PI / 180 Step 0.4 * PI / 180 z111 = 183 + rf2 * Cos(p2)z121 = rf2 * Sin(p2)Picture1.PSet (z111, z121), QBColor(12)Next p2Picture1.Line (z111, z121)-(X2111, Y2111), QBColor(12)For rk2 = rb2 To ra2 Step 0.4gk2 = Tan(Atn(Sqr(1 - rb2 / rk2 * rb2 / rk2) / rb2 * rk2)) - Atn(Sqr(1 - rb2 / rk2 * rb2 / rk2) / rb2 * rk2) '展角与rk的关系b2 = a2 + gk2sb2 = PI * 10 / 2 * Cos(PI / 9) - 10 * 19 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X2 = 183 + rk2 * Cos(b2)Y2 = rk2 * Sin(b2)If b2 = a2 Thenbx2 = X2By2 = Y2Picture1.PSet (bx2, By2), QBColor(12)ElsePicture1.PSet (X2, Y2), QBColor(12)End IfNext rk2sb2 = PI * 10 / 2 * Cos(PI / 9) - 10 * 19 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))w2 = sb2 / rb2For rk2 = rb2 To ra2 Step 0.4gk2 = Tan(Atn(Sqr(1 - rb2 / rk2 * rb2 / rk2) / rb2 * rk2)) - Atn(Sqr(1 - rb2 / rk2 * rb2 / rk2)/ rb2 * rk2) '展角与rk的关系d2 = a2 + w2 - gk2sb2 = PI * 10 / 2 * Cos(PI / 9) - 10 * 19 * Cos(PI / 9) * (PI / 9 - Tan(PI / 9))X22 = 183 + rk2 * Cos(d2)Y22 = rk2 * Sin(d2)If d2 = w2 Thenbx22 = X22By22 = Y22Picture1.PSet (bx22, By22), QBColor(12)ElsePicture1.PSet (X22, Y22), QBColor(12)End IfNext rk2'齿根圆圆弧Next a2For k2 = 0 + 7.88 * PI / 180 - i To 2 * PI + 7.88 * PI / 180 - i Step 2 * PI / 19gk22 = Tan(Atn(Sqr(1 - rb2 / ra2 * rb2 / ra2) / rb2 * ra2)) - Atn(Sqr(1 - rb2 / ra2 * rb2 / rk2) / rb2 * ra2)For k22 = k2 + gk22 To k2 + sb2 / rb2 - gk2 Step 0.3 * PI / 180x222 = 183 + ra2 * Cos(k22)y222 = ra2 * Sin(k22)Picture1.PSet (x222, y222), QBColor(12)Next k22Next k2jiao = jiao - 1'第二个齿轮结束End SubPrivate Sub Timer3_Timer()Command1.BackColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256)) Command2.BackColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256)) Command3.BackColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256)) Command4.BackColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256))Command5.BackColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256))End SubPrivate Sub Timer4_Timer()Label1.ForeColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256)) Label2.ForeColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256))End Sub(3)Private Sub Command1_Click()Unload Form3Load Form2Form2.ShowEnd SubPrivate Sub Timer1_Timer()Label1.ForeColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256)) End SubPrivate Sub Timer2_Timer()Command1.BackColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256)) End Sub。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本栏目责任编辑:谢媛媛软件设计开发

ComputerKnowledgeandTechnology电脑知识

与技术

第5卷第30期(2009年10月)

用VB设计汉诺塔动画游戏刘德强(无锡职业技术学院,江苏无锡214024)摘要:汉诺塔问题是程序设计教学中关于递归调用的经典案例。该文介绍了用VB设计汉诺塔动画游戏程序的基本过程,其中重点介绍了用VB的自定义数据类型和图形处理技术设计游戏步点状态记录和动画效果的方法。关键词:VB;汉诺塔;动画中图分类号:TP311文献标识码:A文章编号:1009-3044(2009)30-8460-03

TheDesigningofHanoiTowersAnimationGamebyVBLIUDe-qiang(WuxiInstituteofTechnology,Wuxi214024,China)Abstract:TheHanoiTowersisatypicalcaseofrecursivecallsinprogrammingteaching.Thispaperintroducesthebasicprocessofdesign-ingHanoiTowersanimationgamebyVB,focusesonrecordinggamestatebetweentwostepsanddesigninganimationbyself-defineddatatypeandgraphskillinVB.

KeyWords:VB;Hanoi;animation汉诺塔问题源自印度的一个古老传说,传至现代演变成了汉诺塔游戏:有A、B、C三个垂直杆和若干个大小各不相同的圆片。开始时圆片全部套在A杆上,且从下至上圆片大小依次递减。要求借助B杆,将圆片全部移到C杆上,每次只能移动一片,并且整个过程中三个杆上的圆片都必须保持大的在下小的在上。游戏的难度由开始时放置在A杆上圆片的个数进行控制。

1游戏步点状态记录设计

笔者设计的汉诺塔游戏程序主要包括演示和游戏两方面的功能。演示功能实现的是根据汉诺塔问题算法预先计算出的圆片移动顺序由计算机自行对圆片进行移动;而游戏功能是指计算机通过人机交互界面根据游戏者的实时操作顺序进行圆片的移动。图1是程序运行时界面。无论是演示还是游戏,计算机执行的基本动作元素是相同的,即圆片从一个杆上移动到另一个杆上,这一过程体现在程序设计中就是在新的位置对圆片图形进行重画,它与每个杆的步点状态密切相关。步点状态是指每完成一步操作以后,开始下一步操作之前,一个杆上的圆片数量及各圆片的位置和大小等多个特征综合构成的状态,是多个数据的集合。将开始时圆片数记为n,从初始状态圆片都在A杆上,到终止状态n个圆片移到C杆上,其间每次移动圆片,各杆的步点状态都会发生变化。游戏进程中“记”住各杆的当前步点状态,是实现不断移动圆片的关键。以要移动A杆上的一个圆片到B杆为例:要判断圆片根据规则是否可以移动及圆片移动后放置在B杆的什么位置(y坐标),就必须知道当前B杆上最上端圆片的大小和B杆上当前圆片数量,即B杆的当前步点状态。综合以上分析,游戏步点状态记录是程序设计中的要点。鉴于描述步点状态需要多个数据,且数据间相互关联并构成整体,笔者在设计中采用了自定义数据类型的方法,数据类型名称为circles,所含内容和定义格式如下:TypecirclescountsAsintegerr()AsintegerxAsintegery()AsintegerEndTypecircles类型中,数据成员counts用于记录杆上实际圆片数,r用于记录各圆片的半径,x记录各圆片圆心的x坐标,y记录各圆片

圆心的y坐标。因为每次游戏设置的初始圆片数是不确定的且游戏进程中各杆都可能出现多个圆片,所以数据成员r和y定义为动态数组。数据类型circles定义以后,先使用该类型定义三个实例a、b、c,分别代表A、B、C三个杆的步点状态。语句如下:DimaAscircles,bAscircles,cAscircles当初始圆片数量确定后(记为n),可使用下列语句对A杆的步点状态a进行初始化。

投稿日期:2009-08-22作者简介:刘德强(1965-),江苏靖江人,无锡职业技术学院讲师。

图1运行界面

ISSN1009-3044ComputerKnowledgeandTechnology电脑知识

与技术

Vol.5,No.30,October2009,pp.8460-8462

E-mail:xsjl@cccc.net.cnhttp://www.dnzs.net.cnTel:+86-551-56909635690964

8460软件设计开发本栏目责任编辑:谢媛媛ComputerKnowledgeandTechnology电脑知识

与技术

第5卷第30期(2009年10月)

ReDima.y(n):ReDima.r(n):a.counts=na.x=-330:a.y(1)=-260Fori=1Tona.r(i)=160-8*ia.y(i)=-270+i*45Picture1.Circle(a.x,a.y(i)),a.r(i),vbBlack,,,0.14Nexti语句中,通过对实例a的各成员进行赋值,确定了A杆上圆片的数量、各圆片的大小和位置,并在相应位置画出了代表各圆片的椭圆图形。程序设计中B杆和C杆的步点状态可参照相同方法进行初始化。游戏进程中,当圆片从一个杆上移动到另一个杆上,两杆的步点状态会发生变化,新的步点状态可通过下列语句进行记录,以圆片从A杆移到B杆为例:a.counts=a.counts-1b.counts=b.counts+1b.r(b.counts)=a.r(a.counts+1)Picture1.Circle(b.x,b.y(bcounts)),b.r(b.counts),vbBlack,,,0.14

语句中,成员counts记录两个杆上圆片数量的变化,成员r记录新画椭圆的半径。圆片在三个杆间的移动共分六种情况:分别是A→B、A→C、B→C、B→A、C→A和C→B,其余五种情况新的步点状态记录可采用相同方法。

综上所述,尽管各杆的步点状态需要多个数据进行描述,且在游戏进程中不断变化,采用自定义数据类型的方法可方便地对各杆的当前步点状态进行记录。

2游戏动画效果设计

根据前述,汉诺塔游戏的基本动作元素是圆片从一个杆上移到另一个杆上,如果将移动过程设计成动画,将提高游戏的趣味性和观赏性。和电影原理相似,动画是利用人眼的视觉暂留效应使静止图像或图形产生连续运动和变化效果的一种技术[1],如当相关连的序

列画面以30帧/秒左右的速度播放时,人眼所观察到的变化就是连续的。实现动画效果有两个基本要素:一是序列画面相互关连或相同;二是播放速度合适。在VB程序设计中,实现动画效果可通过在图片或图像控件中以一定的速度装载和卸载关连图像或图形文件序列实现;也可通过以一定的速度对装载了关连图像或图形文件的控件序列的Visible属性进行设置来实现[1];还可以利用VB的画圆(circle)、画线

(Line)等方法在关连位置以一定的速度,以背景色和另一种不同颜色不断交替绘制图形的方法来实现。汉诺塔游戏要表现的动画效果是圆片从一个杆移到另一个杆上的连续移动过程,即同一图形相对屏幕的位移,是一种简单的位移动画[1],笔者在设计过程中,采

用的是使用circle方法在关连位置交替绘制椭圆的方法(参见图1)。以从A杆上向上取出圆片为例,为表现圆片向上连续移动的动画效果,程序代码为:Fork=20To220-a.y(a.counts)Step20Picture1.Circle(a.x,a.y(a.counts)+k),a.r(a.counts),vbBlack,,,0.14delay(delay_m)Picture1.Circle(a.x,a.y(a.counts)+k),a.r(a.counts),&H8000000F,,,0.14Nextk程序执行过程中,每次循环计算机将在同一位置先后画同样大小但颜色不同的椭圆两次,先黑色(vbBlack),再背景色(&H8000000F),两次之间有一定的时间间隔,产生的视觉效果是黑色圆片在该位置先出现后消失,又随循环次数增加,所画椭圆位置会随变量k变化而不断上移,产生的综合视觉效果是黑色圆片连续向上移动。设计过程中,为使圆片的移动看上去更加平滑,所达到的动画效果更加逼真,可对循环语句的步长和延时过程delay中的参数delay_m进行调整。汉诺塔游戏中圆片的移动方向可概括为向上、平移和向下共三种,其余两种可采用相同原理进行动画效果设计。

3演示功能设计

演示功能主要是给游戏者提供操作步骤参考,设计演示功能先要设计汉诺塔问题算法、并依据其计算出移动圆片的顺序。对汉诺塔问题进行分析,将A杆上n个圆片全部移到C杆上,可以分解成以下三个相对容易的新问题:1)先将n-1个圆片,借助C杆,由A杆移到B杆上;

2)再将A杆上留下的1个圆片移到C杆上;

3)接着将B杆上n-1个圆片,借助A杆,移到C杆上。

三个新问题中1个圆片的移动是单步骤就能直接完成的已知操作,而n-1个圆片的移动又可以采用相同方法进一步分解成n-2个圆片和1个圆片的移动。依此类推,经过层层分解,每次分解出的新问题中要移动的圆片数不断减少,最终都将分解成1个圆片

的移动。上述分解过程是典型的递归过程。用递归方法解决问题,在VB程序设计中是通过设计和调用递归Sub过程来实现的。根据上述分析,汉诺塔问题的递归算法可设计为:PrivateSubmoves(nasinteger,pole_aasstring,pole_basstring,pole_casstring)Ifn=1Thenmove_str1=move_str1&pole_a&pole_cElseCallmoves(n-1,pole_a,pole_c,pole_b)Callmoves(1,pole_a,pole_b,pole_c)Callmoves(n-1,pole_b,pole_a,pole_c)

8461

相关文档
最新文档