C语言程序设计报告题目:扫雷小游戏设计电子通信与物理学院日期:2018年7月12日指导教师评语目录1.课程设计内容...........................................................................................................12.课程设计目的...........................................................................................................13.背景知识..................................................................................................................14.工具/准备工作..........................................................................................................35.设计步骤、方法.....................................................................................................35.1........................................................................................................................35.2定义全局变量..................................................................................................45.3挖雷部分函数的分析.......................................................................................56.设计结果及分析.....................................................................................................117.设计结论...............................................................................................................168.参考文献...............................................................................................................17附录...........................................................................................................................1711.课程设计内容在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。我利用C-free编写了与它功能相仿的挖地雷游戏,寓学于乐。即:设计一个功能与Windows中的挖雷游戏相同的小游戏。2.课程设计目的1.培养学生综合运用所学知识独立完成课题的能力。2.试学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。3.提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。4.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。5.培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。6.对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核3.背景知识游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于2右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。游戏的基本操作包括左键单击(LeftClick)、右键单击(RightClick)、双击(Chording)三种。其中左键用于打开安全的格子,推进游戏进度;右键用于标记地雷,以辅助判断,或为接下来的双击做准备;双击在一个数字周围的地雷标记完时,相当于对数字周围未打开的方块均进行一次左键单击操作:左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。双击:同时按下左键和右键完成双击。当双击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。地雷未标记完全时使用双击无效。若数字周围有标错的地雷,则游戏结束,标错的地雷上会显示一个“×”(见下图)扫雷的设计原理:扫雷游戏分为几个步骤:第一步,使用二维数组表示地图;第二步,随机生成几个地雷;第三步,点击方格的反应,计算每个非雷区方格点开后的数字;第四步,当方格数字为0的情况;第五步,当方格为地雷的情况。第一步地图的大小和第二步地雷的数量都应该是程序中给定的,或者玩家输入的。这个是多少自己决定吧。第三步,计算非雷区方格点开后的数字就把这个方格在二维数组中周围八个方向的方格是否是地雷都检查一遍,一定要注意不要越出数组边界。这个数字可以在游戏初始化时全都计算好,也可以在玩家点击的时候再计算。点3击非雷区方格,显示数字,这个方格标记为“已点过”。第四步,当方格数字为0时,这里要用到递归调用,就是让程序自动“点击”这个数字为0方格周围的八个方格,然后再看结果,如果不是0,就停止,如果是0,依然递归调用,直到没有0为止,或者直到点遍所有方格为止,一定要注意不要越出数组边界。第五步,很简单,宣布玩家死亡就可以了。4.准备工作查阅相关资料,了解扫雷的的玩法,了解扫雷的设计思想方法。借鉴他人写过的程序,从中找到突破口。从程序中了解需要的各种函数准备,再进一步获悉该函数的功能与使用方法。对自己要设计的挖地雷游戏进行功能分析,大致如下:总体游戏过程分析:在屏幕上显示一个游戏界面,雷区范围内预先埋设了一定数量的随机分布的地雷(用数字9代替地雷);玩家通过从键盘中输入(行数X,列数Y)↙进行点击;若能点中所有非雷区,则游戏胜利;否则踩雷,游戏失败。简易版扫雷游戏要具备以下功能:1)开局:首先选择游戏等级,然后生成不同等级的雷区界面。游戏等级分为三级:各等级行列数为———:简单:10×10、普通:15×15、困难:20×20;雷区每个*号下面或埋藏有1个地雷,或者没有地雷;2)挖雷:从键盘中输入(行数X,列数Y),并按回车键,可挖开它;若所揭方块下有9,则踩雷,此时所有含地雷的块都出现9,该局游戏失败;如果方块上出现数字,它代表在它周围的8个方块中共有多少颗地雷;3)输入:通过键盘输入相关指示信息;4)输出:提示游戏失败,是否继续再来一遍;5.设计步骤、方法45.1主函数第一步,写出主程序的基本框架,确定各子模块名字和参数。具体的函数流程如图5-3所示:定义使用到的常数、全局变量、函数原型说明。然后初始化图形系统,调用游戏控制函数,游戏只接受键盘,通过鼠标结束游戏,关闭系统,退出游戏。主控模块的各子模块说明:voidInitialValue_game()用于棋盘初始化;InitialMine_game()用于棋盘的随机布雷;voidprint_game()用于打印棋盘;intjudge_game()用于判断游戏是否结束;intopenmap()用于点开地图;5.2定义全局变量#includestdio.h#includestdlib.h#includetime.h#defines20intx;/*棋盘行数*/inty;/*棋盘列数*/intb;/*选择游戏难度1简单2普通3困难4自定义*/inth;/*雷的个数*/structGamesg;5structGames{intgame_int[s][s];chargame_char[s][s];};使用结构体数组来完成棋盘的定义,引用时间头文件来完成对随机布雷的随时性。5.3挖雷部分函数的分析voidInitialValue_game(structGames*g){inti,j;for(i=0;ix;i++){for(j=0;jy;j++){(*g).game_int[i][j]=0;(*g).game_char[i][j]='*';}}}InitialMine_game(structGames*g){6inti,j,next1,next2;intsum=0;srand((unsigned)time(NULL));while(1){i=rand()%x;j=rand()%y;if((*g).game_int[i][j]==9)continue;(*g).game_int[i][j]=9;++sum;for(next1=-1;next12;next1++){for(next2=-1;next22;next2++){if(-1i+next1&&next1+ix&&-1j+next2&&j+next2y){if((*g).game_int[i+next1][j+next2]!=9){(*g).game_int[i+next1][j+next2]+=1;}}}}7if(sum==b)break;}}voidprint_game(structGames*g,intLogo){inti,j;inta[s];for(i=0;ix;i++){a[i]=i+1;}if(Logo==1){printf(%d,a[0]);for(i=1;ix;i++)printf(i10?%d:%d,a[i]);printf(\n\n);for(i=0;ix;i++){if(i+110){printf(%d,i+1);for(j=0;jy;j++)printf(%d,(*g).game_int[i][j]);8printf(\n);}else{printf(%d,i+1);for(j=0;jy;j++)printf(%d,(*g).game_int[i][j]);printf(\n);}}}if(Logo==2){printf(%d,a[0]);for(i=1;ix;i++)printf(i10?%d:%d,a[i]);printf(\n\n);for(i=0;ix;i++){if(i+110){printf(%d,i+1);for(j=0;jy;j++)printf(%c,(*g).game_char[i][j]);printf(\n);9}else{printf(%d,i+1);for(j=0;jy;