VB语言程序设计课程设计报告
(2010-2011学年 第二学期)
系 (部) 专业班级 学生姓名 学号/序号 指导教师 完成时间
机械系 机电专60901 徐卯卯 200961924 / 36 牧青/助教 第18周
一 、功能描述
游戏者通过键盘的上下左右方向键控制蛇头的移动方向,回车键暂停/继续,通过PAGE UP 加速,PAGE DOWN 减速来控制蛇的移动速度。游戏的目的是使蛇吃到某个数字,一共有5个数字,会随机出现在不同位置。比如当蛇持刀数字3,则蛇增加3节。游戏过程中不得碰撞到墙壁或自己身体,否则游戏结束。等待下一次游戏开始。吃的过程中当蛇吃到一数字之后,背景会随机改变。 二、概要设计 1,功能模块
贪吃蛇 控制 环境设置 开始/暂停 调节控制 结束 图1:贪吃蛇游戏功能模快 第 1 页 (页码从正文开始,居中)
2.界面设计
(1)参照程序运行界面,蛇的身体可由shape控件数组构成,25X25的棋盘也设计成由line控件数组构成。程序设计界面如图2.
图2,贪吃蛇游戏界面设计
三、详细设计 一
(1)棋局的格局,趟厕所的初始位子,以及5个数字的随机位置,都需要在游戏窗体加载时完成。其中蛇的身体由shape控件数组实现,使用load语句来改变数组长度从而实现对蛇的身体长度的增加。
(2)游戏开始后,使用Timerl控件对象来实现蛇的自动爬行,使用Timer2控件对象则表示游戏连续运行时间。
第 2 页 (页码从正文开始,居中)
二
1.修改ShowNumber自定义过程,当某个数字被蛇吃后,重新出现时,背景颜色可以随之改变。
Numfood(m).BackColor = QBColor(Int(Rnd * 14 + 1)) /吃掉的数字再出现则颜色随机改变。
form1.BackColor = RGB(Int(255 * Rnd + 1), Int(255 * Rnd + 1), Int(255 * Rnd + 1) /吃掉数字之后背景颜色随机改变。
2.用Form-KeyDown事件过程添加代码,使得游戏用户可以俺‘PGUP’ ‘PGDN“键
分别来加快和减慢贪吃蛇的行进速度 Case 33
Timer1.Interval = Timer1.Interval * 0.5 /速度每次减小0.5倍 Case 34
Timer1.Interval = Timer1.Interval * 1.5 /速度每次增加1.5倍
3.通过菜单编辑器 ,编辑一个‘级别’的菜单。使之通过选择级别来改变贪吃蛇的运行速度。
Private Sub ji_Click(Index As Integer) /定义ji Select Case Index Case 1
Timer1.Interval = 300 /速度一级 interval为300 Case 2
Timer1.Interval = 200 /速度二级 Case 3
Timer1.Interval = 100 /速度三级 Case 4
Timer1.Interval = 50 /速度四级 Case 5
Timer1.Interval = 20 /速度五级 End Sub
第 3 页 (页码从正文开始,居中)
四、效果分析以及设计方案的完善 1.游戏的开始界面
图1,游戏按回车键会开始游戏
第 4 页 (页码从正文开始,居中)
2.游戏运行界面
图2. 通过上下左右来控制蛇的运动方向
第 5 页 (页码从正文开始,居中)
3.游戏过程中之背景及数字颜色变换
图3,颜色变换
第 6 页 (页码从正文开始,居中)
4.游戏中级别的选择
图4. 可以通过级别的选择来改变速度
5.游戏结束
图6.可以通过按回车键继续游戏
第 7 页 (页码从正文开始,居中)
五、心得体会
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
通过了这一周的VB课程设计,我学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次自己做一个程序,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。通过这次课程设计之后,一定把以前所学过的知识重新温故。
程序设计师需要大量的时间去动手练习才能体验到它的内涵,同时还需要用心去投入,时间和感情花下去之后,的确慢慢的感受到有所收获了,而却也噶据我到了一点点的乐趣了。可能是一个良性循环的开始吧,相信以后会做的更好的。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,但是在老师和同学的帮助下终于解决。在此向老师还有给过我帮助的同学们表示忠心的感谢!
六、参考文献
【1】邵洁 《visual basic程序设计》 [东南大学出版社],第四版 【2】邵洁 《 visual basic实验与测试》 [东南大学出版社],第四版 【3】沈被娜 留祖照 《计算机软件技术基础》
【4】孙家广等,《计算机图形学》 清华大学出版社
【5】陈元琰编著.《计算机图形学实用技术》 北京科学出版社 【6】和青芳著.计算机图形学原理及算法教程.清华大学出版社
第 8 页 (页码从正文开始,居中)
附 录
程序源代码
Option Explicit Option Base 1
Dim snakebodynum As Integer Dim snakemoveDirect() As Integer Const handw As Integer = 300
Dim numx(5) As Integer, numy(5) As Integer Dim time_past As Integer Dim replay As Boolean Sub shownumberall() Dim i As Integer, j As Integer Dim k As Integer, m As Integer Dim f As Boolean Randomize For m = 1 To 5 Do
i = Int(Rnd * 24) j = Int(Rnd * 24) f = True
For k = 1 To snakebodynum
If i = Int(Snakebody(k).Left / handw) And j = Int(Snakebody(k).Top / handw) Then f = False Exit For End If Next
第 9 页 (页码从正文开始,居中)
For k = 1 To m - 1
If i * handw = Numfood(k).Left And j * handw = Numfood(k).Top Then f = False Exit For End If Next
If f = True Then Exit Do End If Loop numx(m) = i numy(m) = j
Numfood(m).Left = numx(m) * handw Numfood(m).Top = numy(m) * handw Next End Sub
Sub shownumber(m As Integer)
Dim i As Integer, j As Integer, k As Integer, f As Boolean Randomize Do
i = Int(Rnd * 24) j = Int(Rnd * 24) f = True
For k = 1 To snakebodynum
If i = Int(Snakebody(k).Left / handw) And j = Int(Snakebody(k).Top / handw) Then f = False Exit For End If
第 10 页 (页码从正文开始,居中)
Next For k = 1 To 5
If i * handw = Numfood(k).Left And j * handw = Numfood(k).Top Then f = False Exit For End If Next
If f = True Then Exit Do End If Loop numx(m) = i numy(m) = j
Numfood(m).Left = numx(m) * handw Numfood(m).Top = numy(m) * handw
Numfood(m).BackColor = QBColor(Int(Rnd * 14 + 1))
form1.BackColor = RGB(Int(255 * Rnd + 1), Int(255 * Rnd + 1), Int(255 * Rnd + 1)) End Sub
Private Sub Form_Load() Dim i As Integer Height = 7935 Width = 7600 time_past = 0 If replay Then For i = 25 To 2 Step -1 Unload LineX(i) Unload LineY(i) Next
第 11 页 (页码从正文开始,居中)
For i = snakebodynum To 2 Step -1 Unload Snakebody(i) Next
ReDim snakemoveDirect(1) End If
snakebodynum = 10 For i = 2 To 25 Load LineX(i)
LineX(i).Y1 = i * handw LineX(i).Y2 = i * handw LineX(i).Visible = True Load LineY(i)
LineY(i).X1 = i * handw LineY(i).X2 = i * handw LineY(i).Visible = True Next
Snakebody(1).Top = 0 Snakebody(1).Left = 0 For i = 2 To snakebodynum Load Snakebody(i)
Snakebody(i).FillColor = &H80FF80 Snakebody(i).Visible = True Next
For i = 1 To snakebodynum
Snakebody(i).Left = handw * snakebodynum - i * handw Next
ReDim snakemoveDirect(snakebodynum) Call shownumberall
第 12 页 (页码从正文开始,居中)
End Sub
Private Sub form_keydown(keycode As Integer, shift As Integer) Select Case keycode Case 37 'left
If snakemoveDirect(1) <> 0 Then snakemoveDirect(1) = 2 Case 38 'up
If snakemoveDirect(1) <> 1 Then snakemoveDirect(1) = 3 Case 39 'right
If snakemoveDirect(1) <> 2 Then snakemoveDirect(1) = 0 Case 40 'down
If snakemoveDirect(1) <> 3 Then snakemoveDirect(1) = 1 Case 13
Timer1.Enabled = Not Timer1.Enabled Case 33
Timer1.Interval = Timer1.Interval * 0.5 Case 34
Timer1.Interval = Timer1.Interval * 1.5 If Not Timer1.Enabled Then form1.Caption = \"贪吃蛇(暂停)\" Timer2.Enabled = False Else
form1.Caption = \"贪吃蛇(运行)\" Timer2.Enabled = True End If End Select End Sub
Private Sub ji_Click(Index As Integer)
第 13 页 (页码从正文开始,居中)
Select Case Index Case 1
Timer1.Interval = 300 Case 2
Timer1.Interval = 200 Case 3
Timer1.Interval = 100 Case 4
Timer1.Interval = 50 Case 5
Timer1.Interval = 20 End Sub End Sub
Private Sub timer1_timer()
Dim i As Integer, f As Boolean, m As Integer, d As Integer, r As Boolean For m = 1 To 5
If Int(Snakebody(1).Left / handw) = numx(m) And Int(Snakebody(1).Top / handw) = numy(m) Then
If Snakebody(snakebodynum).Left > Snakebody(snakebodynum - 1).Left Then d = 0
ElseIf Snakebody(snakebodynum).Left < Snakebody(snakebodynum - 1).Left Then d = 1
ElseIf Snakebody(snakebodynum).Top > Snakebody(snakebodynum - 1).Top Then d = 2 Else d = 3
第 14 页 (页码从正文开始,居中)
End If For i = 1 To m
snakebodynum = snakebodynum + 1 Load Snakebody(snakebodynum)
Snakebody(snakebodynum).FillColor = &H80FF80 Select Case d Case 0
Snakebody(snakebodynum).Left = Snakebody(snakebodynum - 1).Left + handw Snakebody(snakebodynum).Top = Snakebody(snakebodynum - 1).Top Case 1
Snakebody(snakebodynum).Left = Snakebody(snakebodynum - 1).Left - handw Snakebody(snakebodynum).Top = Snakebody(snakebodynum - 1).Top Case 2
Snakebody(snakebodynum).Left = Snakebody(snakebodynum - 1).Left Snakebody(snakebodynum).Top = Snakebody(snakebodynum - 1).Top + handw Case 3
Snakebody(snakebodynum).Left = Snakebody(snakebodynum - 1).Left Snakebody(snakebodynum).Top = Snakebody(snakebodynum - 1).Top - handw End Select
ReDim Preserve snakemoveDirect(snakebodynum)
snakemoveDirect(snakebodynum) = snakemoveDirect(snakebodynum - 1) Snakebody(snakebodynum).Visible = True Next f = True Exit For End If Next
If f Then Call shownumber(m)
第 15 页 (页码从正文开始,居中)
For i = 1 To snakebodynum Select Case snakemoveDirect(i) Case 0
Snakebody(i).Left = Snakebody(i).Left + handw Case 1
Snakebody(i).Top = Snakebody(i).Top + handw Case 2
Snakebody(i).Left = Snakebody(i).Left - handw Case 3
Snakebody(i).Top = Snakebody(i).Top - handw End Select Next
For i = snakebodynum To 2 Step -1
snakemoveDirect(i) = snakemoveDirect(i - 1) Next
If Snakebody(1).Left < 0 Or Snakebody(1).Top < 0 Or Snakebody(1).Left + handw > handw * 25 Or Snakebody(1).Top + 2 * handw > handw * 25 Then Timer1.Enabled = False Timer2.Enabled = False
MsgBox \"GAME OVER 笨蛋卯卯!加油!!!\贪吃蛇\" r = True End If
For i = 2 To snakebodynum
If Snakebody(1).Left = Snakebody(i).Left And Snakebody(1).Top = Snakebody(i).Top Then Timer1.Enabled = False Timer2.Enabled = False
MsgBox \"GAME OVER 笨蛋卯卯!加油!!\贪吃蛇\" r = True
第 16 页 (页码从正文开始,居中)
End If Next
If r Then Caption = \"贪吃蛇(暂停)\": replay = True: Call Form_Load
第 17 页End Sub
(完)
(页码从正文开始,居中)
因篇幅问题不能全部显示,请点此查看更多更全内容