1、C语言程序设计扫雷游戏C语言程序设计扫雷游戏C语言程序设计报告题目: 扫雷小游戏设计 电子通信与物理学院日期: 2018 年 7 月 12 日1. 课程设计内容 12. 课程设计目的 13. 背景知识 14. 工具/准备工作 35. 设计步骤、方法 35.1 35.2定义全局变量 45.3挖雷部分函数的分析 51. 课程设计内容 在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小
2、游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。我利用C-free编写了与它功能相仿的挖地雷游戏,寓学于乐。即:设计一个功能与Windows中的挖雷游戏相同的小游戏。2. 课程设计目的 1培养学生综合运用所学知识独立完成课题的能力。 2试学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。 3提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。 4培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 5培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到解决问题的新途径的悟性,初步培养工程意识
3、和创新能力。 6对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核 3. 背景知识游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷 。 游戏的基本操作包括左键单击(Left Click)、右键单击(Right Click)、双击(Chordin
4、g)三种。其中左键用于打开安全的格子,推进游戏进度;右键用于标记地雷,以辅助判断,或为接下来的双击做准备;双击在一个数字周围的地雷标记完时,相当于对数字周围未打开的方块均进行一次左键单击操作:左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块上出现数字,则该数字表示其周围33区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。 双击:同时按下左键和右键完成双击。当双击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行
5、一次左键单击操作。地雷未标记完全时使用双击无效。若数字周围有标错的地雷,则游戏结束,标错的地雷上会显示一个“ ”(见下图) 扫雷的设计原理: 扫雷游戏分为几个步骤: 第一步,使用二维数组表示地图; 第二步,随机生成几个地雷; 第三步,点击方格的反应,计算每个非雷区方格点开后的数字; 第四步,当方格数字为0的情况; 第五步,当方格为地雷的情况。 第一步地图的大小和第二步地雷的数量都应该是程序中给定的,或者玩家输入的。这个是多少自己决定吧。第三步,计算非雷区方格点开后的数字就把这个方格在二维数组中周围八个方向的方格是否是地雷都检查一遍,一定要注意不要越出数组边界。这个数字可以在游戏初始化时全都计算
6、好,也可以在玩家点击的时候再计算。点击非雷区方格,显示数字,这个方格标记为“已点过”。第四步,当方格数字为0时,这里要用到递归调用,就是让程序自动“点击”这个数字为0方格周围的八个方格,然后再看结果,如果不是0,就停止,如果是0,依然递归调用,直到没有0为止,或者直到点遍所有方格为止,一定要注意不要越出数组边界。第五步,很简单,宣布玩家死亡就可以了。 4. 准备工作 查阅相关资料,了解扫雷的的玩法,了解扫雷的设计思想方法。借鉴他人写过的程序,从中找到突破口。从程序中了解需要的各种函数准备,再进一步获悉该函数的功能与使用方法。 对自己要设计的挖地雷游戏进行功能分析,大致如下: 总体游戏过程分析:
7、在屏幕上显示一个游戏界面,雷区范围内预先埋设了一定数量的随机分布的地雷(用数字9代替地雷);玩家通过从键盘中输入(行数X,列数Y)进行点击;若能点中所有非雷区,则游戏胜利;否则踩雷,游戏失败。 简易版扫雷游戏要具备以下功能: 1)开局:首先选择游戏等级,然后生成不同等级的雷区界面。游戏等级分为三级:各等级行列数为:简单:1010、普通:1515、困难:2020;雷区每个*号下面或埋藏有1个地雷,或者没有地雷; 2)挖雷:从键盘中输入(行数X,列数Y),并按回车键,可挖开它;若所揭方块下有9,则踩雷,此时所有含地雷的块都出现9,该局游戏失败;如果方块上出现数字,它代表 在它周围的8个方块中共有多
8、少颗地雷; 3) 输入:通过键盘输入相关指示信息;4) 输出:提示游戏失败,是否继续再来一遍; 5. 设计步骤、方法 5.1主函数第一步,写出主程序的基本框架,确定各子模块名字和参数。具体的函数流程如图5-3 所示: 定义使用到的常数、全局变量、函数原型说明。然后初始化图形系统,调用游戏控制函数,游戏只接受键盘,通过鼠标结束游戏,关闭系统,退出游戏。 主控模块的各子模块说明:void InitialValue_game( )用于棋盘初始化; InitialMine_game( )用于棋盘的随机布雷; void print_game( )用于打印棋盘;int judge_game( )用于判断游
9、戏是否结束; int openmap( )用于点开地图; 5.2定义全局变量 #include #include stdlib.h #includetime.h # define s 20 int x; /*棋盘行数*/ int y; /*棋盘列数*/ int b; /*选择游戏难度 1简单2普通3困难4 自定义*/ int h; /*雷的个数*/ struct Games g; struct Games int game_intss; char game_charss; ; 使用结构体数组来完成棋盘的定义,引用时间头文件来完成对随机布雷的随时性。 5.3挖雷部分函数的分析 void Init
10、ialValue_game(struct Games *g) int i,j; for(i=0; ix; i+) for(j=0; jy; j+) (*g).game_intij=0; (*g).game_charij=*; InitialMine_game(struct Games *g) int i,j,next1,next2; int sum=0; srand(unsigned)time(NULL); while(1) i=rand()%x; j=rand()%y; if(*g).game_intij=9) continue; (*g).game_intij=9; +sum; for(n
11、ext1=-1; next12; next1+) for(next2=-1; next22; next2+) if( -1i+next1 & next1+ix& -1j+next2 & j+next2y ) if(*g).game_inti+next1j+next2!=9) (*g).game_inti+next1j+next2+=1; if(sum=b) break; void print_game(struct Games *g,int Logo) int i,j; int as; for(i=0; ix; i+) ai=i+1; if(Logo=1) printf( %d,a0); fo
12、r(i=1; ix; i+) printf(i10? %d : %d,ai); printf(nn); for(i=0; ix; i+) if(i+110) printf(%d ,i+1); for(j=0; jy; j+) printf(%d ,(*g).game_intij); printf(n); else printf(%d ,i+1); for(j=0; jy; j+) printf(%d ,(*g).game_intij); printf(n); if(Logo=2) printf( %d,a0); for(i=1; ix; i+) printf(i10? %d : %d,ai);
13、 printf(nn); for(i=0; ix; i+) if(i+110) printf(%d ,i+1); for(j=0; jy; j+)printf(%c ,(*g).game_charij); printf(n); else printf(%d ,i+1); for(j=0; jy; j+)printf(%c ,(*g).game_charij); printf(n); int judge_game(struct Games *g) int sum=0; int i,j; for(i=0; ix; i+) for(j=0; jy; j+) if(*g).game_charij=*)
14、 sum+=1; return sum;int openmap(struct Games *g,int i,int j) system(cls); int next1,next2; if(*g).game_intij=9) return 1; else if(*g).game_intij!=0) (*g).game_charij=(char)(*g).game_intij+48); return 2; else (*g).game_charij=0; for(next1=-1; next12; next1+) for(next2=-1; next22; next2+) if( -1i+next
15、1 & next1+ix & -1j+next2 & j+next2y) if(*g).game_chari+next1j+next2=*) openmap(g,i+next1,j+next2); return 2; 6. 设计结果及分析 运行第一步:按ENTER键进入:选择游戏难度(简单、普通、困难、任意),按ENTER键进入:简单难度:普通难度:困难难度:任意难度:游戏界面,开始从键盘输入数字,格式为(行数X,列数Y),点击Enter键:游戏结束页面:7. 设计结论 一学期结束了,对C语言也有了一些认识,不过自我感觉学得不太好,好在还是学到了知识: 了解了C的发展以及编程的基本步骤,学会了
16、Printf输出语句,C语言的运算,知道了有哪几种数据类型,还有我觉得经常用的if语句,if- -eles语句,for循环,while 语句,do-while语句等等,基本会用数组和指针,还有字符串的处理,对了还有才学的结构体。 还有许多知识点,不一罗列了, 总之C语言要学的东西太多了,听大三的都说C很简单,但我并不认为他像人们说的那样简单,C是最基础的,基础不代表简单,也可能是我没学好才有这样的感受。 在这次设计过程中,不仅复习课本上所学知识,还通过查资料、问同学学到了课本上没有的知识。从而启发我,要想写好程序,在写好课本知识的同时还需要多读和专业有关的一些书籍,同时还需要多动脑子,尽量把所
17、学的知识综合起来应用,力争写出完美的程序。除此之外,我还得到了一些有用的教训:写程序时必须要细心,不能输错一个字符标点,就连全角半角也得注意。在修改时要有耐心,编译出错后必须逐个错误去改正,绝不能心急浮躁,否则修改之后还会有新的错误。 8. 参考文献郭翠英主编的C语言课程设计实例精编; 张芳妮 吕波 译C语言编程常见问题解答; 谭浩强C程序设计题解与上机指导(第二版)。 伍俊良.VB课程设计与系统开发案例M.北京 附录:#include #include stdlib.h#includetime.h# define s 20int x; /*棋盘行数*/int y; /*棋盘列数*/int b
18、; /*选择游戏难度 1简单2普通3困难4 自定义*/int h; /*雷的个数*/struct Games g;struct Games int game_intss; char game_charss;main() int i,j;/*定义i,j变量*/ int NO; int begin=1; int h;/*确定雷的个数*/ while(begin) printf (nnnnnnn ttt=n ttt 欢迎进入扫雷 nnn ttt 按回车键继续 n ttt=n ttt n); getchar(); /*游戏开始界面*/ system(cls); printf( nnnnnnnnn);
19、printf( 请选择游戏难度:nn); printf( 1简单难度nn); printf( 2普通难度nn); printf( 3困难难度nn); printf( 4自定义难度nn); scanf(%d,&h); getchar();/*确定游戏难度*/ if(0h&h5) switch(h) case 1: x=10; y=10; b=10; break;/*简单难度*/ case 2: x=15; y=15; b=40; break;/*普通难度*/ case 3: x=20; y=20; b=60; break;/*困难难度*/ case 4: system(cls); printf(
20、请输入棋盘行列数(小于20且用逗号隔开):); /*从键盘输入坐标*/ scanf(%d,%d,&x,&y); getchar(); printf(请输入雷的个数:);/*从键盘输入雷的个数*/ scanf(%d,&b); getchar(); break; break; else printf(输入错误请重新输n); while(begin) system(cls); InitialValue_game(&g);/*棋盘初始化*/ InitialMine_game(&g);/*随机布雷*/ print_game(&g,2);/*打印棋盘*/ NO=1; while(NO) printf(Pl
21、ease choose:); scanf(%d,%d,&i,&j); getchar(); if(-1i-1 & i-1x & -1j-1 & j-1y) switch(openmap(&g,i-1,j-1) case 1: print_game(&g,1); printf(游戏结束!按回车键再来一局n); if(getchar()=n) begin=1; else begin=0; NO=0; break; case 2: if(judge_game(&g)=b) printf(win!n); print_game(&g,1); printf(按回车键再来一局n);/*是否再来一局*/ if
22、(getchar()=n) begin=1; else begin=0; NO=0; break; else print_game(&g,2); NO=1; break; default: break; else printf(你输入错误!请重新输入n); void InitialValue_game(struct Games *g) int i,j; for(i=0; ix; i+) for(j=0; jy; j+) (*g).game_intij=0; (*g).game_charij=*; InitialMine_game(struct Games *g) int i,j,next1,n
23、ext2; int sum=0; srand(unsigned)time(NULL); while(1) i=rand()%x; j=rand()%y; if(*g).game_intij=9) continue; (*g).game_intij=9; +sum; for(next1=-1; next12; next1+) for(next2=-1; next22; next2+) if( -1i+next1 & next1+ix& -1j+next2 & j+next2y ) if(*g).game_inti+next1j+next2!=9) (*g).game_inti+next1j+ne
24、xt2+=1; if(sum=b) break; void print_game(struct Games *g,int Logo) int i,j; int as; for(i=0; ix; i+) ai=i+1; if(Logo=1) printf( %d,a0); for(i=1; ix; i+) printf(i10? %d : %d,ai); printf(nn); for(i=0; ix; i+) if(i+110) printf(%d ,i+1); for(j=0; jy; j+) printf(%d ,(*g).game_intij); printf(n); else prin
25、tf(%d ,i+1); for(j=0; jy; j+) printf(%d ,(*g).game_intij); printf(n); if(Logo=2) printf( %d,a0); for(i=1; ix; i+) printf(i10? %d : %d,ai); printf(nn); for(i=0; ix; i+) if(i+110) printf(%d ,i+1); for(j=0; jy; j+)printf(%c ,(*g).game_charij); printf(n); else printf(%d ,i+1); for(j=0; jy; j+)printf(%c
26、,(*g).game_charij); printf(n); int judge_game(struct Games *g) int sum=0; int i,j; for(i=0; ix; i+) for(j=0; jy; j+) if(*g).game_charij=*) sum+=1; return sum;int openmap(struct Games *g,int i,int j) system(cls); int next1,next2; if(*g).game_intij=9) return 1; else if(*g).game_intij!=0) (*g).game_charij=(char)(*g).game_intij+48); return 2; else (*g).game_charij=0; for(next1=-1; next12; next1+) for(next2=-1; next22; next2+) if( -1i+next1 & next1+ix & -1j+next2 & j+next2y) if(*g).game_chari+next1j+next2=*) openmap(g,i+next1,j+next2);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1