资源介绍
要求:
本次课程设计利用《软件设计基础-VB》课程中所学到的编程知识和编程技巧,完成具有一定难度和工作量的程序设计题目,帮助学生掌握编程、调试的基本技能,独立完成所布置的任务。
要求:
1、对系统进行功能需求分析
2、设计合理的数据结构和系统框架
3、界面设计美观、清楚、合理
4、编程简练,程序功能齐全,能正确运行
5、具有一定的创新性
6、说明书、流程图要清楚
7、课题完成后必须按要求提交课程设计报告
任务:
题目描述与功能要求
题目描述:“打冰雹”游戏是指从窗口顶部落下多个圆球表示的“冰雹”,用户使用鼠标来指引箭头表示的“枪”瞄准其中一个圆球,单击鼠标射击。如果打中圆球则加分,没打中减分。若累积有5个圆球一直未被击中而落到地面(用水平黑线表示),则失败。用户玩游戏的目标是尽量短的时间内得尽量多的分数,同时避免圆球落地。
功能要求:(1)设计图1.26(课本)所示的窗口界面。程序启动时,自动进入游戏状态,10个不同颜色的圆球从窗口顶部向下运动。用户使用鼠标指向其中一个圆球,然后单击。如果击中圆球则加1分,未击中则减1分,分数显示在“得分”文本框中。“所用时间”文本框中显示当前已用的时间。被击中的圆球立即消失,新的圆球从顶部落下。
(2)要求同时显示10个圆球,每个圆球的颜色和下落速度各不相同。窗口底部的箭头一直指向鼠标指针的方向。单击鼠标射击时,显示一条从箭头发出到达鼠标指针的直线表示子弹轨迹。
(3)程序共有4个难度等级,分别是“简单”、“中等”、“较难”和“高级”。默认的难受为“中等”。不同的等级对应不同的总体下落速度。在游戏过程中,随时可以通过“选择难度”组合框来改变难度级别。
(4)游戏开始时,提供的“能量”数是5。如果有一个圆球落到地面,则减1。当能量为0时,显示如图1.27所示的消息框。然后,程序自动将难度改为“简单”让用户重新开始,这时能量恢复为5,得分从0开始。
(5)圆球落地后立即消失,新的圆球从顶部落下,窗口上始终保持有10个圆球。
游戏过程中,当得分达到25时,显示如图1.28所示的提示;当得分达到50时,显示如图1.29所示的提示;当得分达到100时,显示如图1.30所示的提示,并自动将难度设为“较难”,当得分达到150时,自动将难度设为“高级”。
3.课程设计说明书
⑴功能描述;本题目的程序设计由三个窗体组成。
窗口一:为开始界面,主要实现游戏的开始、退出以及游戏规则介绍功能。
窗体二:为游戏界面,内设置游戏进行,可通过对combol的选择改变难易程度。
窗体三:为结束界面,主要目的,提醒玩家通关成功
(2)详细设计
总体流程图:
各功能模块流程图:
窗体一:开始界面
窗体二:游戏界面
窗体四:结束界面
⑷代码实现
本题目的程序设计由三个窗体组成。分别由五个Timer,五个TextBox,一个ComboBox,七个Line,十个shape十个Label,一个medio player等控件组成。窗体2为主要窗口,它的设计如下:
窗体2中控件列表
序号 控件名称 控件类型 功能
1 Label 标签 对文本框与组合框进行说明
作为提示,装饰界面
2 TextBox 文本框 显示程序运行的结果即得分Text1、剩余能量Text2、所用时间Text3(0)、Text3(1)、Text3(2)的数值
3 ComboBox 组合框 显示选择难度
4 Timer 定时器 在程序运行的过程中不断地累积时间,当达到给定的时间间隔时,自动地引发名为Timer的事件。Timer1控制冰雹下落的并通过combo-click选择不同的难程度掉冰雹的速度,timer2.timer3是记录玩游戏所用时间分别控制秒和毫秒
5
Picture 图片框 通过图片加载,装饰页面picture1是游戏中界面,picture2休息界面
6 Shape 形状 显示多种不同的形状,装饰窗体,这里即圆形
7 Line 直线 在窗体上显示一条直线。
Line2到Line7是做指针用的,Line1是作为冰雹没有打中落下去让冰雹消失
8 medieplayer 播放器 当鼠标击打冰雹时,放出声音
各窗体的代码介绍
form1—开始界面
作用:“进入应用程序”。
所用控件:4个标签,1个时钟,3个command
设计思路:用时钟控制label1的运动。单击command开始按钮可进入后面窗体,退出按钮可关闭窗体,帮助按钮查看游戏规则。
核心代码如下:
窗体1—开始界面
Private Sub Command1_Click()
Form2.Show
Unload Form1
Timer1.Enabled = True’开始按钮,控制游戏的开始
End Sub
Private Sub Command2_Click()
Unload Form1
End Sub’退出按钮,结束游戏
Private Sub Command3_Click()
Dim Y As String
Y = MsgBox(" 从窗口顶部落下多个圆球表示冰雹,用户用鼠标指引箭头表示的枪瞄准其中一个圆球,单击鼠标射击。如果打中圆球加分,没打中减分.若累计有五个圆球一直未被击中落到地面(用水平线表示)则失败。用户玩游戏的目的是在尽量短的时间内得尽量多的分数,同时避免圆球落地 ", 0, "游戏规则")
End Sub’帮助按钮,给予玩家游戏规则
Private Sub Form_Load()
Form1.BackColor = &HFFFF&
Form1.Caption = " 打冰雹"
End Sub
Private Sub Timer1_Timer()
Label1.Left = Label1.Left + 50
If Label1.Left >= Width Then
Label1.Left = 0
End If
End Sub’文字的移动使界面更美观
Form2—游戏界面
作用:“游戏过程”。
所用控件:6个标签,3个时钟,一个combol,10个shape,7条line,一个图片框,2个command。
设计思路:Timer1控制冰雹下落的并通过combo-click选择不同的难易程度。timer2.timer3是记录玩游戏所用时间分别控制秒和毫秒。并且通过6条line组成箭头,作为游戏所用的“枪“通过鼠标XY函数控制。单击command暂停(开始)按钮控制游戏的暂停(开始),退出按钮可关闭窗体。
核心代码如下:
简单 中等
较难 极难
不同等级,改变不同背景图片
窗体2—游戏界面
Dim a As Single, b As Single, j As Integer, k As Integer
Dim df As Integer
Sub begin(ByVal i As Integer)
For i = 0 To 9
Shape1(i).FillStyle = 0
Shape1(i).FillColor = Rnd * &HFFFFFF
Shape1(i).Top = Rnd * (-600)
Shape1(i).Left = Rnd * 8000 + 500
Next '定义一个重新生成球的过程
End Sub
Private Sub Combo1_click()
If Combo1.Text = "简单" Then
Picture1.Picture = LoadPicture(App.Path + "\背景图片\简单.jpg")
Timer1.Interval = 150
begin i
df = 0
Text2.Text = 0 '当游戏难度变为简单时分数清零
ElseIf Combo1.Text = "中等" Then
Picture1.Picture = LoadPicture(App.Path + "\背景图片\中等.jpg")
Timer1.Interval = 100
begin i
ElseIf Combo1.Text = "较难" Then
Picture1.Picture = LoadPicture(App.Path + "\背景图片\游戏界面.jpg")
Timer1.Interval = 50
begin i
ElseIf Combo1.Text = "高级" Then
Picture1.Picture = LoadPicture(App.Path + "\背景图片\极难.jpg")
Timer1.Interval = 20
begin i
End If '随着等级的增加,改变加载背景图片,时间间隔变短,难度增加
End Sub
Private Sub Timer1_Timer() '对球体下落的控制
For i = 0 To 9
Shape1(i).Top = Shape1(i).Top + Int(Rnd * 40)
If Shape1(i).Top > Picture1.ScaleHeight Then
Shape1(i).Top = -500
Shape1(i).Left = Int(Rnd * 9000)
Text2.Text = Text2.Text - 1 '冰雹掉落到下限时重新从上边掉落,并且每掉落一个冰雹能量减一
If Text2.Text = 0 Then
m = MsgBox("你失败了,别灰心,降低难度,请重来!", 64, "shot")
Combo1.Text = "简单"
Text2.Text = 5
df = 0
Text1.Text = 0
Text3(0).Text = 0
Text3(1).Text = 0
Text3(2).Text = 0
End If
End If
Next i
End Sub'当能量为零时难度降低,并且分数和能量,时间重新更新
Private Sub Timer2_Timer()Text3(0).Text = Text3(0) + 1
Timer3.Enabled = False
If Text3(0).Text = 60 Then
Text3(0).Text = 0
Timer2.Enabled = True
Text3(1).Text = Text3(1) + 1
End If
If Text3(1).Text = 60 Then
Timer3.Enabled = True
Text3(1).Text = 0
Text3(0).Text = Text3(0) + 1
End If '使用时间的控制,
End Sub
Private Sub picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
a = 4680: b = 4980: c = 4980 - 3780: d = Atn((4680 - 4560) / (4980 - 4620))
e = Atn((4680 - 4440) / (4980 - 4620)): f = Sqr(120 ^ 2 + 720 ^ 2): g = Sqr(240 ^ 2 + 720 ^ 2)
Dim sng1 As Single, sng2 As Single
If X <> a Then
If X > a Then
sng1 = Atn((b - Y) / (X - a))
sng2 = d + sng1: sng4 = e + sng1
Line3.X2 = a + g * Cos(sng4): Line3.Y2 = b - g * Sin(sng4)
Line6.X1 = a + f * Cos(sng2): Line6.Y1 = b - f * Sin(sng2)
sng3 = sng1 - d: sng5 = sng1 - e
Line4.X2 = a + g * Cos(sng5): Line4.Y2 = b - g * Sin(sng5)
Line7.X1 = a + f * Cos(sng3): Line7.Y1 = b - f * Sin(sng3)
Line3.X1 = a + c * Cos(sng1): Line3.Y1 = b - c * Sin(sng1)
End If
If X < a And Y < b Then
sng1 = Atn((b - Y) / (a - X))
sng2 = sng1 - d: sng4 = sng1 - e
sng3 = sng1 + d: sng5 = sng1 + e
Line4.X2 = a - g * Cos(sng5): Line4.Y2 = b - g * Sin(sng5)
Line3.X2 = a - g * Cos(sng4): Line3.Y2 = b - g * Sin(sng4)
Line7.X1 = a - f * Cos(sng3): Line7.Y1 = b - f * Sin(sng3)
Line6.X1 = a - f * Cos(sng2): Line6.Y1 = b - f * Sin(sng2)
Line3.X1 = a - c * Cos(sng1): Line3.Y1 = b - c * Sin(sng1)
End If
If X < a And Y > b Then
sng1 = Atn((b - Y) / (X - a))
sng2 = sng1 + d: sng4 = sng1 + e: sng3 = sng1 - d: sng5 = sng1 - e
Line4.X2 = a - g * Cos(sng5): Line4.Y2 = b + g * Sin(sng5)
Line3.X2 = a - g * Cos(sng4): Line3.Y2 = b + g * Sin(sng4)
Line7.X1 = a - f * Cos(sng3): Line7.Y1 = b + f * Sin(sng3)
Line6.X1 = a - f * Cos(sng2): Line6.Y1 = b + f * Sin(sng2)
Line3.X1 = a - c * Cos(sng1): Line3.Y1 = b + c * Sin(sng1)
End If
Line5.X2 = Line4.X2: Line5.Y2 = Line4.Y2
Line4.X1 = Line3.X1: Line4.Y1 = Line3.Y1
Line2.X2 = Line6.X1: Line2.Y2 = Line6.Y1
Line5.X1 = Line7.X1: Line5.Y1 = Line7.Y1
Line2.X1 = Line3.X2: Line2.Y1 = Line3.Y2
End If
For int1 = 0 To 9
a = Shape1(int1).Top + 250
b = Shape1(int1).Left + 250
If (X - b) ^ 2 + (Y - a) ^ 2 < 250 ^ 2 Then
Picture1.Line (b - 200, a)-(b + 200, a), vbRed
Picture1.Line (b, a - 200)-(b, a + 200), vbRed
Picture1.DrawWidth = 2
End If
Next int1 '通过计算求出关于鼠标X Y,关于箭头所成夹角的函数,然后进行对line2到line7的控制,使图中所画箭头随着鼠标指针在游戏界面的移动而改变方向
End Sub
Private Sub picture1_Mousedown(Button As Integer, Shift As Integer, X As Single, Y As Single)
For int1 = 0 To 9
a = Shape1(int1).Top + 250
b = Shape1(int1).Left + 250 '确立所画圆的圆心
If (X - b) ^ 2 + (Y - a) ^ 2 < 250 ^ 2 Then
Shape1(int1).Top = -500
Shape1(int1).Left = Rnd * 9000 '确定鼠标单击在冰雹上边
df = df + 1
Text1.Text = df '打中一次得一分
If df = 25 Then
int2 = MsgBox("好样的,继续努力", 64, "shot") '得分到25时给予鼓励
Combo1.Text = "中等"
Timer1.Interval = 100
ElseIf df = 50 Then
int3 = MsgBox("太棒了,再射中50个你就过关了,努力啊!", 64, "shot")
Text2.Text = 15
ElseIf df = 100 Then
int4 = MsgBox("恭喜你过关了,增加难度,再继续!", 64, "shot") '得分到100时升级难度
Combo1.Text = "较难"
Timer1.Interval = 50
Picture1.Picture = LoadPicture(App.Path + "\背景图片\游戏界面.jpg")
ElseIf df = 150 Then
int5 = MsgBox("恭喜你过关了,增加难度,再继续!", 64, "shot") '得分到150时升级难度
Combo1.Text = "高级"
Timer1.Interval = 30
Picture1.Picture = LoadPicture(App.Path + "\背景图片\极难.jpg")
ElseIf df = 200 Then
Form3.Show
Unload Me
End If
df = df + 1
End If
Next int1
Picture1.Line (Line4.X1, Line4.Y1)-(X, Y), vbRed '打中冰雹的能量光束
df = df - 1
Text1.Text = df
End Sub
Private Sub picture1_Mouseup(Button As Integer, Shift As Integer, X As Single, Y As Single)
Picture1.Cls '鼠标松开时刷新界面使能量光束消失
End Sub
Form3—结束界面
作用:“游戏通关结束提醒”。
所用控件:2个标签,1个时钟,2个command
窗体3---结束界面
核心代码
Private Sub Command1_Click()
Form2.Show
Unload Me
End Sub’返回游戏,重新开始
Private Sub Command2_Click()
Unload Me’结束游戏
End Sub
Private Sub Timer1_Timer()
Label1.Left = Label1.Left + 50
If Label1.Left >= Form3.Width Then
Label1.Left = 0
End If
End Sub’美化窗体
4.课程设计成果
游戏过程界面
休息图片的创建可以使游戏暂停时,鼠标无法再继续击打冰雹
5.程序调试过程
程序的开始界面和结束界面编得还是很顺利的,可是到了游戏界面,就被遇到了很多问题.
问题1:如何实现10个小球的随机输出和下落。
问题2:如何判断鼠标点到圆时,圆的消失以及得分数的增加。
问题3:如何控制由6条线箭头组成的箭头随鼠标的移动。
问题4,如何定义随着不同等级的开始,小球由初始化状态下落
解决方法
问题1、在图书馆里我查了很多的资料,看了一些类似于这类游戏的程序,并且分析rand于控件数组的使用,最终解决了10个小球的随机输出问题。在关于vb教程指导这本书里,我知道了top可以控制控件的高度,再结合timer控件,解决了小球下落问题。
问题2、课本里对鼠标控件的介绍很少,可是这个程序对鼠标要求很高。我翻阅了大量关于mouse控件的书籍,了解它的属性与使用方法。解决了问题2
问题3、这个是我认为本程序里最难的部分。很长的一段时间编程卡在这里毫无进展。通过网络我查阅了很多资料,并且寻找一些VB编程好的同学进行指导才解决这个问题。
问题4、课本里对子过程的详细介绍让我很容易的解决了这个问题
6.设计问题的不足和改进方案
问题1:游戏无游戏介绍。
改进方案:在在开始界面上加入帮助按钮,通过msgbox提示出所需要信息。
问题2:当我自己用Shape所构造出的箭头,很难用鼠标控制它的移动。
改进方案:利用代码构建箭头
Private Sub Form_Load()
Line7.X1 = 4800
Line7.X2 = 4680
Line7.Y1 = 4260
Line7.Y2 = 4980
Line6.X1 = 4560
Line6.X2 = 4680
Line6.Y1 = 4260
Line6.Y2 = 4980
Line5.X1 = 4800
Line5.X2 = 4920
Line5.Y1 = 4260
Line5.Y2 = 4260
Line4.X1 = 4680
Line4.X2 = 4920
Line4.Y1 = 3780
Line4.Y2 = 4260
Line3.X1 = 4680
Line3.X2 = 4440
Line3.Y1 = 3780
Line3.Y2 = 4260
Line2.X1 = 4440
Line2.X2 = 4560
Line2.Y1 = 4260
Line2.Y2 = 426
Sub End
问题3:当能量为零的时候,时间无法重新开始。
改进方案:利用if•••then 判断
Private Sub Timer1_Timer()
If Text2. Text = 0 Then
m = MsgBox("你失败了,别灰心,降低难度,请重来!", 64, "shot")
Combo1.Text = "简单"
Text2.Text = 5
df = 0
Text1.Text = 0 '当能量为零时难度降低,并且分数和能量重新更新
Text3(0).Text = 0
Text3(1).Text = 0
Text3(2).Text = 0
End If
End Sub
问题4、游戏无止境的进行,没有通关结束。
解决方案:判断得分,当df=200时,结束游戏,关闭游戏界面,弹出结束界面。
Private Sub picture1_Mousedown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If df = 200 Then
Form3.Show
Unload Me
End If
End Sub
问题5、当得分为200时弹出窗体3,然而窗体三返回窗体二时,原来的时间、分数等数据为清零。
解决方案代码如下:
ElseIf df = 200 Then
begin i
df = 0
Form3.Show
Unload Me
End If
问题6、击打冰雹没有声音,枯燥乏味
解决方案:利用mediaplayer控件加入声音,当鼠标点击冰雹时,发出嘣嘣声。
7.课程设计心得
在刚拿到这个课题的时候,觉得很迷茫,不知道从什么地方下手。脑袋里只有一些关于VB的零碎知识,不知道如何系统的组织起来结合到自己的程序中去。花了两天时间呆在图书馆里,看了一些游戏类的小程序,慢慢的才开始有了自己的思路。可是,对该程序需要掌握的知识点认识不足,让我的编程不得不半路夭折,那一刻我才意识到,不能打没用准备的战。我重新回到课本,把该课题需要涉及到的知识点认真的看了一遍,再通过其它查阅资料,了解相关知识,才投入到系统的编程中。这个过程中有难点,也有停滞不前的时候,但最终都克服了。当程序最终成型时,才能真正明白,所有付出都是值得的。
编程的这一个月,我觉得我学到的知识比这一学期还多。也从中明白了,遇事要冷静,学会思考去解决问题。更重要的是,学会了细心。编程的过程中不允许有一点差错,那怕是一个字符,或一个标点都可能让该程序达不到预想中的效果。我想这不仅仅是是一个作业,也是一个对人生的学习。在今后的人生道路上,我会更勇敢的直视困难,并且做到一丝不苟
8.附录
9.参考文献
1、陈明锐.Visual Basic程序设计及应用教程.北京:高等教育出版社,2008.12
2、,赵东、《零基础Visual Basic》:机械工程出版社2007、12
- 上一篇: 易语言程序免安装版下载
- 下一篇: Unity 屏幕震动效果