VBNET扫雷游戏.docx
- 文档编号:12993204
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:33
- 大小:1.03MB
VBNET扫雷游戏.docx
《VBNET扫雷游戏.docx》由会员分享,可在线阅读,更多相关《VBNET扫雷游戏.docx(33页珍藏版)》请在冰点文库上搜索。
VBNET扫雷游戏
问题描述
编写一个扫雷程序,完成基本的扫雷游戏功能。
需求分析
用户打开游戏界面。
游戏界面有两下拉菜单,一个是游戏菜单,另一个是帮助菜单。
界面中间是矩阵方格,下方是计时器和雷计数器,分别显示扫雷用时和未扫出雷的个数。
开始扫雷时,用户无论第一次点击哪个格子都不会是雷。
之后用户鼠标左键单击小格,是雷就扫雷失败,失败就显示所有雷的位置;不是雷且是数字就显示数字,没有数字就打开周围的空格直到周围(横向纵向的四个格子,不包括对角线)是数字。
鼠标右键点击小格标注小红旗,如果不确定就点击两次右键标注问号,再点一次还原。
标注红旗则表示用户标注此处为雷(不管是否正确),问号用于给用户标注不确定的区域,对游戏进程无影响。
标注红旗的格子无法用左键打开,问号格子可以。
左右键同时点中一个数字且数字周围的红旗数等于数字则将其他的小格全部打开,若红旗数大于或小于数字则将其他的小格闪动提示用户无法打开。
如果旗子插错则导致打开含雷的区域,游戏失败。
若将所有雷标出则提示游戏通关,若超过该难度前十记录则提示用户保存记录。
游戏设有计时器,按秒计算,最高显示999秒。
游戏显示剩余雷数,此显示总雷数减去用户插的小旗数。
在游戏菜单中设有“新游戏”、“统计信息”、“选项”、“退出”,四个功能项。
点击“新游戏”后游戏开始,如果游戏正在进行,点击则重新开始游戏。
点击“统计信息”,显示每个等级前十名次的扫雷速度纪录。
点击“选项”弹出选项框,可有初、中、高级的游戏难度选择,另外还有自定义难度选择,可调高度(9-24)、宽度(9-30)和雷数(10-(高度-1)*(宽度-1)),用户输入的设置大于或小于可允许的范围则弹出提示并要求用户更改(雷数范围超过最大范围时不提示,系统直接设定为可允许的最大值)。
点击“退出”,则退出程序。
帮助菜单中设有“查看帮助”,点击则出来游戏说明。
关于扫雷则是一个About窗口,里面有扫雷的版本及版权等信息。
本程序游戏过程无键盘操作。
程序规划
程序流程图
1
5
4
3
2
1
概要设计
一、界面设计
1、主界面MainForm
①地雷区Panel
雷区格子由代码创建,具体显示格子部分采用PictureBox实现
②菜单栏MenuStrip
点击新游戏重新开始游戏
点击统计信息打开记录窗口
点击选项打开选项窗口
点击退出退出游戏
点击查看帮助打开帮助窗口
点击关于扫雷打开关于窗口
③计时区Panel和PictureBox
采用PictureBox换图方式来显示时间
④计雷区Panel和PictureBox
采用PictureBox换图方式来显示剩余雷数
⑤计时控件Timer
计时器,在游戏过程中同步计时
⑥标题栏ICO
采用自己的程序LOGO
2、选项框Options
①标示GroupBox
让界面显得整洁
②难度选择RadioButton
单选按钮,选择游戏的难度
③自定义设定区域Panel
通过Panel的Enable来设置内容的可用与否
④自定义输入框TextBox
输入用户自定义雷区高宽,和雷数
⑤提示信息Label
提示用户输入数字范围
⑥确定按钮Button
点击确定确认选择
⑦取消按钮Button
点击取消放弃选择
3、统计信息HighScore
①②③难度标示GroupBox
三种已定义难度分类
④⑤⑥排名显示Label
显示各难度下前十名的名字和时间
⑦返回按钮Button
点击返回返回主界面
4、帮助框体Help
①②③④帮助项选择LickLabel
选择不同的帮助项目,显示不同的帮助信息
⑤帮助信息显示框TextBox
显示帮助信息内容
⑥返回按钮Button
返回主界面
5、关于AboutBox
①关于窗体AboutBox
一个窗体,已经预先定义了获取信息的位置,只需要在程序集信息中更改即可改变实际显示
②公司标志PictureBox
插入自己的程序LOGO
6、新纪录窗体NewScore
①提示信息Label
显示新纪录的时间和鼓励信息
②玩家名字输入框TextBox
用户输入自己的姓名
③确定按钮Button
点击确定保存记录
④取消按钮Button
点击取消放弃保存,并开始新游戏
详细设计
1、函数设计
MainForm窗体:
PublicStructureMineCheck
PublicSignAsInteger'标识雷或提示数字
PublicOpenedAsBoolean
PublicRightSignAsInteger'标识旗或问号
PublicPictureAsPictureBox
EndStructure
该结构体用于记录和表示每个格子的信息,包括:
该格是否是雷或周围的雷数、打开与否、当前是旗还是问号、该格显示的图片框。
PublicStructureNameAndScore'记录结构体
PublicNameAsString'玩家名字
PublicScoreAsInteger'玩家游戏消耗时间
EndStructure
该结构体用于储存文件中的排名信息,包括:
玩家名字和玩家游戏经历的时间。
由于记录功能未能实现,该结构体未起作用。
PublicSubMainForm_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)
主窗体载入,调整游戏难度或者重新开始时调用此函数重绘窗体结构,通过此函数调用其它函数重绘雷区。
PublicFunctionDrawCheck(ByValMines(,)AsMineCheck)
ReturnMines
函数用于绘制扫雷游戏游戏区域的方格。
该函数在窗体载入时被调用。
函数入口:
结构体MineCheck二维动态数组Mines(,)函数出口:
返回该结构体二维动态数组
PublicFunctionDrawMine(ByValMines(,)AsMineCheck,ByValFirstCheckAsInteger)
ReturnMines
该函数用于绘制雷区分布和探测并记录每一格(除了是雷得格)周围(周围8个格子)的总雷数。
该函数在游戏开始后第一次点击游戏区时被调用。
函数入口:
结构体MineCheck二维动态数组Mines(,)函数出口:
返回该结构体二维动态数组
Publicct,ByValeAsSystem.Windows.Forms.MouseEventArgs)
该函数作为响应所有生成的PICTUREBOX的点击事件的函数。
该函数在窗体绘制完毕后被用户使用。
函数内部分为左键、右键、双键同时点击三种处理,分别调用不同的函数来处理。
左键ShowCheckPicture(X,Y)
右键ShowRightPicture(X,Y)
左右键ShowDoublePicture(X,Y)
函数入口:
sender、e函数返回:
无
PublicSubCheck_MouseDown(ByValsenderAsSystem.Object,ByValeAsSystem.Windows.Forms.MouseEventArgs)
该函数用于处理用户中键点击按下事件。
在用户中键按下时触发。
函数入口:
sender、e函数返回:
无
PublicSubCheck_MouseUp(ByValsenderAsSystem.Object,ByValeAsSystem.Windows.Forms.MouseEventArgs)
该函数用于处理用户中键点击抬起事件。
抬起时判断所按键是否为翻开的数字键及周围插旗数是否等于该格数字。
若等于则调用ShowCheckPicture(X,Y)函数翻开非旗空格。
该事件在用户中键抬起时触发。
函数入口:
sender、e函数返回:
无
PublicSubShowCheckPicture(ByValXAsInteger,ByValYAsInteger)
该函数用于处理用户左键点击方格的结果。
分为是雷不是雷两种情况。
在用户左键单击方格后被调用。
是雷:
改动图片调用ShowMineWhenFail(X,Y)
不是雷:
周围无雷调用FindMine(X,Y)
周围有雷改变图片调用Win()
函数入口:
X,Y为用户所点击方格对应的结构体在结构体数组中的位置。
函数返回:
无
PublicSubShowRightPicture(ByValXAsInteger,ByValYAsInteger)
该函数用于处理用户右键点击方格的结果。
分为置空白、置小旗、置问号三种情况。
在用户右键单击未展开方格后被调用。
函数入口:
X,Y为用户所点击方格对应的结构体在结构体数组中的位置。
函数返回:
无
PublicSubShowDoublePicture(ByValXAsInteger,ByValYAsInteger)
该函数用于处理用户左右键同时单击方格的情况,类同中键按下和抬起。
因为无法同时处理左右键点击事件,所以该功能暂时无效。
函数入口:
X,Y为用户所点击方格所对应的结构体在结构体数组中的位置。
函数返回:
无
PublicSubFindMine(ByValXAsInteger,ByValYAsInteger)
该函数通过递归方法翻开空白格子直到有数字为止。
每打开一格调用一次Win()函数。
该函数在翻开格子的时候被调用。
函数入口:
X,Y为其它函数所要打开的格子的坐标。
函数返回:
无
PublicSubShowMineWhenFail(ByValaAsInteger,ByValbAsInteger)
该函数用于处理游戏失败结束时翻开所有雷的情况。
在用户点击到雷或者用户双键快捷翻雷失败后被调用。
函数入口:
a,b为用户所点击方格对应的结构体在结构体数组中的位置。
函数返回:
无
PublicSubWin()
该函数用于判断游戏是否完成,方法是总格数减去已翻开的格子数等于雷数则探雷完毕。
在翻开格子时被调用。
函数入口:
无函数返回:
无
PublicFunctionMinePictureClean(ByValMines(,)AsMineCheck)
ReturnMines
该函数用于重设游戏难度后清空MinePanel中留存的PictureBox。
在用户重新设定难度后被调用。
函数入口:
结构体MineCheck二维动态数组Mines(,)函数返回:
返回该结构体二维动态数组
该控件用于进行计时操作。
当用户左键进行第一下点击时开始启用,当用户完成扫雷或扫雷失败则停止。
执行时调用函数SetTime(PictureBox,Integer)。
其中PictureBox是主界面上计时区的三个图片控件。
函数入口:
sender、e函数返回:
无
PublicSubSetTime(ByValPicAsPictureBox,ByValNumAsInteger)
该函数用于改变计时区图片,给用户显示时间(秒)。
当Timer控件启用时被调用。
函数入口:
PictureBox,传入被调整的图片控件。
Integer用于判断该调整成什么图片。
函数返回:
无
PublicSubSetMineNum()
该函数用于计算用户剩余雷数。
在用户插旗或取消插旗时被调用。
执行时函数调用ShowMineNum(PictureBox,Integer)
函数入口:
无函数返回:
无
PublicSubShowMineNum(ByValPicAsPictureBox,ByValNumAsInteger)
该函数用于在主界面剩余雷数区域调整雷数显示板。
在SetMineNum()执行时被调用。
函数入口:
PictureBox,传入被调整的图片控件。
Integer用于判断该调整成什么图片。
函数返回:
无
PublicSubCompareScore()
该函数用于判断用户当前难度下当前完成时间是否打破以前同等难度下记录。
如果打破,则让用户输入姓名,并把记录保存起来。
因为时间不足,该功能未能实现。
函数入口:
无函数返回:
无
MainForm函数调用关系图:
(绿色框体:
前提条件,黄色框体:
鼠标点击键箭头指向表示末端函数调用箭头所指函数)
Options窗体:
该函数处理设置窗体打开时的情况,主要是根据主窗体中的OptionsChar变量的值设置RadioButton的选择情况和TextBox的Text值。
该函数在设置窗体被打开时调用。
函数入口:
sender,e函数返回:
无
该函数控制若自定义单选按钮被选中则Panel中的控件可用。
该事件在自定义单选按钮被选中时触发。
函数入口:
sender,e函数返回:
无
该函数为确定按钮点击事件,主要功能是根据用户对于单选按钮的选择情况给主窗体中的变量赋值和判断输入框中的值是否符合规则。
当用户点击确定按钮时触发该事件。
调用函数:
MainForm.MinePictureClean(MainForm.Mines)。
函数入口:
sender,e函数返回:
无
这三个事件都是输入框的文本改变事件,用来判断输入是否是数字
。
当用户改变输入框内容时触发。
函数入口:
sender,e函数返回:
无
处理取消按钮点击事件,即关闭设置窗口。
当用户单击取消按钮时触发。
函数入口:
sender,e函数返回:
无
其他窗体函数由于不多且简单,暂略。
2、程序性能分析
时间复杂度:
设宽度为n,高度为m
绘制扫雷区域时时间复杂度为O(n*m)
放置雷和数字的时间复杂度为O(n*m)
递归开雷的时间复杂度是O(n*m)
则总的时间复杂度是O(n*m)
空间复杂度:
设宽度为n,高度为m,PictureBox占用x字节
使用了一个结构体MineCheck
其中Sign、RightSign各占用4字节共8字节
Opened占用一字节
Picture占用x字节
故空间复杂度为(9+x)*n*m
测试分析
一、基本功能测试
1、游戏功能
初始窗体
点击第一下后
第二下
中键按下
第三次
右键标雷
不确定
中键探雷
右键标雷
·
·
·
·
最后获胜
最后失败
2、设置功能
初始
打开选项
选择中级
确定后
选择高级,确定后
再选择低级
自定义设置
确定后
进行游戏测试
选择新游戏
3、帮助功能
打开帮助
点击如何开始游戏
点击游戏规则
点击返回
二、白盒测试
输入错误测试
输入超过范围
点击确定后
纠正高度输入后
纠正宽度后
输入大于(高度-1)*(宽度-1)的雷数
点击确定后
雷数自动设到允许的最大值64=(9-1)*(9-1)
三、测试结果
总体来说没有什么问题,能够完成基本的扫雷操作。
程序逻辑基本和系统扫雷相同。
没有什么致命的BUG和逻辑陷阱。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VBNET 扫雷 游戏