C语言程序设计扫雷游戏实验报告Word下载.docx
《C语言程序设计扫雷游戏实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《C语言程序设计扫雷游戏实验报告Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
如果不幸触雷,则游戏结束。
双击:
同时按下左键和右键完成双击。
当双击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。
地雷未标记完全时使用双击无效。
若数字周围有标错的地雷,则游戏结束,标错的地雷上会显示一个“×
”(见下图)
扫雷的设计原理:
扫雷游戏分为几个步骤:
第一步,使用二维数组表示地图;
第二步,随机生成几个地雷;
第三步,点击方格的反应,计算每个非雷区方格点开后的数字;
第四步,当方格数字为0的情况;
第五步,当方格为地雷的情况。
第一步地图的大小和第二步地雷的数量都应该是程序中给定的,或者玩家输入的。
这个是多少自己决定吧。
第三步,计算非雷区方格点开后的数字就把这个方格在二维数组中周围八个方向的方格是否是地雷都检查一遍,一定要注意不要越出数组边界。
这个数字可以在游戏初始化时全都计算好,也可以在玩家点击的时候再计算。
点击非雷区方格,显示数字,这个方格标记为“已点过”。
第四步,当方格数字为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所示:
定义使用到的常数、全局变量、函数原型说明。
然后初始化图形系统,调用游戏控制函数,游戏只接受键盘,通过鼠标结束游戏,关闭系统,退出游戏。
main()
{
inti,j;
/*定义i,j变量*/
intNO;
intbegin=1;
inth;
/*确定雷的个数*/
while(begin)
{
printf("
\n\n\n\n\n\n\n\n\n======================\n\n"
"
\t\t\t|欢迎进入扫雷|\n\n\n"
\t\t\t|按回车键继续|\n\n"
\t\t\t=================================\n\n\n\n"
"
\t\t\t本程序由张兰兰和杜宏亮完成\n\n\n\n"
);
getchar();
/*游戏开始界面*/
system("
cls"
printf("
\n\n\n\n\n\n\n\n\n请选择游戏难度:
\n\n"
1简单难度\n\n"
2普通难度\n\n"
3困难难度\n\n"
4自定义难度\n\n"
scanf("
%d"
&
h);
/*确定游戏难度*/
if(0<
h&
&
h<
5)
{
switch(h)
case1:
x=10;
y=10;
b=10;
break;
/*简单难度*/
case2:
x=15;
y=15;
b=40;
/*普通难度*/
case3:
x=20;
y=20;
b=60;
/*困难难度*/
case4:
system("
请输入棋盘行列数(小于20且用逗号隔开):
"
/*从键盘输入坐标*/
%d,%d"
x,&
y);
请输入雷的个数:
/*从键盘输入雷的个数*/
b);
}
else
输入错误请重新输\n"
InitialValue_game(&
g);
/*棋盘初始化*/
InitialMine_game(&
/*随机布雷*/
print_game(&
g,2);
/*打印棋盘*/
NO=1;
while(NO)
Pleasechoose:
i,&
j);
if(-1<
i-1&
i-1<
x&
-1<
j-1&
j-1<
y)
switch(openmap(&
g,i-1,j-1))
g,1);
游戏结束!
按回车键再来一局\n"
if(getchar()=='
\n'
)begin=1;
elsebegin=0;
NO=0;
if(judge_game(&
g)==b)
win!
!
\n"
/*是否再来一局*/
elseprint_game(&
NO=1;
break;
default:
你输入错误!
请重新输入\n"
}
主控模块的各子模块说明:
voidInitialValue_game()用于棋盘初始化;
InitialMine_game()用于棋盘的随机布雷;
voidprint_game()用于打印棋盘;
intjudge_game()用于判断游戏是否结束;
intopenmap()用于点开地图;
5.2定义全局变量
#include<
stdio.h>
#include"
stdlib.h"
#include"
time.h"
#defines20
intx;
/*棋盘行数*/
inty;
/*棋盘列数*/
intb;
/*选择游戏难度1简单2普通3困难4自定义*/
inth;
/*雷的个数*/
structGamesg;
structGames
intgame_int[s][s];
chargame_char[s][s];
};
使用结构体数组来完成棋盘的定义,引用时间头文件来完成对随机布雷的随时性。
5.3各个函数的分析
5.3.1棋盘初始化程序:
voidInitialValue_game(structGames*g)
for(i=0;
i<
x;
i++)
for(j=0;
j<
y;
j++)
(*g).game_int[i][j]=0;
(*g).game_char[i][j]='
*'
;
5.3.2随机布雷:
InitialMine_game(structGames*g)
inti,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;
next1<
2;
next1++)
for(next2=-1;
next2<
next2++)
if(-1<
i+next1&
next1+i<
x&
j+next2&
j+next2<
y)
if((*g).game_int[i+next1][j+next2]!
=9)
(*g).game_int[i+next1][j+next2]+=1;
if(sum==b)break;
}实现雷的随机分布和各个点周围雷数的计算。
srand()随机布雷,
5.3.3打印棋盘:
voidprint_game(structGames*g,intLogo)
inta[s];
a[i]=i+1;
if(Logo==1)
%d"
a[0]);
for(i=1;
printf(i<
10?
:
a[i]);
if(i+1<
10)
%d"
i+1);
j++)printf("
(*g).game_int[i][j]);
if(Logo==2)
j++)printf("
%c"
(*g).game_char[i][j]);
5.3.4判断结束,点开地图:
intjudge_game(structGames*g)
if((*g).game_char[i][j]=='
)sum+=1;
returnsum;
intopenmap(structGames*g,inti,intj)
{
intnext1,next2;
if((*g).game_int[i][j]==9)return1;
if((*g).game_int[i][j]!
=0)
(*g).game_char[i][j]=(char)((*g).game_int[i][j]+48);
return2;
0'
if((*g).game_char[i+next1][j+next2]=='
)
openmap(g,i+next1,j+next2);
}
}点开地图,即实现:
当输入坐标处为0,打开周围同样情况的坐标点。
即实现和Windows扫雷游戏同样的功能。
6.设计结果及分析
运行第一步:
按ENTER键进入:
选择游戏难度,按ENTER键进入:
游戏界面,开始从键盘输入数字,格式为(3,6),点击ENTER键:
游戏失败显示,并提示再来一局,程序完毕。
7.设计结论
本程序在刚开始调试时有许多错误,但都被一一克服,现在在操作本程序时可根据提示进行相关操作,能正确输出结果。
在刚开始的几次调试中曾经出现过不能运行、不能产生随机数字、不会正确输出结果、不能进行循环等等问题。
经同学的帮助,这些问题得到克服,并且使程序的功能也得到了一定的完善。
在这次设计过程中,不仅复习课本上所学知识,还通过查资料、问同学学到了课本上没有的知识。
从而启发我,要想写好程序,在写好课本知识的同时还需要多读和专业有关的一些书籍,同时还需要多动脑子,尽量把所学的知识综合起来应用,力争写出完美的程序。
除此之外,我还得到了一些有用的教训:
写程序时必须要细心,不能输错一个字符标点,就连全角半角也得注意。
在修改时要有耐心,编译出错后必须逐个错误去改正,绝不能心急浮躁,否则修改之后还会有新的错误。
8.问题及心得体会
①问题:
在本次实习过程中碰到的编译、连接的错误主要有:
缺少变量定义,定义位置不正确、语法错误、注释的位置等。
错误解决方法。
(1)缺少变量定义,定义位置不正确;
由于该程序相对来讲稍有些长,前后有些变量不容易联系起来,但是在错误信息的提示下一般还是很容易找到。
不过需要注意的是在定义的时候有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置要特别留意。
为减少这样的错误我后来还是用不同的变量名来表示,结果引起的那些错误解决了。
(2)语法错误;
大多的语法错误在通过书本参考下能够修改。
主要是平时缺乏锻炼、不太注意而产生的。
如没有注意具体数据使用是有一定的范围限定;
过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;
在使用文件的时候忘记将文件先打开,对打开的方式
(3)注释的位置;
程序设计中在注释的时候不能同我们平常写字一样随心所欲,我们应该注意注释的格式。
注释中不能含有c语言可执行的语句!
②心得体会
课程设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比较完整的一个程序的设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我的综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富。
这是我们都希望看到的也正是我们进行课程设计的目的所在。
虽然设计内容繁多,过程繁琐但我的收获却更加丰富。
各种组件的运用,各种算法的应用,各种控件的利用我都是随着设计的不断深入而不断熟悉并逐步掌握的。
和老师以及同学的沟通交流更使我对程序整体的规划与设计有了新的认识也对自己提出了新的要求。
提高是有限的但提高也是全面的,正是这一次设计让我积累了许多实际经验,也必然会让我在未来的工作学习中表现出更高的应变能力和理解力。
顺利如期的完成本次课程设计给了我很大的信心,但是也让多不足的地方,学习其实就是一个不断完善的过程,正视自己的不足之处,在以后的工作和学习中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断的完善自己。
9.对本设计过程及方法、手段的改进建议
我们认为此程序太过简单,应该更进一步把扫雷界面输出为图型图案。
也即是能够使用方块,然后调用graphics.h库函数rectangle(x,y,xx,yy)画一格矩形,setfillstyle(SOLID_FILL,color)设置填充方式,floodfill(x+1,y+1,WHITE)填充方块。
让方块看起来有立体感,将矩形上方和左方的边线设为白色,下方和右方的边线设为黑色。
使扫雷界面更加美观。
再此基础上增加标记地雷的功能,比如说使用小红旗,使玩家能够跳过地雷。
如果可以的话,可以考虑使用鼠标来控制点击位置,如果更好的话可以加入声音,比如没有点到雷的开心的声音,点到雷后的倒霉声。
通过老师的指导,这个软件的设计要更趋于人性化,也即是加入提示输入格式,以解决输入格式错误问题,而不是直接结束,重启。
10.参考文献
郭翠英主编的《C语言课程设计实例精编》;
张芳妮吕波译《C语言编程常见问题解答》;
谭浩强《C程序设计题解与上机指导(第二版)》。
伍俊良.VB课程设计与系统开发案例[M].北京
附:
源程序代码:
s
#include"
#'
(*g).ga