C语言程序的设计扫雷游戏实验报告Word格式文档下载.docx
《C语言程序的设计扫雷游戏实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言程序的设计扫雷游戏实验报告Word格式文档下载.docx(25页珍藏版)》请在冰豆网上搜索。
游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。
游戏的基本操作包括左键单击(LeftClick)、右键单击(RightClick)、双击(Chording)三种。
其中左键用于打开安全的格子,推进游戏进度;
右键用于标记地雷,以辅助判断,或为接下来的双击做准备;
双击在一个数字周围的地雷标记完时,相当于对数字周围未打开的方块均进行一次左键单击操作:
左键单击:
在判断出不是雷的方块上按下左键,可以打开该方块。
如果方块上出现数字,则该数字表示其周围3×
3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。
所以扫雷中最大的数字为8);
如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;
如果不幸触雷,则游戏结束。
双击:
同时按下左键和右键完成双击。
当双击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。
地雷未标记完全时使用双击无效。
若数字周围有标错的地雷,则游戏结束,标错的地雷上会显示一个“×
”(见下图)
扫雷的设计原理:
扫雷游戏分为几个步骤:
第一步,使用二维数组表示地图;
第二步,随机生成几个地雷;
第三步,点击方格的反应,计算每个非雷区方格点开后的数字;
第四步,当方格数字为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