1、北京工业大学 c语言课程设计 报告扫雷学 号_110703xx_ 姓 名_xxx_指导教师_xx_2011年12月1 需求分析 31.1 功能与数据要求 31.1.1游戏功能介绍 4 1.2 界面需求 41.3开发与运行环境需求 62 概要设计 72.1主要数据结构 82.2程序总体结构 92.2.1 函数调用说明 92.2 .2其余子函数说明 10 3 详细设计 114 测试 334.1鼠标响应测试 334.2游戏各项数据测试 344.3游戏时间测试 344.4游戏界面跳转测试 345 用户手册 356总结提高 36 1需求分析游戏名称:挖雷游戏(MineSweeper)这是一款益智动脑游戏
2、。玩家只要利用鼠标点击,将随机出现在游戏区中的所有雷挖出来,即可获得游戏胜利。 1.1 功能与数据要求基本功能:1. 初始界面由控制区和游戏区两部分组成。游戏区有一个9*9的深颜色不透明方阵,内有若干个不可见的地雷,随机分布在方格中。随机产生雷的同时随机产生几个“秘密武器”:防雷服或探测仪,如果挖到一个防雷服,挖雷员增加一条命;如果挖到探测仪,使用探测仪探测时,点击方格,可显示本方格以及周围八个方格里是否有雷。使用探测仪的方法是:用鼠标右键单击方格。一个探测仪只能使用一次。2程序启动后,单击“开始”按钮,则从键盘输入用户名,然后游戏开始。3 用鼠标选中任一方格,如果不是地雷,方格颜色变为浅色;
3、如果是“秘密武器”,方格变为浅色同时工具可以使用,并在游戏信息区显示“秘密武器”的标志(例如:红色的圆圈表示防雷服,等等)及个数;如果是地雷则爆炸,减少一条命(也即减少一个防雷服),所有命消耗完毕则游戏结束。4每个挖雷员初始分数为0。每标记一个非雷方格得一分。在控制区显示当前挖雷员的当前得分。5游戏设置时间设置,或称生命值。时间用完则游戏结束。6游戏可有以下结束方式: 成功结束:当前所有非雷区都被标出,程序自动把有雷的方格标为红色,游戏结束,并显示当前玩家分数。 失败结束:情况1:当时间全部用完,而界面仍有非雷方格未标出,则游戏结束。 情况2:遇到雷爆炸并已经用完所有防雷服,则游戏结束。 情况
4、3:游戏过程中,按结束按钮,强行终止。7设置游戏的排行榜,显示玩家排名。拓展功能:1增加时间显示。每一局限定在同一个预先设置的时间段内完成,动态记时并显示,当某一局到达限定时间,则游戏结束(但保留主界面)。2探测仪功能增加为点击本格翻开周围的8个格子。3当游戏成功结束后,可以进行下一局游戏。4 设计一种方法,可以显示非雷方格周边的地雷数。1.1.1游戏功能介绍(1) 通过visual studio 2010进入扫雷游戏界面。(2) 进入游戏控制区域。点击开始,输入用户名,开始计时,同时游戏开始。(3) 成功完成游戏的标志是:在规定时间内 ,挖开所有的非雷方格。三种情况视为失败: 情况1:当时间
5、全部用完,而界面仍有非雷方格未标出,则游戏结束。 情况2:遇到雷爆炸并已经用完所有防雷服,则游戏结束。 情况3:游戏过程中,按结束按钮,强行终止。 1.2 界面需求游戏欢迎界面中:程序运行后,即出现欢迎界面,并显示作者姓名学号,采用闪动字体的形式,使画面生动,按任意键进入游戏。游戏初始界面:游戏界面分为控制区,信息区,游戏区,此时可以点击开始,进入游戏。游戏进行中:游戏以失败结束画面:1.3开发与运行环境需求开发环境:Visual studio 2010运行环境: Win7 2概要设计 游戏流程图: 2.1主要数据结构设计:2.1.1二维数组1、 记录每个方格中信息的二维数组mine992、
6、记录每个方格中信息作为备用的二维数组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;用于游戏信息区防雷服数量变化统计10、int n;探测仪数量11、int q;用于游戏信息记录中玩家信息的记录1
7、2、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(); Mark(); welcome();hitKS()功能:点击开
8、始调用: Start();mousemsg() 功能:鼠标响应调用: time();zuojianleishutongji(int i,int j);zuojianFLF_TCY(int i,int j); Mark(); Life(); gamewin();pause()功能:暂停游戏调用: mousemsg(); pause();closeJM()功能:关闭界面调用: goodbye();2.2.2 其余子函数功能概要说明Start() 功能:接收玩家姓名Life()功能:刷新游戏生命值Mark() 功能:刷新游戏当前得分time() 功能:记录游戏用时zuojianleishutongj
9、i(int i,int j) 功能:左键雷数统计zuojianFLF_TCY(int i,int j) 功能:左键点出防雷服,探测仪gamewin() 功能:游戏胜利结束界面gameover() 功能:游戏失败结束界面minefield()功能:初始化方格信息welcome(); 功能:浮现欢迎界面goodbye(); 功能:退出游戏界面 3详细设计3.1welcome函数功能:产生一个欢迎界面,显示游戏名,作者。使用户界面更加友好。void welcome() char buf12100=设计人:11070322 丛义昊; / 输出屏幕提示 cleardevice(); setcolor(Y
10、ELLOW); setfont(90, 0, 黑体); outtextxy(160, 50, 挖雷游戏); 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(); cleardevice();3.2界面函数功能:构造游戏初始界面,包括了游戏界面
11、,字体,线,填充颜色,字符输出等各方面的设计。void jiemian() initgraph(640,480);/欢迎界面 welcome(); 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,黑体); /字体设为黑体 cleardevice(); setfillstyle(
12、LIGHTGRAY,SOLID_FILL); rectangle(100,100,800,600); rectangle(100,100,350,450); /游戏控制区 rectangle(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,b
13、uf3); outtextxy(130,460,buf4); outtextxy(130,480,buf5); Life(); /初始化生命显示 Mark(); /初始化得分显示 setfillstyle(BLUE,SOLID_FILL); for(i=0;i9;i+) /画9x9的雷阵并涂色 for(j=0;j150&m.x150&m.y0); do i=rand()%9; /随机位置产生防雷服 j=rand()%9; if(mineij=0) mineij=2; mine2ij=2; mine3ij=2; flfNUM-; while(flfNUM0); do i=rand()%9; /随
14、机位置产生探测仪 j=rand()%9; if(mineij=0) mineij=3; mine2ij=3; mine3ij=3; tcyNUM-; while(tcyNUM0);3.7Life Mark函数功能:由于life ,mark为全局变量,将Life Mark函数嵌套在任意一个可以影响life ,mark值变化的子函数中,即可实现游戏信息区生命值,得分的实时更新。void Life() /刷新游戏信息区的生命值显示 char buf6100; sprintf(buf6,生命值:%d,life); outtextxy(130,500,buf6);void Mark() char buf
15、8100; sprintf(buf8,当前得分:%d,mark); outtextxy(130,520,buf8); /输出当前得分3.8 pause函数功能:嵌套在mousemsg函数中,通过用户点击暂停键区域,即可实现结束mousemsg函数的作用,在主函数中,由于pause函数在mousemsg之后,所以紧接着执行pause函数,最终通过再次点击暂停判断条件中的两个函数相互调用,达到可以反复暂停的效果。if(m.x150&m.y250&m.x300&m.y300) /点击暂停 time1=time1+(int)difftime(start,now); return 0;int pause
16、() if(life=70) return 0; if(mark=71) return 0; MOUSEMSG m=GetMouseMsg(); while (true) if(MouseHit() m=GetMouseMsg(); switch (m.uMsg)/达到暂停游戏效果 case WM_LBUTTONDOWN: if(m.x150&m.y250&m.x300&m.y=70) return 0; /时间到,游戏以失败结束 if(MouseHit() /获取鼠标信息 m=GetMouseMsg(); switch (m.uMsg) case WM_LBUTTONDOWN: setfil
17、lstyle(LIGHTBLUE,SOLID_FILL); for(i=0;i9;i+) for(j=0;j(400+i*40)&m.x(170+j*40)&m.y0) bar(191+(k-1)*20,459,209+(k-1)*20,475); /游戏信息区防雷服减少显示一个 k-; setfillstyle(LIGHTBLUE,SOLID_FILL); floodfill(406+i*40,176+j*40,WHITE); if(life150&m.y250&m.x300&m.y150&m.y350&m.x300&m.y=71) /胜利条件之一,成功翻开所有格子 gamewin(); r
18、eturn 0; break; 由于四边及四角的特殊性,需要考虑到mineij中i,j的具体取值,所以需要分类讨论,鉴于有雷格子的特殊性,需要将其翻过后另赋为一个特殊值6,以便与翻过的其他格子区分开。 case WM_RBUTTONDOWN: /右键为探测仪功能,翻开本格周围9个格子,并显示雷数,标识雷的位置 for(i=0;i9;i+) for(j=0;j(400+i*40)&m.x(170+j*40)&m.y0) /当有探测仪时,点击生效 if(b0) /控制游戏信息区的防雷服显示 setfillstyle(BLACK,SOLID_FILL); bar(190+(b-1)*20,477,2
19、11+(b-1)*20,497); b-; /防雷服显示减一个 if(mineij=0) setfillstyle(LIGHTBLUE,SOLID_FILL); floodfill(406+i*40,176+j*40,WHITE); mineij=5; mark+; if(mineij=2) setfillstyle(LIGHTBLUE,SOLID_FILL); floodfill(406+i*40,176+j*40,WHITE); setfillstyle(GREEN,SOLID_FILL); circle(200+k*20,467,7); floodfill(201+k*20,468,WHITE); circle(420+i*40,190+j*40,15); floodfill(421+i*40,191+j*40,WHITE); mineij=5; life+; mark+; Life(); k+; if(mineij=3) setfillstyle(LIGHTBLUE,SOLID_FILL); floodfill(406+i*40,176+j*40,WHITE); setfillstyle(RED,S
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1