1、6游戏可有以下结束方式: 成功结束:当前所有非雷区都被标出,程序自动把有雷的方格标为红色,游戏结束,并显示当前玩家分数。 失败结束:情况1:当时间全部用完,而界面仍有非雷方格未标出,则游戏结束。 情况2:遇到雷爆炸并已经用完所有防雷服,则游戏结束。 情况3:游戏过程中,按结束按钮,强行终止。7设置游戏的排行榜,显示玩家排名。拓展功能:1增加时间显示。每一局限定在同一个预先设置的时间段内完成,动态记时并显示,当某一局到达限定时间,则游戏结束(但保留主界面)。2探测仪功能增加为点击本格翻开周围的8个格子。3当游戏成功结束后,可以进行下一局游戏。4 设计一种方法,可以显示非雷方格周边的地雷数。1.1
2、.1游戏功能介绍(1) 通过visual studio 2010进入扫雷游戏界面。(2) 进入游戏控制区域。点击开始,输入用户名,开始计时,同时游戏开始。(3) 成功完成游戏的标志是:在规定时间内 ,挖开所有的非雷方格。三种情况视为失败:1.2 界面需求游戏欢迎界面中:程序运行后,即出现欢迎界面,并显示作者姓名学号,采用闪动字体的形式,使画面生动,按任意键进入游戏。游戏初始界面:游戏界面分为控制区,信息区,游戏区,此时可以点击开始,进入游戏。游戏进行中:游戏以失败结束画面:1.3开发与运行环境需求开发环境:Visual studio 2010运行环境: Win7 2概要设计 游戏流程图:2.1
3、主要数据结构设计:2.1.1二维数组1、 记录每个方格中信息的二维数组mine992、 记录每个方格中信息作为备用的二维数组mine2993、 记录每个方格中信息作为备用的二维数组mine3992.1.2全局变量1 int mine99记录每个方格中信息的二维数组2 int mine299记录每个方格中信息作为备用的二维数组3、int life记录该游戏进行中玩家生命值。4、int mark当前玩家的得分5、time_t start初始时间6、time_t now当前时间7、int time1记录暂停时间8、int b;用于游戏信息区探测仪数量变化统计9、 int k;用于游戏信息区防雷服数量
4、变化统计10、int n;探测仪数量11、int q;用于游戏信息记录中玩家信息的记录12、typedef struct rankinglist char name100;int score;INFO;玩家信息结构体,用于记录玩家信息。13、INFO s10;定义排行榜最大信息保存数为102.2程序总体结构:2.2.1 函数调用说明main()功能:主函数 调用: jiemian(); hitKS(); minefield(); mousemsg(); gameover();游戏失败结束 pause(); 功能:暂停 closeJM();关闭界面jiemian()绘制游戏界面 Life();
5、Mark(); welcome();hitKS()点击开始 Start();mousemsg()鼠标响应 time();zuojianleishutongji(int i,int j);zuojianFLF_TCY(int i,int j); Life(); gamewin();pause()暂停游戏 mousemsg(); pause();closeJM() goodbye();2.2.2 其余子函数功能概要说明Start()接收玩家姓名Life()刷新游戏生命值Mark()刷新游戏当前得分time()记录游戏用时zuojianleishutongji(int i,int j)左键雷数统计z
6、uojianFLF_TCY(int i,int j)左键点出防雷服,探测仪gamewin()游戏胜利结束界面gameover()游戏失败结束界面minefield()初始化方格信息welcome();浮现欢迎界面goodbye();退出游戏界面3详细设计3.1welcome函数功能:产生一个欢迎界面,显示游戏名,作者。使用户界面更加友好。void welcome() char buf12100=设计人:11070322 丛义昊; / 输出屏幕提示 cleardevice(); setcolor(YELLOW); setfont(90, 0, 黑体); outtextxy(160, 50, 挖雷
7、游戏 setcolor(WHITE); setfont(16, 0, 宋体 outtextxy(240,240,buf12); / 实现闪烁的“按任意键继续” int c=255; while(!kbhit() setcolor(RGB(c, 0, 0); outtextxy(255, 400, 按任意键进入游戏 c -= 8; if (c 0) c = 255; Sleep(20); getch();3.2界面函数功能:构造游戏初始界面,包括了游戏界面,字体,线,填充颜色,字符输出等各方面的设计。void jiemian() initgraph(640,480);/欢迎界面 welcome(
8、); initgraph(900,650);/初始化图形方式 int i,j; /定义变量 char buf1100=开始 char buf2100=暂停 char buf3100=结束 char buf4100=防雷服: char buf5100=探测仪: setlinestyle(PS_SOLID,NULL,3);/更改线的粗细为3 setfont(20,0, /字体设为黑体 setfillstyle(LIGHTGRAY,SOLID_FILL); rectangle(100,100,800,600); rectangle(100,100,350,450); /游戏控制区 rectangle
9、(100,450,350,600); /游戏信息区 rectangle(150,150,300,200); /开始框 rectangle(150,250,300,300); /暂停框 rectangle(150,350,300,400); /结束框 outtextxy(210,167,buf1); /指定位置输出字符串 outtextxy(210,267,buf2); outtextxy(210,367,buf3); outtextxy(130,460,buf4); outtextxy(130,480,buf5); /初始化生命显示 Mark(); /初始化得分显示 setfillstyle(
10、BLUE,SOLID_FILL); for(i=0;i9;i+) /画9x9的雷阵并涂色 for(j=0;j150&m.xm.y0); /随机位置产生防雷服 if(mineij=0) mineij=2; mine2ij=2; mine3ij=2; flfNUM-; while(flfNUM /随机位置产生探测仪 mineij=3; mine2ij=3; mine3ij=3; tcyNUM-; while(tcyNUM3.7Life Mark函数功能:由于life ,mark为全局变量,将Life Mark函数嵌套在任意一个可以影响life ,mark值变化的子函数中,即可实现游戏信息区生命值,
11、得分的实时更新。void Life() /刷新游戏信息区的生命值显示 char buf6100; sprintf(buf6,生命值:,life); outtextxy(130,500,buf6);void Mark() char buf8100; sprintf(buf8,当前得分:,mark); outtextxy(130,520,buf8); /输出当前得分3.8 pause函数功能:嵌套在mousemsg函数中,通过用户点击暂停键区域,即可实现结束mousemsg函数的作用,在主函数中,由于pause函数在mousemsg之后,所以紧接着执行pause函数,最终通过再次点击暂停判断条件中
12、的两个函数相互调用,达到可以反复暂停的效果。if(m.x250&300) /点击暂停 time1=time1+(int)difftime(start,now);int pause() if(life=70) return 0; if(mark=71) switch (m.uMsg)/达到暂停游戏效果 case WM_LBUTTONDOWN: 300) now=time(NULL); mousemsg();/函数相互调用 pause(); continue;3.9 mousemsg函数功能:此函数包含一个大的永真循环,是游戏设计的关键部分包括1.刷新时间显示 2左键点击雷阵方格,开始、暂停、结束
13、键的响应 3右键点击使用探测仪翻开周围格子的响应 4 通过时间,得分,生命来判断游戏是否结束(成功or失败)。int mousemsg() int i,j,mineNUM=0; char buf7100; while (true) /大循环 time(); /调用时间函数 if(time1+(int)difftime(start,now)=70) return 0; /时间到,游戏以失败结束 if(MouseHit() /获取鼠标信息 setfillstyle(LIGHTBLUE,SOLID_FILL); for(i=0;i+) for(j=0;j+) if(m.x(400+i*40)&(44
14、0+i*40)&(170+j*40)&(210+j*40) zuojianleishutongji(i,j); /调用雷数统计 if(mineij=1) circle(420+i*40,190+j*40,15); life-; /踩雷生命减一 Life(); /刷新生命值 mineij=6; /赋另值,防止重复点击 setfillstyle(BLACK,SOLID_FILL); if(k0) bar(191+(k-1)*20,459,209+(k-1)*20,475); /游戏信息区防雷服减少显示一个 k-; setfillstyle(LIGHTBLUE,SOLID_FILL); floodf
15、ill(406+i*40,176+j*40,WHITE); if(life 350&400) /点击结束 life=0; if(mark=71) /胜利条件之一,成功翻开所有格子 gamewin(); return 0; break;由于四边及四角的特殊性,需要考虑到mineij中i,j的具体取值,所以需要分类讨论,鉴于有雷格子的特殊性,需要将其翻过后另赋为一个特殊值6,以便与翻过的其他格子区分开。 case WM_RBUTTONDOWN: /右键为探测仪功能,翻开本格周围9个格子,并显示雷数,标识雷的位置 for(i=0; for(j=0; if(n0) /当有探测仪时,点击生效 if(b0
16、) /控制游戏信息区的防雷服显示 setfillstyle(BLACK,SOLID_FILL); bar(190+(b-1)*20,477,211+(b-1)*20,497); b-; /防雷服显示减一个 if(mineij=0) setfillstyle(LIGHTBLUE,SOLID_FILL); mineij=5; mark+; if(mineij=2) setfillstyle(GREEN,SOLID_FILL); circle(200+k*20,467,7); floodfill(201+k*20,468,WHITE); floodfill(421+i*40,191+j*40,WHITE); life+; k+; if(mineij=3) setfillstyle(RED,S
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1