湖南涉外经济学院 程序设计实训(一)
课程设计报告
学 院:
专业名称:
课程名称:
设计题目:
学生姓名:
指导教师:
时 间: 信息科学与工程学院 计算机科学与技术 程序设计实训 扫雷游戏开发 马铁军 邹竞 20xx年12月
摘 要
随着时代的发展,电脑进入了普通老百姓的生活,越来越多的人使用电脑办公、娱乐、上网,游戏行业发展一日千里,该行业极大的影响和改变了人们的生活和娱乐方式,游戏为消费者提供丰富多彩的虚拟空间,使消费者可以自由自在的享受虚拟世界的乐趣,实现自己在现实生活着那个可能永远不能实现的梦想,满足了消费者的心理和精神需求。
扫雷游戏是Windows操作系统自带的一款小游戏, 本系统要是模仿WINDOWS系统的扫雷,对于实现过程中出现的bug进行调试解决。我这里用的是C#编写了与它功能相似的扫雷游戏。
程序的功能是随机生成地雷数,通过鼠标操作玩游戏,不接受键盘,按任意键结束程序。单击屏幕上的笑脸可以重新开始游戏。当鼠标左键单击到地雷时提示游戏失败。报告首先介绍了进行该游戏课程设计的目的,然后是任务描述和设计的相关要求,最后是最重要的需求分析和设计方案。重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解用户的意图,进而做出相对应的动作。清除未靠近地雷区的方块较为复杂。
关键词:扫雷游戏;算法设计;事件;c#
目 录
摘 要 .............................................................................................................................................. II
第一章 课程设计目的与要求 .................................................................................................. 1
1.1目的 ..................................................................................................................................... 1
1.2要求 ..................................................................................................................................... 1
第二章 需求分析 ........................................................................................................................ 2
2.1功能描述 ............................................................................................................................. 2
2.2功能需求 ............................................................................................................................. 3
2.3 功能模块 ............................................................................................................................ 4
第三章 设计方案 ........................................................................................................................ 5
3.1总体设计 ............................................................................................................................. 5
3.2 具体功能模块设计 ............................................................................................................ 7
3.3详细设计 ........................................................................................................................... 12
第四章 程序测试及分析 ......................................................................................................... 15
4.1 程序的调试及查错 .......................................................................................................... 15
4.2 错误解决方法 .................................................................................................................. 15 总 结 ............................................................................................................................................. 16 参考文献 ...................................................................................................................................... 18
湖南涉外经济学院信息科学与工程学院
第一章 课程设计目的与要求
1.1目的
本课程设计是计算机科学与技术专业重要的实践性环节之一,是对本课程学习后进行的一次全面而综合的练习。本次课程设计的目的主要有:
1. 培养综合运用所学知识独立完成课题的能力。
2. 更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。
3. 提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
4. 培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方
位考虑问题等科学技术人员应具有的素质。
5. 培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到解决
问题的新途径的悟性,初步培养工程意识和创新能力。
6. 对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、
书面及口头表达能力进行考核
7. 巩固和加深学生对C#的基本知识的理解与掌握。
8. 掌握C#语言编程和调试的基本技能
9. 运用C#语言对程序的简单设计
10. 掌握程序设计说明文档的能力与技巧
11. 让学生掌握较为简单的算法分析能力
1.2要求
(1)需要为Windows操作系统的用户设计完成一款扫雷游戏,这是一个根据某种算法自动布雷,有用户扫雷的小软件;
(2)本游戏由每个学生单独完成,完成时间大概7周时间,开发成本低,易于完成;
(3)设计过程中,前两周,对整个游戏所实现的功能进行详细的设计以及对存在的问题及解决办法进行最终确定;3-5周完成游戏的程序编写,并优化;最后两周,写出设计本游戏的详细文档说明,并作课程设计汇报。
1
湖南涉外经济学院信息科学与工程学院
第二章 需求分析
需求分析的主要任务即详细的找出程序所需要的各种功能实现,是对系统功能进一步分析和抽象,以确定系统应当做什么的问题,从而完成系统的逻辑设计。本程序为扫雷游戏的实现,首先是要实现扫雷游戏的基本功能,根据扫雷游戏的玩法,设计程序,实现程序功能。本系统需求分析分为四个部分:功能描述、功能需求、功能模块和系统需求分析报告。
2.1功能描述
按功能将游戏区域分成两个区域:雷区和提示区。提示区包括计雷器、计时器和一个笑脸的按键操作。游戏过程中,当用户用鼠标点击相应的方块,程序就会作出相应的鼠标事件,而鼠标事件的处理都是由扫雷程序实现的。
游戏开始时,系统会在雷区的某些小方块中随机布下若干个地雷。安放地雷的方块称为雷方块,其他的称为非雷方块。布完雷后,系统会在其他非雷方块中填充一些数字。某一个具体数字表示与其紧邻的8个方块中有多少个雷。用户可以根据这些数字判断是否可以打开某些方块,并把认为有地雷的方块标识地图。如果某个数字方块周围的地雷全都标记完,可以单击鼠标左键,将其周围剩下的方块挖开。
如果数字周围地雷没有全部标记,在同时单击鼠标左右键时,其他隐藏或未标记的方块将被按下一次。当用户将所有地雷挖出后,其余的非雷方块区域都已打开,此时游戏胜利。在游戏过程中,一旦错误地打开了雷方块则游戏失败,游戏结束;当用户标识的地雷数超过程序设定,虽然打开了全部其余方块,游戏仍然不会结束。
2
湖南涉外经济学院信息科学与工程学院
2.2功能需求
(1)提示区左侧显示总雷数,并减去被标明有雷区域的数目;
(2)提示区中间位置显示笑脸按钮用于开局和显示鼠标动作的结果;
(3)提示区右侧显示扫雷所用的时间;
(4)单击鼠标左键于未知区域,如果未知区域有雷,游戏结束,显示所有的地雷;如果没有雷,则显示周围雷数,如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止,并显示周围雷的数目;
(5)单击鼠标右键于未知区域,则显示小红旗,将其标识有雷。在该位置再次单击右键则取消;
(6)如果该数字方块周围地雷已经完全标识出,双击该数字所在方块,将快速翻开所有周围不是地雷的方块,并显示,直到有雷为止;
(7)将雷全部扫完后,会出现一个提示框,显示游戏胜利
3
湖南涉外经济学院信息科学与工程学院
2.3 功能模块
(1)游戏界面
(2)布雷
(3)鼠标事件
(4)地雷判断
(5)游戏胜利(结束)
(6)游戏失败(结束)
扫雷游戏系统基本功能如图3-3所示
图3-3扫雷基本功能
4
湖南涉外经济学院信息科学与工程学院
第三章 设计方案
3.1总体设计
3.1.1 功能设计
实现功能包括:布局格子,布雷,判断游戏完成或失败,鼠标事件(左键单击、右键单击)
(1)如果单击了鼠标左键则判断: 如果鼠标单击了笑脸则游戏重新开始。 如果单击了方格,判断该格子里有红旗,则按键无效。如果单击的格子没有显示过数字或空白,则判断;如果是地雷,游戏结束,显示地雷分布;如果不是地雷,则统计该格子周围(8 个方向)的地雷数,如果周围地雷数为0, 调用递归函数处理周围格子的情况,显示周围地雷数或空白。如果单击的格子周围地雷数不为0, 则显示周围地雷数,将处理过的格子作标记。如果所有格子处理完毕,游戏胜利,显示胜利信息。
(2) 如果单击了鼠标右键,该格子没有红旗,则显示红旗。如果有红旗,再击右键,则红旗消失。
3.1.2 界面思路
本程序是用C#的控件设计的,首先在程序初始化时界面全部置为空,在按了扫雷的笑脸键之后开始给界面布局,用数组画出扫雷的格子。
3.1.3程序思路
扫雷程序主要用了一个8 行9 列的二维数组表示,数组的每一个元素是结构体类型,结构体中的num 成员代表格内当前处于什么状态,值为1 表示有雷,值为0 表示已经变成空白格或者显示过数字,roundnum 成员统计每个格子周围有多少地雷,flag 变量主要是鼠标右键测试的标志,如果flag 为1 则表示格子显示红旗,这样鼠标左键点在这个格子中将无效。 算法的重点是一开始统计好每个格子周围有多少地雷,然后当鼠标左键点在没地雷的格子上时进行两种判断,如果格子周围没地,雷就先在原来的格子位置显示空白格,然后用递归的方法同样判断周围的8 个格子;如果格子周围有地雷,就在该格子上显示具体的雷数。
在递归判断8 个格子时,如果格子上有雷或者格子已经显示过雷数或者空白格,以及格子上有红旗标志的话,就不再对格子进行任何判断。
5
湖南涉外经济学院信息科学与工程学院
3.1.4 游戏流程设计
游戏详细运行流程如图3-1-1所示
图3-1-4整体流程图
6
湖南涉外经济学院信息科学与工程学院
3.1.5 鼠标事件流程图如图3-1-5
3.2 具体功能模块设计
3.2.1 布雷
在给程序布雷时思路是这样的,首先给出界面全部为无雷的状态然后获取鼠标的坐标,把坐标传到LayMines(int a,int b)函数中,然后写一个随机函数,给最开始无雷状态中随机布雷
其代码如下:
private void LayMines( int a,int b )//a,b 是第一次点的坐标,不放雷 {
int x, y;
Random s = new Random();
//取随机数
for (int i = 0; i < MineNum;)
{
//取随机数
x = s.Next(XNum);
y = s.Next(YNum);
if (Convert.ToInt16(Mines[x, y].Tag) != 1 && !(x==a&&y==b) )
7
湖南涉外经济学院信息科学与工程学院
{
//==1时,代表这个位置是地雷
Mines[x, y].Tag = 1; //修改属性为雷
//Mines[x, y].Text = "u";
i++;
}
}
}
3.2.2 获取小方块区域相邻8个区域的雷的个数
其主要思路通过GetAroundNum(int row, int col)函数,传入鼠标的坐标,通过around 变量统计雷数, 通过minRow与maxCol变量获取坐标的范围然后通过IsInMineArea函数判断是否在雷的区域通过around累加。其具体代码如下:
private int GetAroundNum(int row, int col) //当前坐标
{
int i, j;
int around = 0;
int minRow = (row == 0) ? 0 : row - 1; //坐标最小范围
int maxRow = row + 2;
int minCol = (col == 0) ? 0 : col - 1;
int maxCol = col + 2;
for (i = minRow; i < maxRow; i++)
{
for (j = minCol; j < maxCol; j++)
{
if (!IsInMineArea(i, j)) //判断是否在扫雷区域
continue;
if (Convert.ToInt16(Mines[i, j].Tag) == 1) around++; }
}
return around;
}
8
湖南涉外经济学院信息科学与工程学院
3.2.3 雷空白方块拓展
雷方块拓展主要思路是按与获取雷数差不多,利用ExpandMines(int row,int col)函数,首先把Mines[row,col]的值附为false ,其后数通过二维数组对期进去判断,调用IsInMineArea(i,j),及ExpandMines(i,j)对其进行判断。 其具体代码如下:
private void ExpandMines(int row, int col)
{
int i, j;
int minRow = (row == 0) ? 0 : row - 1;
int maxRow = row + 2;
int minCol = (col == 0) ? 0 : col - 1;
int maxCol = col + 2;
int around = GetAroundNum(row, col);
//对周围一个雷都没有的空白区域拓展
if (around == 0)
{
Mines[row, col].Enabled = false;
for (i = minRow; i < maxRow; i++)
{
for (j = minCol; j < maxCol; j++)
{
//对于周围可以拓展的区域进行的规拓展
if (!IsInMineArea(i, j)) continue;
if (!(i == row && j == col) && Mines[i, j].Enabled) //&& Convert.ToInt16(Mines[i,j].Tag)!= 1
{
ExpandMines(i, j);
}
Mines[i, j].Enabled = false; //周围无雷的区域按钮无效 if (GetAroundNum(i, j) != 0) //周围无雷**********6--28 Mines[i, j].Text = GetAroundNum(i, j).ToString(); }
}
9
湖南涉外经济学院信息科学与工程学院
}
}
3.2.4 判断胜利
其思路通过Victory()函数设置一个count变量,调用Mines[i,j]对count变量累加,假如count 数等于所布的雷数,就自动判断胜利,其代码如下: private bool Victory() // 检测是否胜利
{
int count = 0;
for (int i = 0; i < XNum; i++)
for (int j = 0; j < YNum; j++)
{
//没翻开计数
if (Mines[i, j].Enabled)
count++;
}
return count==MineNum;
}
3.2.5 鼠标事件
这一步是程序的核心部位鼠标的部份事件,通过bt_MouseUp事件获取鼠标的事件对程序进行调用布雷,找雷,判断是否胜利等函数其代码如下:
private void bt_MouseUp(object sender, MouseEventArgs e) //这里处理事件方法 {
String btName;
Button bClick = (Button) sender; //将被击的按钮赋给定义的bClick变量 btName = bClick.Name; //获取按钮的Name
int n = Convert.ToInt16(btName.Substring(5));
int x = n%XNum;
int y = n/XNum;
//通过按钮Name属性来判断是哪个Button被点击,并执行相应的操作 switch (e.Button)
{
case MouseButtons.Left:
if (first) {
first = false;
LayMines(x,y);//布雷函数
timer1.Enabled = true;
10
湖南涉外经济学院信息科学与工程学院
}
if (Convert.ToInt16(Mines[x, y].Tag) != 1) //不是雷 {
Mines[x, y].BackgroundImage = null;
Mines[x, y].Text = GetAroundNum(x, y).ToString();//获取周围雷
Mines[x, y].Enabled = false;
ExpandMines(x, y); //完成无雷拓展
if (Victory())
{
// 判断是否胜利,是则将地图中所有雷标识出来 show();
MessageBox.Show("胜利!!!", "结束");
timer1.Enabled = false; //停止计时
GameInit();
}
}
else //触雷
{
Mines[x, y].BackgroundImage =
Image.FromFile("mine1.bmp");
timer1.Enabled = false; //停止计时
show(); //将地图中所有雷标识出来
MessageBox.Show("失败!!!", "结束");
GameInit();
}
break;
case MouseButtons.Right:
Mines[x, y].BackgroundImage = Image.FromFile("flag.bmp"); if (Turn[x, y] == 1) //表示这个位置插上红旗
{
Turn[x, y] = 0; //取消红旗,表示这个位置没有翻开 RestMine++;
11
湖南涉外经济学院信息科学与工程学院
Mines[x, y].BackgroundImage = null; }
else
{
Turn[x, y] = 1; //表示这个位置插上红旗 RestMine--;
}
lblMine.Text = RestMine.ToString(); if (Victory())
{
MessageBox.Show("胜利!!!", "结束"); timer1.Enabled = false; //停止计时 }
break;
}
}
3.3详细设计
3.3.1 界面设计
1.初始界面如图3-3-1所示
12
湖南涉外经济学院信息科学与工程学院 \
图3-3-1 初始界面
2.游戏中如图
3-3-2
图3-3-2 游戏图
3.游戏失败如图3-3-3
13
湖南涉外经济学院信息科学与工程学院
图3-3-3 失败图
4.游戏胜利如图
3-3-4
图3-3-4 胜利图
14
湖南涉外经济学院信息科学与工程学院
第四章 程序测试及分析
4.1 程序的调试及查错
1. 为了便于查错、阅读,在设计该程序的过程中我们采用了结构化程序方法编
辑,添加了尽可能多的注释,这就为接下来的调试过程带来了很多方便。
2. 经过仔细检查之后进行上机调试。进行编译,如果在编译和连接过程中发现
错误,屏幕上显示了出错信息,根据提示找到出错的位置,加以改正,再进行编译……如此反复,直到顺利通过编译和连接为止。
3. 在本次实习过程中碰到的编译、连接的错误主要有:缺少变量定义,定义位
置不正确、语法错误、注释的位置等。
4.2 错误解决方法
1. 缺少变量定义,定义位置不正确; 由于该程序相对来讲稍有些长,前后有
些变量不容易联系起来,但是在错误信息的提示下一般还是很容易找到。不过需要注意的是在定义的时候有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置要特别留意。为减少这样的错误 15
湖南涉外经济学院信息科学与工程学院
我后来还是用不同的变量名来表示,结果引起的那些错误解决了。 例如: 未定义void Close(void);/*图形关闭*/,所以输出void Close(void);中就有错误,因为缺少定义。
2. 语法错误; 大多的语法错误在通过书本参考下能够修改。主要是平时缺乏
锻炼、不太注意而产生的。如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式
3. 注释的位置; 程序设计中在注释的时候不能同我们平常写字一样随心所欲,
我们应该注意注释的格式。注释中不能含有c语言可执行的语句!
总 结 从高中的时候就开始玩扫雷了,但一直不知道是怎么做出来的,这次借着这次课程设计自己做了一个扫雷,说实话心里很开心,有成就感,这个扫雷程序主要是用C# 做成的,在期间遇到了许多问题,如怎么给页面布局,怎么接收鼠标事件,怎么布雷,怎么判断是否有雷,其中通过问同学,老师,和自己查找资料一一解决,发现要做一个程序,首先得在自己的脑海里面有个大概的思路,怎么去做,所以得先写一个需求分析,使自己大概知道往哪个方向去做,要做些什么东西,再去查询相应的资料,来解决具体的问题,其次就是一些概率的设计和逻辑结构了,通过合理的方法设计去最优的程序。在做这个过程中使我复习了C#一些控件的使用,其及具体的算法,
在整个过程中,深深的感谢队友的共同协作,与老师的指导及在网络上提供各种解决各类的问题答案的朋友们,正是因为有了这种集约的知识技能,鼓励与提醒,才能遇到问题后进行很好的解决。这才是真正意义上的团队精神吧。还有源于客观方面的感受,那就是知识的欠缺,与开发工具的掌握不熟练。这是整个开发过程中的瓶颈。但也正是因为这份瓶颈,而使得我们在完成后,有了跨越式的提升与收获。较重要的是实践操作经验的积累,这是平常无可替代的。其次就是应该注意细节问题,虽然是很小的问题,但可以提高自己的编程的能力,而且还可以培养自己编程的严谨性,同时还可以为以后的编程积累经 16
湖南涉外经济学院信息科学与工程学院
验。编写完这个扫雷游戏,我发现自己有很多不足,主要体现在游戏涉及个算法,对算法不熟悉,其根本原因就是没有扎实的基础。所以在以后的学习中要扎扎实实的学好每一门课程,打好基础。
总的来说,是感谢,感谢此次课程设计,及此次课程设计所涉及到的老师、
同学、朋友以及网络上不认识的人及知识。感谢你们。
17
湖南涉外经济学院信息科学与工程学院
参考文献
[1] 王晓东. 《计算机算法设计与分析》(第3版). 北京. 电子工业出版社
[2] 谭浩强《c程序设计》(第三版). 北京. 清华大学出版社
[3] 刘瑞新. 《C#网络编程及应用》.北京.机械工业出版设
[4] 张淮鑫. 《C#开发宝典》.北京.中国铁道出版社
18