VB小游戏实验报告.docx
《VB小游戏实验报告.docx》由会员分享,可在线阅读,更多相关《VB小游戏实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
![VB小游戏实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/27/51770564-8f60-490b-adbe-9be6413a0b75/51770564-8f60-490b-adbe-9be6413a0b751.gif)
VB小游戏实验报告
VB
动
画
设
计
与
制
作
姓名:
张晓红
学号:
41041X14
游戏题目:
弹球游戏
1.设计思想:
设计一个弹球游戏,使其在向上或左右方向碰壁反弹,下部有一可左右水平移动的挡板,当小球接触挡板时,小球反弹,否则小球出界,即游戏失败,小球每接触次挡板,加十分,当得分是20的倍数时,挡板缩短,小球移动加快,致使难度增加。
2.窗体设计的属性
名称是窗体的标识名,代码中称它为Name值为:
Form1
BackColor:
pink。
BorderStyle:
Button
Caption:
弹球游戏。
ControlBox:
设置窗体标题栏上是否具有控制菜单栏及按钮。
Enabled:
true
Height:
200
Width:
150
Visible:
True。
WindowsState:
原形。
Icon:
设置窗体标题栏上的图标。
Picture:
给窗体配上漂亮的位图。
特别要注意的是:
窗体的Name和Caption属性,虽然缺省值相同,都是Form1,但实际意义却不一样。
Caption指的窗体标题栏上的文字,Name指这个窗体的对象名,千万不能混淆。
3.动画的代码
Dimtime%,key%,score%,a#,y#
PrivateSubCommand2_Click()
Line1.X1=1320
Line1.X2=3000
Timer1.Interval=100
Label1.Caption=0
Timer2.Enabled=False
Timer1.Enabled=False
Label4.Caption=""
score=-10
time=0
Shape1.Left=(Line1.X1+Line1.X2)/2'球位置初始化
Shape1.Top=Line1.Y1-Shape1.Height
EndSub
PrivateSubForm_Load()
Line1.X1=1320
Line1.X2=3000
Timer1.Interval=100
Label1.Caption=""
Timer2.Enabled=False
Label4.Caption=""
score=-10
time=0
Shape1.Left=(Line1.X1+Line1.X2)/2
Shape1.Top=Line1.Y1-Shape1.Height'游戏初始化
EndSub
PrivateSubPicture1_KeyDown(KeyCodeAsInteger,ShiftAsInteger)
key=KeyCode
SelectCaseKeyCode
Case37'如果按下左箭头,使板子向左移动
IfLine1.X1<=0Then
Line1.X1=0
Else
Line1.X1=Line1.X1-90
Line1.X2=Line1.X2-90
EndIf
Case39'如果按下右箭头,使板子向右移动
IfLine1.X2>=4575Then
Line1.X2=4575
Else
Line1.X1=Line1.X1+90
Line1.X2=Line1.X2+90
EndIf
EndSelect
EndSub
PrivateSubCommand1_Click()
Dimm%,n%
Picture1.SetFocus
Timer1.Enabled=True
Timer2.Enabled=True
Randomize
m=Int(Rnd*1)+0
Ifm=0Then
Randomize
a=Int(Rnd*(46*3.1416/180))+30*3.1416/180
y=100*Abs(Tan(a))
Else:
Randomize
a=Int(Rnd*(46*3.1416/180))+105*3.1416/180'平移移动动量和我竖直移动的夹角
y=100*Abs(Tan(a))‘确定单位时间内水平移动量,求出竖直移动量
EndIf
EndSub
PrivateSubCommand3_Click()
IfCommand3.Caption="暂停"Then
Timer1.Enabled=False
Timer2.Enabled=False
Label5.Visible=True
Command1.Enabled=False
Command2.Enabled=False
Command3.Caption="继续"
Else
Picture1.SetFocus
Timer1.Enabled=True
Timer2.Enabled=True
Label5.Visible=False
Command1.Enabled=True
Command2.Enabled=True
Command3.Caption="暂停"
EndIf
EndSub
PrivateSubPicture1_KeyUp(KeyCodeAsInteger,ShiftAsInteger)
key=KeyAscii
EndSub
PrivateStaticSubTimer1_Timer()
Dimn%,m%,i%
IfShape1.Left<0Then
n=0
EndIf
IfShape1.Left>4200Then'使球碰壁反弹的条件
n=1
EndIf
SelectCase(n)
Case0
Shape1.Left=Shape1.Left+100
Case1
Shape1.Left=Shape1.Left-100
EndSelect
IfShape1.Top+Shape1.Height>=Line1.Y1AndShape1.Left<=(Line1.X2-175)AndShape1.Left>=(Line1.X1-200)Then
m=0'球遇到挡板反弹的条件
score=score+10
Label1.Caption=Str(score)+"分"
IfscoreMod20=0AndTimer1.Interval>=10Then'当得分是20的倍数时,挡板的长度减少
Line1.X1=Line1.X1+20
Line1.X2=Line1.X2-20
Timer1.Interval=Timer1.Interval–3'当得分是20的倍数时,间隔时间减少
EndIf
EndIf
IfShape1.Top<0Then
m=1
EndIf
SelectCase(m)
Case0
Shape1.Top=Shape1.Top-y
Case1
Shape1.Top=Shape1.Top+y
EndSelect
IfShape1.Top>Line1.Y1Then
Timer1.Enabled=False
i=MsgBox("你输了!
",vbInformation,"结果")
Ifi=1Then
Line1.X1=1320
Line1.X2=3000
Timer1.Interval=100
Label1.Caption=0
Timer2.Enabled=False
Label4.Caption=""
score=-10
time=0
Shape1.Left=(Line1.X2+Line1.X1)/2
Shape1.Top=Line1.Y1-Shape1.Height'游戏失败后重新初始化
EndIf
EndIf
IfTimer1.Interval<=10Then'游戏完成的条件
Shape1.Left=(Line1.X1+Line1.X2)/2
Label1.Caption="0"
Label4.Caption=""
MsgBox"祝贺你,游戏完成!
!
!
"
Timer1.Enabled=False
Timer2.Enabled=False
Timer1.Enabled=flase
Timer1.Interval=100
score=-10
time=0
Shape1.Left=(Line1.X1+Line1.X2)/2
Shape1.Top=Line1.Y1-Shape1.Height'游戏通过后重新初始化
EndIf
EndSub
PrivateSubTimer2_Timer()
time=time+1
Label4.Caption=Str(time)+"秒"
EndSub
4.动画的效果
(游戏运行初始化)
(游戏运行)
(游戏暂停)
(游戏失败)
5.动画的说明:
⑴每次开始游戏时,小球发射角度随机(使小球每次向不同方向发射);
所以定义一个角度变量a和高度变量y,每次运行时随机出一个范围在[30°,75°]或[105°,150°]的角a,确定小球相对于“容器”(left属性),利用三角函数(y=tan(a)*shape1.left),计算出y值。
由此随机出每次运行时小球的发射角度。
⑵小球接触挡板致使加分的条件;
小球相对于“容器”高度位置(shape1.top)加上小球直径(shape1.height)>=挡板的位置(line1.Y1),小球相对于“容器”左右位置(shape1.left)<=挡板右端点的位置(line1.X2)且>=挡板左端点的位置(line1.X1),满足以上条件,判定小球接触挡板被反弹。
⑶游戏运行时小球和挡板的初始化;
当游戏结束,失败,通过后,重新设置挡板左端点和右端点位置(line1.X1和line1.X2),小球位置重设为Shape1.Left=(Line1.X1+Line1.X2)/2;Shape1.Top=Line1.Y1-Shape1.Height。
Time1的时间间隔设为100,得分和时间(score;time)返回初值。
⑷如何使挡板进行左右移动。
采用keydown事件,进行选择判断,向左(右)移动时,板左右端点同时减去(加上)90进行移动,从而实现板的左右移动。