扫雷游戏.docx
- 文档编号:8458285
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:16
- 大小:301.81KB
扫雷游戏.docx
《扫雷游戏.docx》由会员分享,可在线阅读,更多相关《扫雷游戏.docx(16页珍藏版)》请在冰豆网上搜索。
扫雷游戏
《高级语言程序设计》
课程设计报告
题目:
扫雷游戏
专业:
班级:
姓名:
指导教师:
成绩:
计算机与信息工程系
2014年6月20日
目录
1.概述1
1.1.研究的背景及意义1
1.2.设计的任务和需要的知识点1
2.需求分析2
2.1.功能需求2
2.2.操作方法2
3.总体设计3
3.1.模块设计3
3.2.数据结构设计3
4.详细设计4
4.1.主控模块Main函数4
4.2.游戏具体过程流程图5
5.程序的调试与测试6
5.1.动画与音乐的同步播放6
5.2.扫雷的运行6
5.3.终止程序6
5.4运行界面7
6.总结9
参考文献10
源程序11
1.概述
本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C语言技术为基础,使用WIN-TC为主要开发工具,对扫雷游戏进行了需求分析,总体设计,详细设计,最终完成了系统的实现与测试。
1.1.研究的背景及意义
扫雷,是一种集脑力和速度与一体的一种游戏!
到能够把扫雷做到能够从简,我们选择这个软件进行开发,虽然结果不尽如人意,但开发此软件能够使我们真正认识到程序的设计绝不仅仅是一个人的情,我们获得不仅仅是一种经历,更是一种对同伴的信任,成功与否是关系到团体,而不是个人,此款软件追求的是智慧的开发和脑力的提升,是一款适合老少都适合玩的游戏!
能够广大的占有市场,同时通过设计这款游戏能够深入C语言的开发,和对C语言设计的广泛兴趣,对今后的学习有着指导作用。
同时对C语言的地位有一定的了解。
C语言是国际上广泛流行的,很有发展前途的计算机高级语言。
它适合作为系统描述语言,即可用来编写系统软件,也可用来编写应用软件。
C语言是一种面向过程的高级语言,对于计算机专业和相关学科的学生来说,“课程设计基础”是一门非常重要的专业基础课程,对其学习的好坏直接关系到后续课程的学习效果。
1.2.设计的任务和需要的知识点
*课程设计主要完成的任务:
(1)通过编写扫雷游戏程序,掌握结构化,模块化程序设计的思想,培养解决实际问题的能力。
(2)设计好数组元素与地雷的关系。
(3)随机1,2,3和地雷。
(4)有同步播放的动画,声音效果
*需要掌握和运用的知识点:
(1)数组的应用
(2)按键处理
(3)结构体的应用
(4)图形,音乐和动画的有关知识。
(5)随机函数的使用。
(6)文件的基本操作。
2.需求分析
扫雷一个简单的可以开发智力让人放松的游戏,让游戏者的身心得到娱乐,从而更好的投入到学习和工作中。
现代人面临较大的压力,而这样一款游戏能让我们随时随地的享受,起作用是不可估量的!
扫雷就像人生之路只,有人真的走好每一步,否则一着不慎满盘皆输。
只有这样人们才能实现自己的宏伟蓝图!
虽然现在市面上存在各种各样的游戏版本,可是像扫雷这类的小游戏其市场还是相当大的。
因为它能够吸引人更深入,爱不释手,挑战性极强。
它的优势在于它的简单易行,无论是手机,还是小游戏机,都能很快顺利的运行。
对于在外忙碌的人不可能花费大量的时间在娱乐上,大型游戏是行不通的,这样的小游戏刚好迎合了他们的需求。
2.1.功能需求
程序运行后,显示动画,进入游戏界面后,选择难度,易,中,难,三个等级,开始游戏。
如果不想玩这一局,单击开局开始新游戏。
如果想退出,直接单击游戏当中的下拉菜单“退出”来结束游戏。
2.2.操作方法
(1)进入游戏单击游戏当中的开局。
(2)游戏界面游戏界面的左面,难度,开始,退出,中间是开局
(3)游戏操作在游戏中,游戏者可以用鼠标单击按钮。
(4)游戏结束显示分数。
3.总体设计
3.1.模块设计
3.2.数据结构设计
设计思路:
。
如何使地雷和数字能够随机出现并且符合扫雷的游戏规则是难点。
针对有如下的随机程序来解决这个问题。
for(;i y=rand()%my; x=rand()%mx; if(map[y][x]==0){map[y][x]++; i++; 4.详细设计 4.1.主控模块Main函数 4.2.游戏具体过程流程图 5.程序的调试与测试 5.1.动画与音乐的同步播放 预期效果: ①片头在显示动画的同时播放音乐②按任意键后进入游戏主界面③动画音乐停 实际运行效果: 满足①②;③不满足,进入游戏主界面后音乐继续 错误分析: 未使用setvect(0x1c,handler); nosound();语句 修改: 在动画播放完后加一条setvect(0x1c,handler);nosound();语句,问题得到解决。 5.2.扫雷的运行 扫雷的运行是一种比较简单的一种方式,当你不幸没过时,游戏界面出现youaredead 当你过关时,游戏界面出现了,youaregood 5.3.终止程序 程序的终止有两种方法,第一种方法是直接关闭窗口,第二种方法是直接是游戏的下拉菜单中单击退出。 5.4运行界面 6.总结 通过两周的课程设计,在我们开发小组五人的共同努力下,终于与完成了五子棋游戏程序的开发任务。 该游戏程序实现了用鼠标控制棋子,难度等级,再来一局,结束时处理等功能。 该游戏程序具有良好的界面,操作方便,控制准确,容错能力强等功能。 我们设计的五子棋游戏还存在一些缺陷予以改进: 1在进行游戏时无法播放音乐。 应在主函数中再次添加音乐函数。 2系统智能化水平偏低,游戏偏易。 增加控制电脑落子程序复杂程度。 参考文献 [1]谭浩强著.C程序设计(第二版).北京: 清华大学出版社,1999 [2]谭浩强,张基温,唐永炎编著.C语言程序设计.北京: 高等教育出版社,1992 [3]谭浩强编著.QBASIC语言教程.北京: 电子工业出版社,1997 [4]谭浩强.C程序设计[M].3版.北京: 清华大学出版社,2005 [5]HerbertSchildt著.戴健鹏译.C语言大全(第二版).北京: 电子工业出版社,1994 [6][美]SCHILDTH.C语言大全[M].4版.王子恢等译.北京: 电子工业出版社,2001 源程序 #include #include #include #include enum{empty,bomb,openspare,openbomb};//枚举 constintMAP_SIZE=20;//地图规格20×20 constintBOOM=40;//雷个数 boolflagbox[MAP_SIZE][MAP_SIZE]={0};//是否有插旗子 intOpenBox(int(*)[MAP_SIZE],constintx,constinty);//打开一个格子,返回格子中炸弹数 boolDecide(int(*)[MAP_SIZE],constint_x,constint_y);//打开一个格子四周的格子,返回是否成功 boolQuit(void);//按esc退出游戏 intmain(void) { initgraph(700,700);//初始绘图 srand((unsigned)time(NULL));//建立随机种子 setbkmode(TRANSPARENT);//字体背景透明 intmap[MAP_SIZE][MAP_SIZE]={0};//地图 MOUSEMSGm;//定义鼠标变量 IMAGEimg1;//原图 loadimage(&img1,_T("res\\block.bmp")); IMAGEimg2;//亮原图 loadimage(&img2,_T("res\\blockchosen.bmp")); IMAGEimg3;//空图 loadimage(&img3,_T("res\\space.bmp")); IMAGEimg4;//爆炸图 loadimage(&img4,_T("res\\boom.bmp")); IMAGEimg5;//红旗 loadimage(&img5,_T("res\\flag.bmp")); IMAGEimg6;//爆炸中 loadimage(&img6,_T("res\\booming.bmp")); //放雷 for(intround=0;round { inti,j;//随机数 i=rand()%MAP_SIZE; j=rand()%MAP_SIZE; if(map[i][j]==bomb) round--; else map[i][j]=bomb; } //画地图 for(intloop=0;loop { intx,y; y=loop/MAP_SIZE; x=loop%MAP_SIZE; putimage(x*35,y*35,&img1); } intx,y;//当前选中的区域 int_x=-1,_y=-1;//保存选中的区域 //主循环 while(true) { if(MouseHit()) m=GetMouseMsg(); //找到当前坐标 x=m.x/35; y=m.y/35; //鼠标离开后放原图 if((x! =_x||y! =_y)) { if(map[_x][_y]! =openspare&&map[_x][_y]! =openbomb&&flagbox[_x][_y]==false) putimage(_x*35,_y*35,&img1); _x=x; _y=y; } //鼠标指中放亮原图 if(map[x][y]! =openspare&&map[x][y]! =openbomb&&flagbox[x][y]==false) putimage(x*35,y*35,&img2); //鼠标左键单击 if(m.uMsg==WM_LBUTTONDOWN&&map[x][y]! =openspare&&map[x][y]! =openbomb) { //立刻弹起鼠标左键 mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); //再没插旗子的时候打开 if(flagbox[x][y]==false) { OpenBox(map,x,y); Decide(map,x,y); } //判断是否打中并且没有插旗子有效 if(map[x][y]==bomb&&flagbox[x][y]==false) { //爆炸动态效果 for(inti=0;i<6;i++) { Sleep(100); putimage(x*35,y*35,35,35,&img6,i*35,0); } //放红色炸弹并说明已打开 putimage(x*35,y*35,&img4); map[x][y]=openbomb; } } //鼠标右键插红旗 if(m.uMsg==WM_RBUTTONDOWN) { //立刻弹起鼠标右键 mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0); //插上红旗再点一下取消 if(flagbox[x][y]==true){putimage(x*35,y*35,&img1);flagbox[x][y]=false;} else{if(map[x][y]! =openspare){putimage(x*35,y*35,&img5);flagbox[x][y]=true;}} } //按B可退出 Quit(); } return0; } //打开一个盒子并标注雷数 intOpenBox(int(*map)[MAP_SIZE],constintx,constinty) { //在不是炸弹不是已打开炸弹不是旗子的时候打开 if(map[x][y]! =bomb&&map[x][y]! =openbomb&&flagbox[x][y]==false) { IMAGEimg3;//空图 loadimage(&img3,_T("res\\space.bmp")); intcount=0;//记录周围雷个数 putimage(x*35,y*35,&img3);//放空图 map[x][y]=openspare;//表示被打开 //检查周围雷个数,不允许数组越界的情况下判断 if(x! =MAP_SIZE-1)if(map[x+1][y]==bomb||map[x+1][y]==openbomb)count++; if(x! =MAP_SIZE-1&&y! =MAP_SIZE-1)if(map[x+1][y+1]==bomb||map[x+1][y+1]==openbomb)count++; if(y! =MAP_SIZE-1)if(map[x][y+1]==bomb||map[x][y+1]==openbomb)count++; if(x! =0&&y! =MAP_SIZE-1)if(map[x-1][y+1]==bomb||map[x-1][y+1]==openbomb)count++; if(x! =0)if(map[x-1][y]==bomb||map[x-1][y]==openbomb)count++; if(x! =0&&y! =0)if(map[x-1][y-1]==bomb||map[x-1][y-1]==openbomb)count++; if(y! =0)if(map[x][y-1]==bomb||map[x][y-1]==openbomb)count++; if(x! =MAP_SIZE-1&&y! =0)if(map[x+1][y-1]==bomb||map[x+1][y-1]==openbomb)count++; //写下雷的个数 if(count! =0) { TCHARs[5]; _stprintf(s,_T("%d"),count);//高版本VC推荐使用_stprintf_s函数 //sprintf(s,_T("%d"),count);//vc++使用 settextcolor(GREEN);//建立字体颜色 outtextxy(x*35+13,y*35+11,s); } returncount; } return-1; } //打开周围的空盒子 boolDecide(int(*map)[MAP_SIZE],constint_x,constint_y) { intcount1=-1,count2=-1,count3=-1,count4=-1,count5=-1,count6=-1,count7=-1,count8=-1; //不允许数组越界的情况下判断 if(_x! =MAP_SIZE-1)if(map[_x+1][_y]==empty)count1=OpenBox(map,_x+1,_y); if(_x! =MAP_SIZE-1&&_y! =MAP_SIZE-1)if(map[_x+1][_y+1]==empty)count2=OpenBox(map,_x+1,_y+1); if(_y! =MAP_SIZE-1)if(map[_x][_y+1]==empty)count3=OpenBox(map,_x,_y+1); if(_x! =0&&_y! =MAP_SIZE-1)if(map[_x-1][_y+1]==empty)count4=OpenBox(map,_x-1,_y+1); if(_x! =0)if(map[_x-1][_y]==empty)count5=OpenBox(map,_x-1,_y); if(_x! =0&&_y! =0)if(map[_x-1][_y-1]==empty)count6=OpenBox(map,_x-1,_y-1); if(_y! =0)if(map[_x][_y-1]==empty)count7=OpenBox(map,_x,_y-1); if(_x! =MAP_SIZE-1&&_y! =0)if(map[_x+1][_y-1]==empty)count8=OpenBox(map,_x+1,_y-1); if(_x! =MAP_SIZE-1)if(! count1)Decide(map,_x+1,_y); if(_x! =MAP_SIZE-1&&_y! =MAP_SIZE-1)if(! count2)Decide(map,_x+1,_y+1); if(_y! =MAP_SIZE-1)if(! count3)Decide(map,_x,_y+1); if(_x! =0&&_y! =MAP_SIZE-1)if(! count4)Decide(map,_x-1,_y+1); if(_x! =0)if(! count5)Decide(map,_x-1,_y); if(_x! =0&&_y! =0)if(! count6)Decide(map,_x-1,_y-1); if(_y! =0)if(! count7)Decide(map,_x,_y-1); if(_x! =MAP_SIZE-1&&_y! =0)if(! count8)Decide(map,_x+1,_y-1); returntrue; } //按esc退出程序 boolQuit(void) { if(GetAsyncKeyState(0x1B)) { if(MessageBox(NULL,_T("你确定要退出吗? "), _T("提示"),MB_YESNO)==IDYES) exit(0); } returnfalse; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 扫雷 游戏