VB课程设计报告
课程题目: 动物管理员游戏 难度:4星
姓名:束方婷 学号:912101500202
一 题目分析
“动物管理员”是一款非常有趣的游戏,有很多的变种。本题目要求编制一个玩法相对简单,但是编程却不简单的版本。如图,
程序的界面分为三部分,左边部分是一个由8行8列动物图标组成的游戏区,使用者通过鼠标单击两个相邻的图标使之交换位置,如果交换位置之后某类动物图标在同一行或同一列上出现三个或三个以上相邻的情况,表示这些相邻的动物被“捕获”。
最右边是成绩显示区,显示出当前共捕获了每种动物个多少只以及总的数量。
游戏区和成绩显示区的交接处是时间显示区,在游戏过程中剩余时间越来越少,深色部分越来越短,直到游戏结束。游戏结束时,捕获的动物越多则水平越高。
二 具体功能
(1)程序启动时,游戏区随机分布各类动物的图标。图标共有7种,如图
依次是长颈鹿,猩猩,大熊猫,河马,鳄鱼和大象。每种动物有两种表情,上面一行是未捕获时的表情,下面一行是被捕获时的表情。
程序启动时,有可能出现同一行或同一列上有三个以上同种动物相邻,这种情况也算成绩。
(2)用户使用鼠标单击图标时,被单击的图标变红,交换位置之后,图标的颜色变为正常。
(3)如果用户单击了不相邻的图标,程序发出“错误音”且不变换位置。如果单击的是相邻图标但交换位置之后并不能使三个以上同种图标相邻,则会交换回原来的位置同时发出“错误音”。
如果交换位置后出现相邻图标,所有满足相邻关系的图标以被捕获的表情闪烁(动物张嘴)后消失,形成的空位由上方的图标下落后填补,最上面形成的空位由随机生成的图标填补。消失的图标个数会作为成绩加到右边的成绩显示区,同时播放悦耳的“成功声”。
(4)很多情况下,往往会有多个相邻关系同时形成。交叉或在不同位置同时形成多个相邻关系。所以,程序即时判断游戏区形成的所有相邻关系,并进行处理和加分。
有时,“消掉”相邻图标,上方的图标下落后,使得原来不相邻的图标成了相邻关系,这时应判断和处理整个游戏区的图标相邻关系,直到所有的图标都不构成三三相邻的关系。
(5)程序游戏时间共2分钟,游戏过程中每秒钟发出一声时钟的滴答声,并且时间显示区的蓝条越来越短。游戏时间到时,发出闹钟的“闹铃声”,游戏区所有图标的背景变为红色,并显示出“Game over”字样。这时游戏结束,鼠标不能再单击图标。如图
(6)为了清楚的表达图标的变换,图标的消去和下落等动作,程序使用了延时。例如,单击两个相邻图标后,隔200ms才交换它们的位置,判断相邻后,隔200ms才消去,再隔200ms才将上面的图标下移……在延时过程中,用户的鼠标单击是无效的,这时鼠标指针变为;当允许单击时,鼠标指针变为。
(7)对于本游戏,要取得高分,除了应具有敏锐的洞察力和快速的反应力,还要有好运气。因为,有时一次变换位置后会引起“连锁反应”得很多分,而有时无论怎样交换位置都不能形成三三相邻关系
三 设计实现
(1)为了方便数据的管理和编程,定义三个全局数组
Option Base 0
Public Grid(7, 7) As Integer '游戏区的动物图标分布
Public Meet(7, 7) As Boolean '保存形成相邻关系的位置
Public Score(7) As Integer '已捕获的每种动物的数量
(2) 实现动物图标的产生功能
Private Sub Form_Load()
Dim i As Integer, j As Integer
Randomize ·’初始化随机数
For i = 0 To 7
For j = 0 To 7
Grid(i, j) = Int(Rnd * 7) '随机生产动物图标
Next
Next
For i = 0 To 7
For j = 0 To 7 '画图标
picGrid.PaintPicture PC1.GraphicCell(Grid(i, j)), i * 34, j * 34
Next
Next
For i = 0 To 6
picScore.PaintPicture PC3.GraphicCell(i), 0, i * 34
'显示成绩区的图标
Next
Call ShowScore
ProgressBar1.Value = 120
Mode = 3
End Sub
Private Sub ShowScore() '显示总成绩
Dim i As Integer
For i = 0 To 7
ShowNum 34, i * 34 + 5, Format(Score(i), "000")
Next
End Sub
Private Sub ShowNum(x As Integer, y As Integer, s As String)
Dim i As Integer
For i = 1 To Len(s)
picScore.PaintPicture PC4.GraphicCell(CInt(Mid(s, i, 1))), x + 18 * (i - 1), y
Next
End Sub
(3)实现已完成动物图标搜索
Private Sub Exchange(x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer)
Dim e As Integer
e = Grid(x1, y1)
Grid(x1, y1) = Grid(x2, y2)
Grid(x2, y2) = e
Call ReDraw(x1, y1)
Call ReDraw(x2, y2)
End Sub
Private Function Compare() As Integer
Dim k As Integer, n As Integer
Dim kind As Integer, num As Integer
Dim i As Integer, j As Integer
Erase Meet
' '横向搜索
For i = 0 To 7
num = 1
kind = Grid(i, 0)
For j = 1 To 7
If Grid(i, j) = kind Then
num = num + 1
Else
If num >= 3 Then
For k = j - 1 To j - num Step -1
Meet(i, k) = True
Next
End If
kind = Grid(i, j)
num = 1
End If
Next
If num >= 3 Then
For k = j - 1 To j - num Step -1
Meet(i, k) = True
Next
End If
Next
(4)记录成绩
num = 0
For i = 0 To 7
For j = 0 To 7
If Meet(i, j) Then
num = num + 1
Score(Grid(i, j)) = Score(Grid(i, j)) + 1
End If
Next
Next
Score(7) = Score(7) + num '总成绩
(5)附加模块
Option Explicit
Option Base 0
Public Grid(7, 7) As Integer '每格的动物
Public Meet(7, 7) As Boolean '判断组成
Public Score(7) As Integer '每种动物的数量
Public SelX1 As Integer '被点击的两个位置
Public SelY1 As Integer
Public SelX2 As Integer
Public SelY2 As Integer
Public Mode As Integer
'-1,禁止状态
'0,正常状态,1:被选一个,2:被选两个,互换位置前,
'3:互换位置后,以一种颜色显示成组
'4:以第二种颜色显示成组的图标.
'5:使用白色绘制,显示空缺
'6:消去成组,填补空白.
Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Public Const SND_ASYNC = &H1 ' play asynchronously
Public Const SND_LOOP = &H8 ' loop the sound until next sndPlaySound
Public Const SND_MEMORY = &H4 ' lpszSoundName points to a memory file
Public Const SND_NODEFAULT = &H2 ' silence not default, if sound not found
Public Const SND_NOSTOP = &H10 ' don't stop any currently playing sound
Public Const SND_NOWAIT = &H2000 ’don't wait if the driver is busy
四总结
(1)首先,这个程序的主代码不完全是我自己编的,很多很大的内容都是参考的学长的,同时也参考书上给的提示,包括了picture clip控件,progress bar控件以及MM control多媒体控件。研习程序的过程中,我碰到了很多困难,即使参照着已有的程序,但是程序过于复杂,知识掌握的不够透彻,我又通过对书本的进一步学习与研究,终于对这个程序有了足够的认识。使一些困难得到了解决。
(2)程序每次加载都会出错,虽然能够运行,但总是找不到问题出在哪儿,这是这个程序最致命的缺点。
(3)本程序使用了时间控制且只能是2min,很不灵活。可使游戏时间可调,如总成绩达到某个数值或所有动物个数都超过某个数目时增加时间。
(4)可增加用户登录、成绩记录、查询和排行榜等功能。
第二篇:VB程序设计报告
广西大学
课程程序设计说明书
课题名称 简易记事本的模仿设计
学 院 电气工程学院
专 业 自动化
班 级 093班
姓 名 谢金富(0902100513)
指导教师: 陈苏
2011 年 12 月 22 日
简易记事本的模仿设计
RichTextBox控件是用于输入和编辑文本的控件, 但它比常规的TextBox控件具有更高级的格式特性。RichTextBox控件提供了一些属性,通过这些属性,可对该控件中任何部分的文本使用不同的格式。用这些属性,可以将文本变为粗体或斜体、改变文本的颜色、创建上标或下标、调整段落的左右缩进值、使用悬挂式缩进以及动态地向该控件中充填嵌入位图( .BMP)、图标(:lc.ICO)、Microsoft Excel的电子表格和Microsoft Word文档等对象。
RichTextBox控件对于内容的处理提供了多种手段。打开时,可以用RTF格式或ASCII文本格式打开或保存文件;可以使用该控件的方法(LoadFile和SaveFile),直接读写文件;也可以用该控件的属性,比如SelRTF和TextRTF,结合文件输入、输出语句读写文件, 将.rtf文件的内容装入RichTextBox控件。编辑时,可将其它文件(比如从“资源管理器”中)的内容直接拖人该控件;或者将其它应用程序(比如Microsoft Word)中使用文件的突出显示部分直接拖人该控件;还可以通过设置FileName属性,将.rtf或.txt文件的内容装入该控件。打印时,可用SelPrint方法打印RichTextBox控件中的全部或部分文本。将RichTextBox控件绑定到Data控件,可以处理Microsoft Access数据库的Memo字段或者其它大型数据库中的文字段(例如Sybase数据库、Microsoft SQL Server数据库中的TEXT数据类型)。
RichTextBox件的主要用途是其一作为“无底”的文本框,可用于编写阅读较大的文本文件的应用程序;其二在应用程序中实现功能完备的文本编辑器。
一、 预定功能
新建:新建立一个记事本文档。
保存:重命名一个名字,保存文档。
打开:将打开一个已经存储在计算机中的文件(*.txt或*.rtf文件)。
退出:指退出这个记事本程序。
编辑:能对文本进行复制、剪切、粘贴,也可以改变文本字体、颜色、大小。
查找:类似Word文档的查找功能,通过输入关键字,词进行查找。
二、 设计界面
记事本界面有以下几部分组成:
标题栏:自定义图标和记事本标题。
菜单栏:包括文件、编辑、搜索和帮助主题。
三、 主要功能说明
主要功能:
(1) 文本打开、新建、保存等基本操作:
(2)文本编辑功能:
(3)文本查找功能:
(4)记事本帮助主题:
功能说明:
(1) 基本操作:能够打开计算机中存储的*.txt或*.rtf文件,进行读写操作,记事本拥有一个很好的优点:就是打开速度快,文件小。通过记事本可以很方便地打开比较小文本文档。
(2) 编辑操作:对文本匡中的文档内容进行编辑。通过对文本进行复制、剪切、粘贴,方便了用户的操作。使得记事本能够像Word一样,不仅可以查看文本,还能对其进行修改。
(3) 搜索操作:如果一篇文章太长,使用搜索功能可以马上找到要寻找的内容,通过输入关键字进行查找。如果要查找多个相同文本内容,可以通过“查找下一个”来逐一查找。
(4) 使用说明:一个简单的记事本使用指南。“关于”的内容一般都是作者的版权说明以及程序版本。
四、 运行效果
新建:通过文件---新建,来打开一个新文档,新建后的文档是以“未命名”为标题的
打开操作:文件----打开,选择要打开的文档“新建文档.txt”
保存操作:文件----保存;另存为xie,txt保存在F盘。
2.编辑操作:
复制:打开123.txt,选中第一句,复制到第二句中间
剪切和粘贴:把复制的内容剪切掉,粘贴在最后一句后面。
3.查找操作
查找:搜索---查找,通过查找“二极管”两个字为例
程序不足之处:当点击右上角关闭按钮时,不能弹出保存对话框给读者进行
操作,容易丢失数据,其次是没有对字体进行设计,,再者,没有如同word文档一样有快捷键设置,程序的运行界面也没有很好的进行设置,这些都是需要改进的地方。
五、 程序设计过程
第一步:界面设计
新建一个标准EXE工程,将其Caption属性改为“记事本”,点击Icon属性给它找个合适的Icon图标。单击菜单“工程”-“部件”,在弹出的“部件”对话框里找到Microsoft RichText Box 6.0和公共对话框Microsoft Common Dialog 6.0并选中它们,单击“确定”按钮。这时左边的工具栏上出现了刚才新添的两个控件。在窗体上绘制RichText Box和Commn Dialog,其中RichText Box的大小和位置可不用理睬,可以在代码中处理它,要把它的ScrollBar属性设为2-rtfVertical,这样在打开和编辑文件时垂直滚动条才可用。
第二步:编辑菜单。
调出菜单编辑器,做如下几个菜单:
一. 文件菜单:
文件(第一层) mnuFile
新建(第二层) mnuNew Ctrl+N
打开(第二层) mnuOpen Ctrl+O
保存(第二层) mnuSave Ctrl+S
退出(第二层) mnuExit F5
二. 编辑菜单:
编辑(第一层) mnuEdit
复制(第二层) mnuCopy Ctrl+C
剪切(第二层) mnuCut Ctrl+T
粘贴(第二层) mnuPaste Ctrl+V
删除(第二层) delete Del
全选(第二层) mnuSelecAll Ctrl+A
三.搜索菜单:
搜索(第一层) mnuSearch
查找(第二层) mnuFind Ctrl+F
查找下一个(第二层) mnuFindOn F3
四.帮助菜单:
帮助(第一层) mnuHelp
使用说明(第二层) mnuUsage
关于(第二层) mnuAbout
六、心得体会
通过编这个简易记事本,我觉得编程不是一项轻松的活,尤其是一个人开发制作软件时,那工作量就多了。没有一定的坐功、细心程度及耐性那是绝对做不到的。有时,把程序做完了需要调试运行,但是就是不能达到自已设计的效果和目的,也许就是因为一个符号或一个字母,就得花上个几个小时,半天,甚至更长。越是这样越不能灰心,应该放松心态,一点一滴的去查。只要有一颗永不退缩的心,我们就一定能找到问题所在,最后一定能露出开心的笑容,也一定能找到成功者的感觉。所以编程能很好的锻炼人的意志。
同时,我觉得良好的编程习惯是必不可少的。在很多人的编程语言中,用“+”来连接字符串,这样容易导致歧义。良好的习惯是用“&”来连接字符串。此外,变量命名应大小写,语句错落有秩。还有,尽量使用Debug.print进行调试,在很多人的调试中,习惯用MsgBox来跟踪变量值。其实用Debug.print不仅可以达到同样的功效,而且在程序最后编译过程中,会被忽略.而MsgBox必须手动注释或删除。
附录:程序代码
Dim sFind As String
Dim FileType, FiType As String
Private Sub delete_Click()
RichTextBox1.SelText = ""
End Sub
Private Sub Form_Load()
Me.Height = 6000
Me.Width = 9000
End Sub
Private Sub Form_Resize()
On Error Resume Next
RichTextBox1.Top = 20
RichTextBox1.Left = 20
RichTextBox1.Height = ScaleHeight - 40
RichTextBox1.Width = ScaleWidth - 40
End Sub
Private Sub mnuNew_Click()
Dim i As Integer
i = MsgBox("是否保存", 4, "警告")
If i <> 7 Then
CommonDialog1.Filter = "文本文档(*.txt)|*.txt|RTF文档(*.rtf)|*.rtf|所有文件(*.*)|*.*"
CommonDialog1.ShowSave
FileType = CommonDialog1.FileTitle
FiType = LCase(Right(FileType, 3))
FileName = CommonDialog1.FileName
Else
RichTextBox1.Text = ""
FileName = "未命名"
Me.Caption = FileName
End If
End Sub
Private Sub mnuOpen_Click()
CommonDialog1.Filter = "文本文档(*.txt)|*.txt|RTF文档(*.rtf)|*.rtf|所有文件(*.*)|*.*"
CommonDialog1.ShowOpen
RichTextBox1.Text = ""
FileName = CommonDialog1.FileName
RichTextBox1.LoadFile FileName
Me.Caption = "私人记事本:" & FileName
End Sub
Private Sub mnuSave_Click()
CommonDialog1.Filter = "文本文档(*.txt)|*.txt|RTF文档(*.rtf)|*.rtf|所有文件(*.*)|*.*"
CommonDialog1.ShowSave
FileType = CommonDialog1.FileTitle
FiType = LCase(Right(FileType, 3))
FileName = CommonDialog1.FileName
Select Case FiType
Case "txt"
RichTextBox1.SaveFile FileName, rtfText
Case "rtf"
RichTextBox1.SaveFile FileName, rtfRTF
Case "*.*"
RichTextBox1.SaveFile FileName
End Select
Me.Caption = "私人记事本:" & FileName
End Sub
Private Sub mnuExit_Click()
Dim i As Integer
i = MsgBox("是否保存", 4, "警告")
If i <> 7 Then
CommonDialog1.Filter = "文本文档(*.txt)|*.txt|RTF文档(*.rtf)|*.rtf|所有文件(*.*)|*.*"
CommonDialog1.ShowSave
FileType = CommonDialog1.FileTitle
FiType = LCase(Right(FileType, 3))
FileName = CommonDialog1.FileName
Select Case FiType
Case "txt"
RichTextBox1.SaveFile FileName, rtfText
Case "rtf"
RichTextBox1.SaveFile FileName, rtfRTF
Case "*.*"
RichTextBox1.SaveFile FileName
End Select
Else
End
End If
End Sub
Private Sub mnuCopy_Click()
Clipboard.Clear
Clipboard.SetText RichTextBox1.SelText
End Sub
Private Sub mnuCut_Click()
Clipboard.Clear
Clipboard.SetText RichTextBox1.SelText
RichTextBox1.SelText = ""
End Sub
Private Sub mnuSelectAll_Click()
RichTextBox1.SelStart = 0
RichTextBox1.SelLength = Len(RichTextBox1.Text)
End Sub
Private Sub mnuPaste_Click()
RichTextBox1.SelText = Clipboard.GetText
End Sub
Private Sub mnuFind_Click()
sFind = InputBox("请输入要查找的字、词:", "查找内容", sFind)
RichTextBox1.Find sFind
End Sub
Private Sub mnuFindOn_Click()
RichTextBox1.SelStart = RichTextBox1.SelStart + RichTextBox1.SelLength + 1
RichTextBox1.Find sFind, , Len(RichTextBox1)
End Sub
Private Sub mnuAbout_Click()
MsgBox "私人记事本 . 版权所有.翻版必究", vbOKOnly, "关于"
End Sub
Private Sub OLE1_Updated(Code As Integer)
End Sub
Private Sub mnuUsage_Click()
On Error GoTo handler
RichTextBox1.LoadFile "Readme.txt", rtfText '注释:请写好Readme.txt文件并存入程序所在文件夹中
Me.Caption = "私人记事本:" & "使用说明"
Exit Sub
handler:
MsgBox "使用说明文档可能已经被移除,请与作者联系。", vbOKOnly, " 错误信息"
End Sub
Private Sub RichTextBox1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
PopupMenu mnuEdit, vbPopupMenuLeftAlign
Else
Exit Sub
End If
End Sub
Private Sub RichTextBox1_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeySpace Then
RichTextBox1.SelFontName = CommonDialog1.FontName
End If
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If MsgBox("是否需要保存?", vbQuestion + vbYesNo) = vbYes Then
CommonDialog1.Filter = "文本文档(*.txt)|*.txt|RTF文档(*.rtf)|*.rtf|所有文件(*.*)|*.*"
CommonDialog1.ShowSave
FileType = CommonDialog1.FileTitle
FiType = LCase(Right(FileType, 3))
FileName = CommonDialog1.FileName
Select Case FiType
Case "txt"
RichTextBox1.SaveFile FileName, rtfText
Case "rtf"
RichTextBox1.SaveFile FileName, rtfRTF
Case "*.*"
RichTextBox1.SaveFile FileName
End Select
Else
Cancel = False
End If
End Sub
参考资料:
(1)《Visual basic 程序设计教程》第三版 龚沛曾 杨志强等编,高等教育出版社
(2)http://wenku.baidu.com/view/ec5926c7aa00b52acfc7ca92.html
(3)http://wenku.baidu.com/view/4d078519227916888486d7da.html
(4)http://wenku.baidu.com/search?word=vb%BC%C7%CA%C2%B1%BE%C9%E8%BC%C6%B1%A8%B8%E6&lm=0&od=0