admin 管理员组文章数量: 1184232
2024年3月25日发(作者:怎么做app软件)
中南大学
程序设计基础实践报告
学生姓名 张兰兰
学 院 信息科学与工程学院
专业班级 物联网工程1301班
完成时间 2014.1
题 目 设计一个和window系统类似的小游戏【挖地雷】
《计算机程序设计实践》错误!未指定书签。
目 录
1.
课程设计内容 ............................................................................................. 3
2.
课程设计目的 ............................................................................................. 3
3.
背景知识 .................................................................................................... 3
4.
工具/准备工作 ............................................................................................ 5
5.
设计步骤、方法 ......................................................................................... 5
5.1. 步骤1:步骤名称(二级标题) ..........................................................错误!未定义书签。
步骤1.1:步骤名称(三级标题) .............................................................................. 5 5.1.1.
5.2.
5.3.
步骤2:步骤名称 .............................................................................错误!未定义书签。
步骤n:步骤名称 .............................................................................错误!未定义书签。
6.
设计结果及分析 ......................................................................................... 5
7.
设计结论 .................................................................................................. 15
8.
问题及心得体会 ....................................................................................... 16
9.
对本设计过程及方法、手段的改进建议 .................................................... 17
10.
参考文献 .................................................................................................. 17
第 2 页 共 25 页
《计算机程序设计实践》错误!未指定书签。
报告名称
1. 课程设计内容
在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活
的一分,越来越多的人使用计算机办公、娱乐等等。
扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows
操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是
这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。我利
用C-free编写了与它功能相仿的挖地雷游戏,寓学于乐。
即:设计一个功能与Windows中的挖雷游戏相同的小游戏。
2. 课程设计目的
1.培养学生综合运用所学知识独立完成课题的能力。
2.试学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和
方法。
3.提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素
质。
4.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,
全方位考虑问题等科学技术人员应具有的素质。
5.培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到
解决问题的新途径的悟性,初步培养工程意识和创新能力。
6.对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计
能力、书面及口头表达能力进行考核
3. 背景知识
游戏玩法:以windows XP自带扫雷为例
游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位
于右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初
第 3 页 共 25 页
《计算机程序设计实践》错误!未指定书签。
级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,
自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家
需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。
游戏的基本操作包括左键单击(Left Click)、右键单击(Right Click)、双击
(Chording)三种。其中左键用于打开安全的格子,推进游戏进度;右键用于标
记地雷,以辅助判断,或为接下来的双击做准备;双击在一个数字周围的地雷标
记完时,相当于对数字周围未打开的方块均进行一次左键单击操作:
左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块
上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个格子,对于
边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8);如果方块
上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏
结束。
双击:同时按下左键和右键完成双击。当双击位置周围已标记雷数等于该位
置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操
作。地雷未标记完全时使用双击无效。若数字周围有标错的地雷,则游戏结束,
标错的地雷上会显示一个“ ×”(见下图)
扫雷的设计原理:
扫雷游戏分为几个步骤:
第一步,使用二维数组表示地图;
第二步,随机生成几个地雷;
第三步,点击方格的反应,计算每个非雷区方格点开后的数字;
第四步,当方格数字为0的情况;
第五步,当方格为地雷的情况。
第一步地图的大小和第二步地雷的数量都应该是程序中给定的,或者玩家输入
的。这个是多少自己决定吧。第三步,计算非雷区方格点开后的数字就把这个方
格在二维数组中周围八个方向的方格是否是地雷都检查一遍,一定要注意不要越
出数组边界。这个数字可以在游戏初始化时全都计算好,也可以在玩家点击的时
第 4 页 共 25 页
《计算机程序设计实践》错误!未指定书签。
候再计算。点击非雷区方格,显示数字,这个方格标记为“已点过”。第四步,当
方格数字为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.
设计步骤、方法
5.1主函数第一步,写出主程序的基本框架,确定各子模块名字和参数。
具体的函数流程如图5-3 所示:
定义使用到的常数、全局变量、函数原型说明。然后初始化图形系统,调用游戏
第 5 页 共 25 页
《计算机程序设计实践》错误!未指定书签。
控制函数,游戏只接受键盘,通过鼠标结束游戏,关闭系统,退出游戏。
main()
{
int i,j;/*定义i,j变量*/
int NO;
int begin=1;
int h;/*确定雷的个数*/
while(begin)
{
printf ("nnnnnnnnn======================nn"
"ttt| 欢迎进入扫雷 |nnn"
"ttt| 按回车键继续 |nn"
"ttt=================================nnnn"
"ttt 本程序由张兰兰和杜宏亮完成 nnnn");
getchar(); /*游戏开始界面*/
system("cls");
printf(" nnnnnnnnn 请选择游戏难度:nn");
printf(" 1简单难度nn");
printf(" 2普通难度nn");
printf(" 3困难难度nn");
printf(" 4自定义难度nn");
scanf("%d",&h);
getchar();/*确定游戏难度*/
if(0 { switch(h) { case 1: x=10; y=10; b=10; break;/*简单难度*/ case 2: x=15; y=15; 第 6 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 b=40; break;/*普通难度*/ case 3: x=20; y=20; b=60; break;/*困难难度*/ case 4: system("cls"); printf("请输入棋盘行列数(小于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) { 第 7 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 printf("Please choose:"); scanf("%d,%d",&i,&j); getchar(); if(-1 { 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(getchar()=='n') begin=1; else begin=0; NO=0; break; } else print_game(&g,2);NO=1;break; default:break; } } else { printf("你输入错误!请重新输入n"); } } } 第 8 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 } 主控模块的各子模块说明: void InitialValue_game( )用于棋盘初始化; InitialMine_game( )用于棋盘的随机布雷; void print_game( )用于打印棋盘; int judge_game( )用于判断游戏是否结束; int openmap( )用于点开地图; 5.2定义全局变量 #include #include "stdlib.h" #include"time.h" # define s 20 int x; /*棋盘行数*/ int y; /*棋盘列数*/ int b; /*选择游戏难度 1简单2普通3困难4 自定义*/ int h; /*雷的个数*/ struct Games g; struct Games { int game_int[s][s]; char game_char[s][s]; }; 使用结构体数组来完成棋盘的定义,引用时间头文件来完成对随机布雷的随时 性。 5.3各个函数的分析 5.3.1棋盘初始化程序: void InitialValue_game(struct Games *g) { int i,j; for(i=0;i { for(j=0;j { 第 9 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 (*g).game_int[i][j]=0; (*g).game_char[i][j]='*'; } } } 5.3.2随机布雷: 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_int[i][j]==9) continue; (*g).game_int[i][j]=9; ++sum; for(next1=-1;next1<2;next1++) { for(next2=-1;next2<2;next2++) { if( -1 { if((*g).game_int[i+next1][j+next2]!=9) { (*g).game_int[i+next1][j+next2]+=1; } } } } if(sum==b) break; } }实现雷的随机分布和各个点周围雷数的计算。 第 10 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 srand()随机布雷, 5.3.3打印棋盘: void print_game(struct Games *g,int Logo) { int i,j; int a[s]; for(i=0;i { a[i]=i+1; } if(Logo==1) { printf(" %d",a[0]); for(i=1;i printf(i<10? " %d" : " %d",a[i]); printf("nn"); for(i=0;i { if(i+1<10) { printf("%d ",i+1); for(j=0;j printf("n"); } else { printf("%d ",i+1); for(j=0;j printf("n"); } } } if(Logo==2) { 第 11 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 printf(" %d",a[0]); for(i=1;i printf(i<10? " %d" : " %d",a[i]); printf("nn"); for(i=0;i { if(i+1<10) { printf("%d ",i+1); for(j=0;j printf("n"); } else { printf("%d ",i+1); for(j=0;j printf("n"); } } } } 5.3.4判断结束,点开地图: int judge_game(struct Games *g) { int sum=0; int i,j; for(i=0;i { for(j=0;j { if((*g).game_char[i][j]=='*') sum+=1; } } return sum; 第 12 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 } int openmap(struct Games *g,int i,int j) { system("cls"); int next1,next2; if((*g).game_int[i][j]==9) return 1; else { if((*g).game_int[i][j]!=0) { (*g).game_char[i][j]=(char)((*g).game_int[i][j]+48); return 2; } else { (*g).game_char[i][j]='0'; for(next1=-1;next1<2;next1++) { for(next2=-1;next2<2;next2++) { if( -1 { if((*g).game_char[i+next1][j+next2]=='*') { openmap(g,i+next1,j+next2); } } } } return 2; } } } 点开地图,即实现:当输入坐标处为0,打开周围同样情况的坐标点。即实 现和Windows扫雷游戏同样的功能。 第 13 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 6. 设计结果及分析 运行第一步: 按ENTER键进入: 选择游戏难度,按ENTER键进入: 第 14 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 游戏界面,开始从键盘输入数字,格式为(3,6),点击ENTER键: 游戏失败显示,并提示再来一局,程序完毕。 7. 设计结论 本程序在刚开始调试时有许多错误,但都被一一克服,现在在操作本程序时 第 15 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 可根据提示进行相关操作,能正确输出结果。在刚开始的几次调试中曾经出现过 不能运行、不能产生随机数字、不会正确输出结果、不能进行循环等等问题。经 同学的帮助,这些问题得到克服,并且使程序的功能也得到了一定的完善。 在 这次设计过程中,不仅复习课本上所学知识,还通过查资料、问同学学到了课本 上没有的知识。从而启发我,要想写好程序,在写好课本知识的同时还需要多读 和专业有关的一些书籍,同时还需要多动脑子,尽量把所学的知识综合起来应用, 力争写出完美的程序。除此之外,我还得到了一些有用的教训:写程序时必须要 细心,不能输错一个字符标点,就连全角半角也得注意。在修改时要有耐心,编 译出错后必须逐个错误去改正,绝不能心急浮躁,否则修改之后还会有新的错误。 8. 问题及心得体会 ①问题: 在本次实习过程中碰到的编译、连接的错误主要有:缺少变量定义,定义 位置不正确、语法错误、注释的位置等。错误解决方法。 (1)缺少变量定义,定义位置不正确; 由于该程序相对来讲稍有些长,前后有些变量不容易联系起来,但是在错 误信息的提示下一般还是很容易找到。不过需要注意的是在定义的时候有些函 数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位 置要特别留意。为减少这样的错误我后来还是用不同的变量名来表示,结果引 起的那些错误解决 了。 (2) 语法错误; 大多的语法错误在通过书本参考下能够修改。主要是平时缺乏锻炼、不太 注意而产生的。如没有注意具体数据使用是有一定的范围限定;过分重视分号 的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将 文件先打开,对打开的方式 (3) 注释的位置; 程序设计中在注释的时候不能同我们平常写字一样随心所欲,我们应该注 意注释的格式。注释中不能含有c语言可执行的语句! ②心得体会 课程设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这 次比较完整的一个程序的设计,我摆脱了单纯的理论知识学习状态,和实际设计 第 16 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 的结合锻炼了我的综合运用所学的基础知识,解决实际问题的能力,同时也提高 我查阅文献资料、对程序整体的把握等其他能力水平,而且通过对整体的掌控, 对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了 丰富。这是我们都希望看到的也正是我们进行课程设计的目的所在。 虽然设计内容繁多,过程繁琐但我的收获却更加丰富。各种组件的运用,各 种算法的应用,各种控件的利用我都是随着设计的不断深入而不断熟悉并逐步掌 握的。和老师以及同学的沟通交流更使我对程序整体的规划与设计有了新的认识 也对自己提出了新的要求。 提高是有限的但提高也是全面的,正是这一次设计让我积累了许多实际经 验,也必然会让我在未来的工作学习中表现出更高的应变能力和理解力。 顺利如期的完成本次课程设计给了我很大的信心,但是也让多不足的地方, 学习其实就是一个不断完善的过程,正视自己的不足之处,在以后的工作和学习 中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断的完善 自己。 9. 对本设计过程及方法、手段的改进建议 我们认为此程序太过简单,应该更进一步把扫雷界面输出为图型图案。也即 是能够使用方块,然后调用graphics.h库函数rectangle(x,y,xx,yy)画一格矩 形,setfillstyle(SOLID_FILL,color)设置填充方式,floodfill(x+1,y+1,WHITE) 填充方块。让方块看起来有立体感,将矩形上方和左方的边线设为白色,下方和 右方的边线设为黑色。使扫雷界面更加美观。再此基础上增加标记地雷的功能, 比如说使用小红旗,使玩家能够跳过地雷。如果可以的话,可以考虑使用鼠标来 控制点击位置,如果更好的话可以加入声音,比如没有点到雷的开心的声音,点 到雷后的倒霉声。通过老师的指导,这个软件的设计要更趋于人性化,也即是加 入提示输入格式,以解决输入格式错误问题,而不是直接结束,重启。 10. 参考文献 郭翠英主编的《C语言课程设计实例精编》; 张芳妮 吕波 译《C语言编程常见问题解答》; 谭浩强《C程序设计题解与上机指导(第二版)》。 伍俊良.VB课程设计与系统开发案例[M].北京 第 17 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 附:源程序代码:s #include #include "stdlib.h" # include "time.h" # define s 20 int x; /*棋盘行数*/ int y; /*棋盘列数*/ int b; /*选择游戏难度 1简单2普通3困难4 自定义*/ int h; /*雷的个数*/ struct Games g; struct Games { int game_int[s][s]; char game_char[s][s]; }; void InitialValue_game(struct Games *g) /*棋盘初始化*/ { int i,j; for(i=0;i { for(j=0;j { (*g).game_int[i][j]=0; (*g).game_char[i][j]='#'; } } } InitialMine_game(struct Games *g) /*随机布雷*/ { 第 18 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 int i,j,next1,next2; int sum=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;next1<2;next1++) { for(next2=-1;next2<2;next2++) { if( -1 { if((*g).game_int[i+next1][j+next2]!=9) { (*g).game_int[i+next1][j+next2]+=1; } } } } if(sum==b) break; } } void print_game(struct Games *g,int Logo) /*打印棋盘*/ { int i,j; int a[s]; for(i=0;i { 第 19 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 a[i]=i+1; } if(Logo==1) { printf(" %d",a[0]); for(i=1;i printf(i<10? " %d" : " %d",a[i]); printf("nn"); for(i=0;i { if(i+1<10) { printf("%d ",i+1); for(j=0;j printf("n"); } else { printf("%d ",i+1); for(j=0;j printf("n"); } } } if(Logo==2) { printf(" %d",a[0]); for(i=1;i printf(i<10? " %d" : " %d",a[i]); printf("nn"); for(i=0;i { if(i+1<10) { 第 20 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 printf("%d ",i+1); for(j=0;j printf("n"); } else { printf("%d ",i+1); for(j=0;j printf("n"); } } } } int judge_game(struct Games *g) /*判断游戏是否结束*/ { int sum=0; int i,j; for(i=0;i { for(j=0;j { if((*g).game_char[i][j]=='#') sum+=1; } } return sum; } int openmap(struct Games *g,int i,int j) /*点开地图 */ { system("cls"); int next1,next2; 第 21 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 if((*g).game_int[i][j]==9) return 1; else { if((*g).game_int[i][j]!=0) { (*g).game_char[i][j]=(char)((*g).game_int[i][j]+48); return 2; } else { (*g).game_char[i][j]='0'; for(next1=-1;next1<2;next1++) { for(next2=-1;next2<2;next2++) { if( -1 { if((*g).game_char[i+next1][j+next2]=='#') { openmap(g,i+next1,j+next2); } } } } return 2; } } } main() { int i,j; int NO; int begin=1; int h; 第 22 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 while(begin) { printf ( "nnnnnnnnttt=================================nn" "ttt| 欢迎进入扫雷 |nnn" "ttt| 按回车键继续 |nn" "ttt=================================nnnn" ); getchar(); system("cls"); printf(" nnnnnnnnn printf(" printf(" printf(" printf(" scanf("%d",&h); getchar(); if(0 { 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; 请选择游戏难度:nn"); 1简单难度nn"); 2普通难度nn"); 3困难难度nn"); 4自定义难度nn"); 第 23 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 case 4: system("cls"); printf("请输入棋盘行列数(小于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("Please choose:"); scanf("%d,%d",&i,&j); getchar(); if(-1 { switch(openmap(&g,i-1,j-1)) { case 1: 第 24 页 共 25 页 《计算机程序设计实践》错误!未指定书签。 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(getchar()=='n') begin=1; else begin=0; NO=0; break; } else print_game(&g,2);NO=1;break; default:break; } } else { printf("你输入错误!请重新输入n"); } } } } 第 25 页 共 25 页
版权声明:本文标题:C语言程序设计扫雷游戏实验报告 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1711377102a591109.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论