下载此文档

扫雷游戏实验报告1.doc


文档分类:IT计算机 | 页数:约26页 举报非法文档有奖
1/26
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/26 下载此文档
文档列表 文档介绍
该【扫雷游戏实验报告1 】是由【薛定谔的猫】上传分享,文档一共【26】页,该文档可以免费在线阅读,需要了解更多关于【扫雷游戏实验报告1 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。简易版扫雷游戏实验报告
一、问题描述
模仿windows扫雷游戏,开发一个简易版扫雷游戏系统。
二、功能分析
总体游戏过程分析:在屏幕中央位置显示一个雷区,雷区范围内预先埋设了一定数量的随机分布的地雷;玩家通过上下左右键控制光标在雷区的各个小方块之间移动并做标记;若能正确标记出雷区中的所有地雷,则游戏胜利;否则踩雷,游戏失败。
简易版扫雷游戏要具备以下功能:
开局:首先选择游戏等级,然后生成不同等级的雷区界面。游戏等级分为三级:各等级方块数为——初级:8×8、中级:16×16、高级:24×24;各级地雷数=总方块数/6;雷区每个方块下面或埋藏有1个地雷,或者没有地雷;
挖雷:将光标移到某个方块,并按空格或回车键,可挖开它;若所揭方块下有雷,则踩雷,此时所有含地雷的块都标记ã,该局游戏失败;如果方块上出现数字,它代表在它周围的8个方块中共有多少颗地雷;
标记地雷:在光标所在的某个方块上按F或f键,则标记此块下埋着地雷(实际上可能是误标),显示为F。每标记一个地雷,地雷
数减少1;
标记疑问:在光标所在的某个方块上按Q或q键,则在某方块上面标一个问号(?),意味着没有把握判定它是否有雷。标记为?的块可在恰当的时候再按标记地雷或挖开;
自动挖开:如果某个数字方块周围的地雷全都标记完,则在该方块上按A或a键,将其剩下的方块挖开;
输入:通过键盘输入相关指示信息;
输出:提示游戏是否成功,是否继续。
三、程序设计
开局
扫雷游戏(主框架)
输入
挖雷
标记雷题
标记疑问
自动挖开
输出
图1扫雷系统的顶层层次图
扫雷游戏系统的顶层层次图如下:
从以下几方面“自顶向下”进一步逐步求精:
继续分析已有功能,直到精化出所有子功能,确定模块间接口;
描述精化后每个模块的处理过程;
确定主要的数据及其数据结构;
确定输入输出数据的内外部形式;
界面的设计
以下是详细设计:
图2扫雷游戏的界面
(1)确定游戏的界面。游戏屏幕中央显示由小方块组成的雷区,小方块的背景显示为浅灰,表示该方块没有被挖开或标记;小方块的背景显示为深灰,表示它已经被挖开或标记为“F”、“?”或“*”;当选中一个方块要操作时,它的边框线为红色。在屏幕的左上方显示游戏是否成功等信息,这也是游戏结果的表现形式。如图2所示。
(2)决定游戏的输入方式。采用键盘,通过光标的移动来选择操作的小方块,根据所敲击的键值来选择游戏的功能。
下面是对键盘功能键的定义:
上,下,左,右键用来移动光标的位置;
回车或者空格键用来挖开光标当前指向的一个方块;
F,f标记当前光标指向的方块有地雷;
Q,q在光标指向方块打一个问号,表示可能有地雷;
A,a自动挖开光标周围的方块;
ESC退出游戏。
(3)确定主要的数据,这里主要是有关雷区的数据。
雷区界面数据
intMAXCOL=640;/*屏幕最大宽度*/
intMAXROW=480;/*屏幕最大高度*/
#define_ROW24/*雷区最多方块行数*/
#define_COL24/*雷区最多方块列数*/
intROW=8;/*当前游戏雷区行数*/
intCOL=8;/*当前游戏雷区列数*/
#defineSIZEX20/*雷区方块的水平大小(像素数)*/
#defineSIZEY20/*雷区方块的垂直大小(像素数)*/
#defineSTARTX(MAXCOL-COL*SIZEX)/2/*水平起始位置*/
#defineSTARTY(MAXROW-ROW*SIZEY)/2/*垂直起始位置*/
雷区内部数据
inttotalMine;/*整个雷区所含的地雷总数*/
inttable[_ROW][_COL];/*数组table的每个元素值记录了雷区对应方块是否有雷:1表示有雷,0表示没有雷*/
intnum[_ROW][_COL];
/*数组num的每个元素值记录了雷区对应方块周围有多少个地雷*/
intflag[_ROW][_COL];
/*数组flag的每个元素值记录了雷区对应方块当前的状态*/
在整个系统中table[_ROW][_COL]、num[_ROW][_COL]、flag[_ROW][_COL]是最核心的数据,是雷区的内部表示,游戏的挖雷、标记雷、标记疑问、自动挖开等界面操作,在内部实际上是对这些数据的操作。
方块(i,j)的状态取值:
#defineUNFLAG0/*表示该方块还没有被打开或者标记*/
#defineFLAGED1/*标记该方块有地雷*/
#defineQUESTION20/*表示该方块可能有地雷*/
#defineEXPLOD30/*踩到地雷爆炸了*/
#defineOPEN40/*一个没有地雷的方块被打开*/
光标当前位置数据
intpi,pj;/*记录光标的当前位置,初始时光标在(0,0)上*/
intdi[8]={-1,-1,0,1,1,1,0,-1};/*x方向偏移量*/
intdj[8]={0,1,1,1,0,-1,-1,-1};/*y方向偏移量*/
游戏状态数据
intgameRes;
/*记录游戏结束的结果状态,值为0表示按esc键退出游戏;-1表示游戏失败;gameRes=1表示游戏胜利。实际为输出数据的内部形式*/
功能键的键值
/*为避免书写错误和明确含义,对系统的按键值用符号常量来定义*/
/*上,下,左,右键*/
#defineUP0x4800
#defineDOWN0x5000
#defineLEFT0x4b00
#defineRIGHT0x4d00
/*回车、空格键*/
#defineENTER0x1c0d
#defineSPACE0x3920
/*F,f*/
#defineUPPERF0x2146
#defineLOWERF0x2166
/*Q,q*/
#defineUPPERQ0x1051
#defineLOWERQ0x1071
/*A,a*/
#defineUPPERA0x1e41
#defineLOWERA0x1e61
/*ESC*/
#defineESC0x011b
(4)功能模块进一步求精
在C系统中屏幕的输出默认的方式是文本方式,所以需要首先将显示方式设置为图形方式。简易版扫雷程序主控模块的流程如图3所示,下面从主控模块入手,继续利用逐步求精的方法来设计系统。
图3扫雷游戏的主控模块流程
图形方式初始化
初始化新游戏
从键盘读入键值
开始
重新游戏?
关闭游戏,结束
是ESC?
对其他键值进行判断处理
本次游戏结束束?
F
T
T
T
F
F
第一步,写出主程序的基本框架,确定各子模块名字和参数。
intmain()
{
initGraph();/*图形显示方式初始化*/
do{
newGame();/*初始化新游戏,即开局*/
intgameRes=0;
do{
intkey=getKey();/*读入操作信息*/
if(key==ESC)
{gameRes=0;break;}
switch(key){
对其他key值进行判断处理;
}
if(checkWin())/*判断游戏是否胜利*/
gameRes=1;
}while(!gameRes);
}while(!confirm(gameRes));
return0;
}
主控模块的各子模块说明:
voidinitGraph()函数:用于将显示器显示方式设置为图形方式。
voidnewGame()函数:开局—初始化新游戏界面及数据。
intgetKey()函数:得到从键盘读入的操作信息。
intcheckWin()函数:用于判断游戏是否获胜。若返回值为1表示胜利,返回值为0表示游戏还没结束。
intconfirm(int)函数:用于判断游戏是否重新开始。参数的值来自gameRes,gameRes=0,表示按esc键退出游戏;gameRes=-1,表示踩到地雷,游戏失败;gameRes=1,表示游戏胜利。Confirm的返回值为0表示重新开始游戏;为1表示关闭游戏,退出程序。
第二步,对“图形初始化”功能模块进一步求精。
voidinitGraph()
{
intgdriver=DETECT,gmode,errorcode;/*自动检测最高图形模式*/
initgraph(&gdriver,&gmode,"");/*初始化图形模式*/
errorcode=graphresult();/*读取初始化结果*/
if(errorcode!=grOk){/*如果有错误发生*/
printf("Graphicserror:%s\n",grapherrormsg(errorcode));
printf("Pressanykeytohalt:");
getch();
exit(1);/*返回错误码*/
}
MAXCOL=getmaxx();/*获取当前屏幕最大宽度*/
MAXROW=getmaxy();/*获取当前屏幕最大高度*/
}
第三步,对“初始化新游戏”功能模块进一步求精。
voidnewGame()
{
cleardevice();/*清除屏幕*/
setGrade();/*设置游戏等级*/
generateMine();/*随机生成雷区地雷分布*/
pi=pj=0;/*设置初始光标位置*/
drawTable();/*实现在屏幕上画出雷区*/
}
SetGrade()的继续细化:
voidsetGrade()
功能:设置游戏等级。
参数:无
返回值:无
算法描述:
:
Pleasechoicegrade(JforJunior,MfoeMedium,SforSenior):
:
若该键是’J’或’j’,则表示初级:COL=8;ROW=8;
若该键是’M’或’m’,则表示中级:COL=16;ROW=16;
若该键是’S’或’s’,则表示初级:COL=24;ROW=24;
generateMine()的继续细化:
voidgenerateMine()
功能:随机生成地雷的分布。
参数:无
返回值:无
算法描述:
,存放在变量totalMine中。
,table和num都是全局的二维数组,table记录
坐标(x,y)中是否有地雷,0表示没有地雷,1表示有。
num数组表示和(x,y)相邻的所有小方块中有多少颗地雷。

扫雷游戏实验报告1 来自淘豆网m.daumloan.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数26
  • 收藏数0 收藏
  • 顶次数0
  • 上传人薛定谔的猫
  • 文件大小112 KB
  • 时间2023-03-28
最近更新