文件名称:打冰雹游戏源程序
文件大小:743B
文件格式:VBP
更新时间:2016-07-05 17:53:44
打冰雹
要求: 本次课程设计利用《软件设计基础-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