vb课程设计_vb课程设计完整版
vb课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“vb课程设计完整版”。
Visual Basic课程设计报告
题目1: 贪吃蛇 难度:**** 题目2: 难度: 指导教师:
姓 名: 学 号: 专 业: 班 级: 学 院:
日 期:
目录
1、题目简介...................................................................................................错误!未定义书签。
2、设计思路与总体方案.................................................................................................................3
2.1 窗体Form1.vb【设计】...................................................................................................3 2.2窗体Form2.vb【设计】..................................................................................................11 2.3窗体Form3.vb【设计】..................................................................................................14 2.4 窗体Form4.vb【设计】.................................................................................................14 2.5窗体Form5.vb【设计】....................................................................................................2.6窗体Form6.vb【设计】..................................................................错误!未定义书签。2.6 标准模块..........................................................................................................................143、设计过程遇到的主要问题及解决方法...................................................................................164、设计中尚存的不足分析...........................................................................................................165、心得体会...................................................................................................................................176、参考文献...................................................................................................................................17
1.题目简介
贪吃蛇是一种很流行的电子游戏。如图1所示,一条蛇在棋盘状的格子平面上爬行,由键盘控制其转弯;格子上随机出现五个数字(1~5),当蛇的头部碰到数字时会将数字“吃掉”,蛇的身体会变长。当蛇的头撞到障碍物时或碰到自己身体时,游戏结束。游戏结束时,蛇身体越长的分越高。
图1 程序启动时界面如图1所示,游戏平面有20*20个方格构成。使用回车键可以暂
停(如图2所示),蛇爬到边界时,如果未遇到障碍物,会从一侧爬出再从另一侧爬入。如果运动过程中,其头部碰到障碍物或自己,则被撞死,游戏结束。
图2 如果该用户的成绩超过记录成绩,则会显示图3所示的对话框提示输入用户名,以供记录成绩,排行榜界面如图4所示。
图3
图4
选择“设置”菜单命令,打开图5所示的“设置”对话框。在该对话框中可以选
择不同的障碍物形状,也可指定背景和障碍物颜色。
图5 为了使效果更好,我加了背景音乐和速度控制。
2、设计思路与总体方案
(说明用到哪些控件并进行难点分析,说明所使用到的模块、过程、变量、数组、自定义数据类型及其相互关系,必要时给出系统结构图等图表。
对如下事项逐步进行必要的分析、说明:
程序设计的主要思想,程序功能是如何实现的?
设计了几个程序模块(有几个窗体模块、几个标准模块),各个功能模块的作者及想到之间的关系(模块间是如何传递信息和数据的,采用什么方式,为什么?)?
程序中定义了哪些主要的变量(分别定义了哪些过程级变量?模块级变量和全局变量),这些变量起什么作用?是否全局变量? 这里不需要给出大段的源程序,只需要给出关键的实现代码即可。)2.1 窗体Form1.vb【设计】
这是主界面,但也是最难的环节,之后要用到的控件与显示都要在其基础上发展。首先我们要将背景网格和蛇身画出来,由于受到了动态添加控件的启发,我用了powerpacks中的ovalshape来构造蛇身,lineshape来构造线,为了满足蛇的身体长长,用到了数组。由于代码之间有许多调配,在此我所举的代码皆主要起说明作用,实际情况可看源代码。代码如下:
Public num As Integer = 4 ‘记录蛇的长度,即ovalshape的个数
Public j As String‘记录Inputstring的字符串
Public p As Integer = 1‘记录MsgBox所产生的值
Dim w As Integer
Dim d As Integer ‘为键盘方向确定一固定值
Dim recordname As String‘记录玩家名字
Dim bnum As Integer = 1‘记录障碍物的个数
Public recordlist(7)As String ‘记录成绩
Public recordscore(7)As Integer
Public gametime As Integer ‘记录游戏进行所用时间
Public gameinterval As Integer = 200 ‘记录游戏Timer控件interval值
Public score As Integer ‘记录得分
Public direction As Integer
Public line(41)As LineShape
Public food(4)As RectangleShape
Public eye(2)As OvalShape '蛇的眼睛
Public a(num)As OvalShape '蛇的身体
Public word(4)As Label
Imports Microsoft.VisualBasic.PowerPacks Public a(num)As OvalShape ‘a()为定义蛇身的数组,变量num用来记录蛇身个数
Public line(41)As LineShape Dim canvas = New Microsoft.VisualBasic.PowerPacks.ShapeContainer
For i = 4 To 0 Step-1 a(i)= New OvalShape
a(i).Size = New Size(20, 20)a(i).Top = 360 a(i).Left = 120 + 20 * i a(i).FillStyle = FillStyle.Solid a(i).FillColor = Color.Yellow a(i).Parent = canvas Next
a(0).FillColor = Color.Red ‘給蛇上色 a(0).BackColor = Color.Red Dim i As Integer
canvas.parent = Me.Panel1 For i = 0 To 20 '形成网格,以两点坐标来确定线的位置
line(i)= New LineShape line(i).X1 = 0 line(i).X2 = 400 line(i).Y1 = 20 * i
line(i).Y2 = 20 * i line(i).Parent = canvas Next
For i = 21 To 41 line(i)= New LineShape line(i).X1 = 20 *(i21)line(i).Y1 = 0 line(i).Y2 = 400 line(i).Parent = canvas 蛇已经做好,那么我们可以进行下一步:让蛇随键盘的上下左右运动起来。这一步曾经困扰我很久,但通过上网我发现每一个键盘都对应着一个代码,如:左37,上38,右39,下40。首先得让控件响应键盘事件,其次让蛇动,而蛇的运动可看作蛇头移动,蛇身跟随前一个身体。由此可以用以下代码解决:
Private Sub form_keydown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)Handles Me.KeyDown Select Case e.KeyCode Case 37 If d 2 Then d = 0 ‘这样能让蛇不往回走
Case 38 If d 1 Then d = 3 Case 39 If d 0 Then d = 2 Case 40 If d 3 Then d = 1 End Select
End Sub Select Case d Case 2 For i = num To 1 Step-1 a(i).Left = a(i1).Top Next
a(0).Left += 20 Case 1 For i = num To 1 Step-1 a(i).Left = a(i1).Top Next
a(0).Top += 20 Case 0 For i = num To 1 Step-1
a(i).Left = a(i1).Top Next
a(0).Left-= 20 Case 3 For i = num To 1 Step-1 a(i).Left = a(i1).Top Next
a(0).Top-= 20 End Select 然后我们可以来设置食物来让蛇吃,我用rectangleshape控件来制造食物,就像和画出蛇身一样写,但是每当被吃后它有出现,而且不能出现在蛇身上。首先,它是随机出现的,我们可用随机函数,然后可通过判断让它不出现在蛇身上。对于数字1,2,3,4,5;我用lebal控件,然后让其和食物坐标同步,这样看起来就像数字在食物上一样。代码如下:
For i = 0 To 4 If a(0).Top = food(i).Top And a(0).Left = food(i).Left Then ‘判断是否吃到
score += i + 1 ‘分数增加 num += i + 1 ‘蛇身的个数增加 food(i).Visible = False word(i).Visible = False
ReDim Preserve food(4)ReDim Preserve word(4)food(i)= New RectangleShape food(i).Size = New Size(20, 20)Randomize()food(i).Left = Int(Rnd()* 20)* 20 ‘随机确定新坐标
food(i).Top = Int(Rnd()* 20)* 20 L2: For g = 0 To num1 If food(i).Left = a(g).Left And food(i).Top = a(g).Top Then
Call setloction(i)GoTo L2 End If
Next
food(i).FillStyle = FillStyle.Solid food(i).Parent = canvas word(i)= New Label word(i).Text = i + 1 word(i).Size = New Size(10, 10)
word(i).Top = food(i).Top + 5 word(i).Left = food(i).Left + 5 word(i).Parent = canvas ReDim Preserve a(num)‘蛇长长,重新定义动态数组
For k = numii1 If a(0).Top = barrier(k).Top And a(0).Left = barrier(k).Left Then
Timer1.Enabled = False a(0).FillColor = Color.Red lifetime-= 1 If score
If lifetime
MsgBox(“GAME OVER!”, 64, “贪吃蛇”)recordname = InputBox(“GAME OVER!” & Chr(13)& “你的成绩为” & Int(score)& “分用时” & _ Int(gameinterval * gametime / 1000)& ”秒。“ & Chr(13)& ”请留下大名“, ”贪吃蛇“, ”无名氏“)Else
p = MsgBox(”Do you want to continue?“, vbYesNo, ”生命值“ & lifetime)If p = 6 Then
Exit For
End If
End If
Else
If lifetime
recordname = InputBox(”GAME OVER!“ & Chr(13)& ”你的成绩为“ & Int(score)& ”分用时” & _ Int(gameinterval * gametime / 1000)& “秒。” & Chr(13)& “请留下大名?”, “贪吃蛇”, “无名氏”)Else
p = MsgBox(“Do you want to continue?”, vbYesNo, “生命值” & lifetime)If p = 6 Then
Exit For
End If
End If
End If
Call record()Call initialize()Exit For
End If
Next 想要形成障碍物,在此我们需要用到文件的读操作。主要代码如下:
FileOpen(1, filelacation, OpenMode.Input)' 读取墙壁,形成迷宫 bnum = 1 Dim L As Integer
Dim T As Integer
For i = 1 To 419 j = InputString(1, 2)If Val(j)= 1 Then
barrier(bnum)= New RectangleShape barrier(bnum).Left = 20 * L barrier(bnum).Top = 20 * T barrier(bnum).Size = New Size(20, 20)barrier(bnum).FillColor = barriercolor barrier(bnum).FillStyle = FillStyle.Solid barrier(bnum).Parent = canvas bnum += 1 End If
If Val(j)= 0 Then ‘用此方法使读出的内容与坐标对应
End If
If j = vbCrLf Then L-= 1 End If L += 1
If L = 20 Then L = 0 : T += 1 End If
Next
FileClose(1)在此基础上便可调用其它的过程,比较简单。代码如下:
Private Sub 开始ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles 开始ToolStripMenuItem.Click If Timer1.Enabled = False Then Timer1.Enabled = True
Exit Sub
End If
If Timer1.Enabled = True Then Timer1.Enabled = False
End If
End Sub
Private Sub 新开局ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles 新开局ToolStripMenuItem.Click Call initialize()End Sub
Private Sub 关于ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles 关于ToolStripMenuItem.Click MsgBox(“贪吃蛇vb2010.2016.3.20”, 64, “版本说明”)End Sub
Private Sub 帮助ToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles 帮助ToolStripMenuItem1.Click Form3.Show()End Sub
Private Sub 设置ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles 设置ToolStripMenuItem.Click Form2.Show()End Sub
Private Sub 退出ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles 退出ToolStripMenuItem.Click
End
End Sub
Private Sub 排行榜ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles 排行榜ToolStripMenuItem.Click Form6.Show()End Sub
2.2窗体Form2.vb【设计】
这个界面是第二重要的,当然它的设计也较麻烦。设计的障碍物的类型用到了listbox控件,也用到了菜单栏与pictureBox控件。而调用的过程shapeview所用到的内容与Form1.vb中的类似,因此方便好多。
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles MyBase.Load ListBox1.Items.Add(“方盒形”)ListBox1.Items.Add(“隧道形”)ListBox1.Items.Add(“螺旋形”)ListBox1.Items.Add(“路障形”)ListBox1.Items.Add(“弯曲形”)ListBox1.Items.Add(“怪异形”)ListBox1.Items.Add(“无障碍形”)PictureBox2.BackColor = Color.DarkGray PictureBox1.BackColor = Color.Aqua TextBox1.Text = lifetime Call shapeview()End Sub Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)Handles ListBox1.SelectedIndexChanged
If ListBox1.SelectedIndex = 0 Then filelacation = “maze1方盒形.txt” filename = “方盒形” mazenum = 1 End If
If ListBox1.SelectedIndex = 1 Then filelacation = “maze1隧道形.txt” filename = “隧道形” mazenum = 2 End If
If ListBox1.SelectedIndex = 2 Then filelacation = “maze1螺旋形.txt” filename = “螺旋形”
mazenum = 3 End If
If ListBox1.SelectedIndex = 3 Then filelacation = “maze1路障形.txt” filename = “路障形” mazenum = 4 End If
If ListBox1.SelectedIndex = 4 Then filelacation = “maze1弯曲形.txt” filename = “弯曲形” mazenum = 5 End If
If ListBox1.SelectedIndex = 5 Then filelacation = “maze1怪异形.txt” filename = “怪异形” mazenum = 6 End If
If ListBox1.SelectedIndex = 6 Then
filelacation = “maze1无障碍形.txt” filename = “无障碍形” mazenum = 7 End If
For k = 1 To oldnum121)line1(i).X2 = 10 *(i单车.wav“
'musicname = ”MUSIC陈奕迅-单车.wav“
My.Computer.Audio.Play(My.Application.Info.DirectoryPath & ”MUSIC陈奕迅-单车.wav“)End If
End Sub
Private Sub RadioButton6_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles RadioButton6.CheckedChanged If RadioButton6.Checked = True Then
'Form1.AxWindowsMediaPlayer1.Ctlcontrols.stop()
My.Computer.Audio.Stop()End If
End Sub End Cla
2.6窗体Form5.vb[设计】
此窗体用来调节蛇运动的快慢程度。
Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles TrackBar1.Scroll
Dim v As Integer v = TrackBar1.Value timeinterval = 500 /(2 ^ v)Label3.Text = TrackBar1.Value End Sub
2.7窗体Form6.vb[设计】
此窗体用来显示玩家的成绩,用到了listBox控件来显示成绩,点击清除所有记录可还原,recordlist()用来记录文件中的每一行。Public Cla Form6
Public Sub Form6_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles MyBase.Load For i = 1 To 7 ListBox1.Items.Add(Form1.recordlist(i))Next
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles Button1.Click ListBox1.Items.Clear()FileOpen(1, My.Application.Info.DirectoryPath & ”clear.txt“, OpenMode.Input)For i = 1 To 7 Form1.recordlist(i)= LineInput(1)ListBox1.Items.Add(Form1.recordlist(i))Next
FileClose(1)End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles Button2.Click Me.Close()End Sub End Cla
2.8标准模块
定义各种变量
Imports Microsoft.VisualBasic.PowerPacks Module Module1
Public barriercolor As System.Drawing.Color = Color.DarkGray
‘记录障碍物的颜色
Public panalcolor As System.Drawing.Color = Color.Aqua ‘记录面板的颜色
Public oldnum As Integer
Public oldnum1 As Integer
Public bnum1 As Integer
Public filelacation As String = ”maze1螺旋形.txt“
Public filename As String = ”螺旋形“
Public timeinterval As Integer = 1000 Public mazenum As Integer = 2 ‘为每一个障碍物类型做标记
Public lifetime As Integer = 1 ‘生命次数
Public barrier(400)As RectangleShape End Module
3、设计过程遇到的主要问题及解决方法
3.1刚开始时对于画出后面的线条时我是添加了41个Lineshape控件,一个个确定等距的坐标将其画下,废了我好大的气力,但后来受到了动态添加控件的触动用数组将其解决。
3.2如何引发键盘事件曾一度困扰我,了解了键盘下所代表的代码意义,之前一直使用的是select case keycode代码,怎么也无法使其响应。后来看看课本上关于键盘的代码,随便使用了select case e.keycode代码,令我欣慰的是竟然成功了。
3.3下一个是如何在界面上显示出障碍物。根据所提供的文件夹,了解起大概用法,为了让我编程更容易,我对其文件做了一定的修改。
3.4最难的是过程之间的调用与联系,解决的办法就是不断的进行调试,修改。比如在我编写重新开局的菜单代码时总是会出现两只蛇;又如在编写排行榜时便不是很方便的能使用listbox.Items.remove这行代码,因此我得另辟蹊径。
4、设计中尚存的不足分析
4.1由于我采用的编写方法是将完成这个贪吃蛇游戏所需满足的要求分开,一个一个的进行攻破,我会发现越往后编写越要考虑到之前的内容,在解决程序之间的关系会越麻烦,调试的次数更多。而且编完后纵观全局会发现代码的结构较混乱,重复性高,他人难以看的明白。
4.2 在定义变量时我尽量定义其为全局变量和模块级变量。部分变量为了简单或难以翻译为英文的仅仅使用了字母代替,对读代码有一定困难。
4.3 我所犯下的最大错误就是使用控件来显示蛇,因为在运行程序时蛇身会随着长度的增加闪烁的愈发厉害。可能是控件太多,程序运行不流畅,效率不高。
4.4 我想在游戏中添加一些音乐,并且用到了循环播放的代码,但是至今我还是没有想到如何能将播放中的音乐暂停。还有的就是怎样才能同时播放两种声音。
4.5 对于排行榜的编写存在一些问题,比如:怎样才能使显示的行间距更开;如何才能使所显示的各项指标在其对应的列下,在这一点上有很大的缺陷。可能程序要用到dictionary方法。
4.6 当我运行程序时,如果我点了界面上的某条线的话,蛇就不再响应键盘事件了,必须使用ctrl+方向键才能使其响应键盘事件。应该是我点击时失去了焦点导致无法正常运行。
5、心得体会
这个程序从难度上讲足足有四颗星,因此我想说我确实摸索了很久,从界面的制作排版到代码的编写。由于计算机编程知识当初只学了些皮毛,很多次我在编程时不断调试却依然出现这样那样的毛病,可能是无意中拼写错误,但有些确实是因为不了解vb的某些较为冷僻的用法所致。这段时间,常会向同学请教,也自觉地去借了些书看看,基本上完成了要求,但是功能、界面都还不是很完善,我会借助以后的时间继续去加工的,我需要的是学以致用。
我体会到了编写程序是个有条理的逻辑过程,首先必须有个大致的思路,整体的规划出来。然后再是分步地去具体完成,尤为重要的是需要投入相当一部分精力去精益求精,这样你的成果才不会是毛糙的。思维调动是件另人愉快的事情,而我们应该去学会享受脑力劳动的过程,哪怕是一次次地失利。这就是2个月的课程设计所教会我的。
6、参考文献
[2].王栋,visual basic程序设计实用教程,北京,清华大学出版社