版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计报告课程名称:计算机课程扫雷设计院系:建筑工程学院专业班级:土木1102班成员姓名:黄枭威王晓伟宋浩余彬李凯凯李婷婷张娣朱月梅子指导教师:赵先完成时间:2012.6.6报告成绩:扫雷游戏设计综述在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。我们小组利用TurboC编写了与它功能相仿的扫雷游戏,寓学于乐。一、应用环境1.1硬件环境一台完整的电脑,包括键盘、鼠标,最小硬盘空间1GHz1.1386,486,586及兼容机.640K基本内存;2.11M以上扩充内存,10M以上的显示内存.2.2软件环境开发环境:本系统的设计采用的是C语言开发Windows操作系统,TurboC2.0汉化版二、程序的作用及设计目的2.1程序功能程序的功能是随机生成地雷位置,通过键盘操作玩游戏,空格键进行打开,回车键进行标记,所有地雷标出后胜利,当单击到地雷时失败。2.2程序设计目的1.培养综合运用所学知识独立完成课题的能力。2.更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。3.提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。4.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。5.培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。6.对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。三、程序分析和设计3.1游戏规则设计30×16格区域,按上空格键后,该格显示数字,则表示它周围8个空格内含有的地雷数,周围没有地雷的显示空白,则不能再按空格键了。如果是地雷,则游戏结束。如果判断是地雷,可以使用回车键标出,显示红旗,要取消标志则再按回车键,当所有地雷都标出,每个空格都处理过了,则结束。3.2游戏界面游戏界面为30*16的黑底灰色方框。3.3设计思路扫雷程序主要用了一个30行16列的二维数组表示,数组的num代表格内当前处于什么状态,值为1表示有雷,值为0表示已经变成空白格或者显示过数字,roundnum统计每个格子周围有多少地雷,flag主要是空格键测试的标志,如果flag为1则表示格子显示红旗,这样回车键点在这个格子中将无效。算法的重点是一开始统计好每个格子周围有多少地雷,然后当空格键点在没地雷的格子上时进行两种判断,如果格子周围没地雷就先在原来的格子位置显示空白格,然后用递归的方法同样判断周围的8个格子;如果格子周围有地雷,就在该格子上显示具体的雷数。在递归判断8个格子时,如果格子上有雷或者格子已经显示过雷数或者空白格,以及格子上有红旗标志的话,就不再对格子进行任何判断。1main()主函数定义使用到的常数、函数原型说明。然后初始化图形系统,调用游戏控制函数,游戏只接键盘标操,作按任意键结束游戏,关闭图形系统,程序结束。2游戏控制函数调用函数redraw重画函数,调用为具体游戏操作过程,重画游戏界面。即对下一操作,不管是打开数字,还是空格,亦或是地雷,都重画一次。3画初始界面这个函数完成初始界面的设计以及随机生成地雷数。初始界面的主要工作是确定图的位置和方格显示的位置。外边框的左上角坐标为(190,60),右下角坐标为(390,290),显示地雷数的区域为(190,60)~(390,90),每个方格的宽度和高度均为16。读者可以参照修改区域的大小。5randlei随机布雷随机布雷(randlei)函数用于随机布雷,且计算每个各自周围雷的个数。6DrawRedflag()显示红旗用点击回车键表示起地雷,起雷后显示一个小红旗。7游戏过程游戏过程主要是对按键的处理,具体算法如下:统计每个格子周围有多少地雷。(1)如果单击了空格键则判断:如果单击了方格,判断该格子里有红旗,则按键无效。如果单击的格子没有显示过数字或空白,则判断;如果是地雷,游戏结束,显示地雷分布;如果不是地雷,则统计该格子周围(8个方向)的地雷数,如果周围地雷数为0,调用函数tansuo处理周围格子的情况,显示周围地雷数或空白。如果单击的格子周围地雷数不为0,则显示周围地雷数,将处理过的格子作标记。如果所有格子处理完毕,游戏胜利。(2)如果单击了回车键,该格子没有红旗,则显示红旗。如果有红旗,再击回车键,则红旗消失。(3)重复步骤(2)直到按键结束程序。8统计地雷统计每个格子周围的雷数,分别考虑格子处于四个角、四条边以及中间某个位置的情况。周围指上、下、左、右、左上、左下、右上、右下。注意程序中使用的是多个if语句,而没有使用或运算连接组成复合表达式,考虑到C语言的逻辑表达式的问题,逻辑或只要前面的表达式为真,后面就不必判断了,这样可能造成少计地雷数。9显示无雷区的空白格当单击了某个格子,该格子周围地雷数为0时,应该继续判断它周围8个方向的格子的周围地雷数是否为0,将这些格子都用空白显示。所以这也是一个递归问题,将其构造为递归函数。一个递归函数有两个要素,一个是入口参数,且是降规模的,另一个为出口参数。本函数的入口参数为格子的坐标,表示处理哪个格子,出口参数是该格子有红旗或者已经显示过数字或空白格子。具体算法如下:(1)如果当前格子有红旗或者已经显示过数字或空白格子,则返回。(2)空白格子数减1(统计处理过多少格子)。(3)如果周围的地雷数为0,且它不是地雷,则将它显示为空白,同时将它的状态值num置0,表示处理过;如果周围的地雷数不为0,显示周围地雷数,同时将它的状态值num置0,表示处理过(即显示过数字),返回。(4)8个方向探索调用函数显示所有的空白格子。四、程序测试及分析4.1程序调试是指对程序的查错和排错。为了便于查错、阅读,在设计该程序的过程中我们采用了结构化程序方法编辑,添加了尽可能多的注释,这就为接下来的调试过程带来了很多方便。4.2经过仔细检查之后进行上机调试。进行编译,如果在编译和连接过程中发现错误,屏幕上显示了出错信息,根据提示找到出错的位置,加以改正,再进行编译……如此反复,直到顺利通过编译和连接为止。4.3在本次作业过程中碰到的编译、连接的错误主要有:缺少变量定义,定义位置不正确、语法错误、注释的位置等。4.4错误解决方法。(1)缺少变量定义,定义位置不正确;由于该程序相对来讲稍有些长,前后有些变量不容易联系起来,但是在错误信息的提示下一般还是很容易找到。不过需要注意的是在定义的时候有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置要特别留意。为减少这样的错误我后来还是用不同的变量名来表示,结果引起的那些错误解决了。(2)语法错误;大多的语法错误在通过书本参考下能够修改。主要是平时缺乏锻炼、不太注意而产生的。如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式(3)注释的位置;程序设计中在注释的时候不能同我们平常写字一样随心所欲,我们应该注意注释的格式。且注释中能含有C语言可执行的语句。心得体会课程设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比较完整的一个程序的设计,我摆脱了单纯的理论知识学习状态。以前在课堂上因为有老师辅导、而且学习时每次的代码作业都是局限的一段,所以从未料想到一个游戏程序的整体把握还是有一定难度的,代码每一个地方都是有联系的,一个地方错,其他地方都会错。————————黄枭威实际设计的结合锻炼了我的综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平。我现在才发现以前在课堂学的东西还不够,很多都是要靠我们举一反三,此次的游戏设计让我发现,代码不管怎么变,思维是不变的,其中的思想很多是很相似的。————————王晓伟通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富。我再不会像以前那样看到代码就会头疼,因为通过此次作业我学习了C语言的数据类型、常量与符号常量、变量、C语言的运算符和表达式、赋值运算符和赋值表达式、自增自减运算符以及逗号表达式等。——————————宋浩愉快的合作,共同付出,然后收获,这是我们都希望看到的也正是我们进行课程设计的目的所在。而且我也明白了C语言的简洁,使用灵活方便,运算符丰富,表达能力强。还有数计类型丰富,目标程序质量高,具有面向硬件系统的特点,具有结构化的控制语句和模块化的程序结构,具有编译预处理功能,而且程序设计自由度大,可移植性好。——————————李凯凯虽然设计内容繁多,过程繁琐但我的收获却更加丰富。各种组件的运用,各种算法的应用,各种控件的利用我都是随着设计的不断深入而不断熟悉并逐步掌握的。从而启发我,要想写好程序,在写好课本知识的同时还需要多读和专业有关的一些书籍,同时还需要多动脑子,尽量把所学的知识综合起来应用,力争写出完美的程序。——————————李婷婷和老师以及同学的沟通交流更使我对程序整体的规划与设计有了新的认识也对自己提出了新的要求。本程序在刚开始调试时有许多错误,但在我的努力及同学的帮助下都被一一克服,在刚开始的几次调试中曾经出现过不能运行等等问题。经过我的努力及同学的帮助,这些问题得到克服,并且使程序的功能也得到了一定的完善———————————张娣提高是有限的但提高也是全面的,正是这一次设计让我积累了许多实际经验,也必然会让我在未来的工作学习中表现出更高的应变能力和理解力除此之外,我还得到了一些有用的教训:写程序时必须要细心,不能输错一个字符标点,就连全角半角也得注意。在修改时要有耐心,编译出错后必须逐个错误去改正,绝不能心急浮躁,否则修改之后还会有新的错误。————————————余彬顺利如期的完成本次课程设计给了我很大的信心,但是也让多不足的地方,学习其实就是一个不断完善的过程,正视自己的不足之处,在以后的工作和学习中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断的完善自己。。在这次设计过程中,不仅复习课本上所学知识,还通过查资料、问同学学到了课本上没有的知识。——————————朱月梅子六、总结6.1知识点1数组的应用。2全局变量的应用。3按键的处理。4探索函数。5.功能扩充、修改程序,设初级、中级、高级三个等级,初级地雷数较少,在15个以内,中级在15到30个,高级则扩大棋盘为20×20,地雷数为30个以上。七、主要代码#include<graphics.h>#include<stdlib.h>#include<bios.h>#include<time.h>/*定义几个游戏中要用到的功能按键*/#defineESC0x11b#defineUP0x4800#defineDOWN0x5000#defineLEFT0x4b00#defineRIGHT0x4d00#defineSPACE0x3920#defineENTER0x1c0dinta[50][50]={0};/*存放雷的数组*/intb[50][50]={0};/*存放格子状态的数组*/charnum[9][2]={"?","1","2","3","4","5","6","7","8"};intgbx=320,gby=240;/*当前光标位置(0,0)表示左上角*/intii,jj;main(){inti,j,m=30,n=16,d=20,k;intgdriver=DETECT,gmode;randlei(30,16,100);ii=m/2;jj=n/2;registerbgidriver(gdriver);initgraph(&gdriver,&gmode,"c:\\turboc2");wangge(m,n,d);redraw(m,n,d);while(1)/*反复从键盘获得程序需要的按键*/{if(bioskey(1))/*判断是否有按键*/{k=bioskey(0);switch(k){caseESC:exit(0);break;caseUP:if(jj>1){jj-=1;redraw(m,n,d);}break;caseDOWN:if(jj<n)/*DOWN键向下移动光标*/{jj+=1;redraw(m,n,d);}break;caseLEFT:/*LEFT键向下移动光标*/if(ii>1){ii-=1;redraw(m,n,d);}break;caseRIGHT:/*RIGHT键向下移动光标*/if(ii<m){ii+=1;redraw(m,n,d);}break;caseSPACE:/*空格键认为无雷打开*/{b[jj][ii]=1;if(a[jj][ii]==0)tansuo(jj,ii,n,m);}redraw(m,n,d);break;caseENTER:/*回车键认为有雷标记*/if(b[jj][ii]==0)b[jj][ii]=-1;elseif(b[jj][ii]==-1)b[jj][ii]=2;elseif(b[jj][ii]==2)b[jj][ii]=0;redraw(m,n,d);break;}}}getch();closegraph();}/*redraw重画函数在用户有操作后,重画游戏画面*/redraw(intm,intn,intd){inti,j;wangge(m,n,d);for(i=1;i<=n;i++)for(j=1;j<=m;j++){if(b[i][j]!=1)gezi3d(320+(j-1-m/2)*d,240+(i-1-n/2)*d,d);elseif(a[i][j]>=0){gezi2d(320+(j-1-m/2)*d,240+(i-1-n/2)*d,d);if(a[i][j]>0){shownum(320+(j-1-m/2)*d,240+(i-1-n/2)*d,d,a[i][j]);}}elsedrawlei(320+(j-1-m/2)*d,240+(i-1-n/2)*d,d,a[i][j]);if(b[i][j]==-1)showflag(320+(j-1-m/2)*d,240+(i-1-n/2)*d,d);if(b[i][j]==2)shownum(320+(j-1-m/2)*d,240+(i-1-n/2)*d,d,0);}gbx=320+(ii-1-m/2)*d;gby=240+(jj-1-n/2)*d;drawGB(gbx,gby,d);}/*随机布雷(randlei)函数用于随机布雷,且计算每个各自周围雷的个数Intm:横向各自的数量要求是双数Intn:纵向格子的数量要求是双数Intnum:雷的个数*/randlei(intm,intn,intnum){inti,j,xx,yy,sum=0,t;srand(time(NULL));do{t=random(m*n);xx=t/m+1;yy=t%m+1;if(a[xx][yy]==0){a[xx][yy]=-1;sum++;}}while(sum<num);for(i=1;i<=n;i++)for(j=1;j<=m;j++){if(a[i][j]!=-1){if(a[i-1][j-1]==-1)a[i][j]++;if(a[i-1][j]==-1)a[i][j]++;if(a[i-1][j+1]==-1)a[i][j]++;if(a[i][j-1]==-1)a[i][j]++;if(a[i][j+1]==-1)a[i][j]++;if(a[i+1][j-1]==-1)a[i][j]++;if(a[i+1][j]==-1)a[i][j]++;if(a[i+1][j+1]==-1)a[i][j]++;}}}wangge(intm,intn,intd){inti,j;setcolor(7);/*网格区域填充浅灰色底色*/setfillstyle(1,7);bar(320-m/2*d,240-n/2*d,320+m/2*d,240+n/2*d);setcolor(15);for(i=320-m/2*d;i<320+m/2*d;i=i+d)/*小格子起点的横坐标序列*/for(j=240-n/2*d;j<240+n/2*d;j=j+d)/*小格子起点的纵坐标序列*/;/*gezi3d(i,j,d);*//*绘制一个立体效果的小格子*/}/*画雷(drawlei)函数用于绘制给定坐标位置的雷雷画在格子的正中心Intx:雷所在格子左上角点横坐标Inty:雷所在格子左上角点纵坐标Intd:格子间的间距*/drawlei(intx,inty,intd){intr;setcolor(0);/*雷颜色为黑色*/for(r=d/4;r>0;r--)circle(x+d/2,y+d/2,r);/*画多个小园形成雷外壳*/line(x+d/2,y+3,x+d/2,y+d-3);/*画雷外壳上的刺*/line(x+3,y+d/2,x+d-3,y+d/2);line(x+5,y+5,x+d-5,y+d-5);line(x+5,y+d-5,x+d-5,y+5);}/*显示数字(shownum)函数用于显示给定坐标位置的数字数字显示在格子的正中心lntx:数字所在格子左上角点横坐标lnty:数字所在格子左上角点纵坐标intd:格子间的间距intn:要显示的数字*/shownum(intx,inty,intd,intn){setcolor(0+n);/*数字颜色为黑色*/settextstyle(SMALL_FONT,HORIZ_DIR,0);outtextxy(x+0.3*d,y+0.4*d,num[n]);}/*显示旗子(showflag)函数用于显示给定坐标位置的标志为雷的小红旗intx:旗子所在格子左上角点横坐标inty:旗子所在格子左上角点纵坐标intd:格子间的间距*/showflag(intx,inty,intd){intk,l;setcolor(4);for(l=1,k=y+0.2*d;k<=y+0.5*d;l=l+1.5,k++)line(x+d/2-1,k,x+d/2,k);setcolor(0);line(x+d/2,y+d/2,x+d/2,y+d*0.8);line(x+d*0.2,y+d*0.8,x+d*0.8,y+d*0.8);line(x+d*0.2-1,y+d*0.8+1,x+d*0.8+1,y+d*0.8+1);}/*绘制三维小格子(gezi3d)函数用于将扫雷界面的每个小格子绘制为三维效果这是该格子未被打开时的效果intx:旗子所在格子左上角点横坐标inty:旗子所在格子左上角点纵坐标intd:格子间的间距*/gezi3d(intx,inty,intd){setcolor(8);line(x,y,x,y+d);line(x,y,x+d,y);line(x+d,y+d,x,y+d);line(x+d,y+d,x+d,y);setcolor(15);line(x+1,y+1,x+1,y+d-1);line(x+1,y+1,x+d-1,y+1);setcolor(0);line(x+d-1,y+d-1,x+1,y+d-1);line(x+d-1,y+d-1,x+d-1,y+1);}/*绘制二维小格子(gezi3d)函数用于将扫雷界面的每个小格子绘制为二维效果这是该格子未被打开时的效果intx:旗子所在格子左上角点横坐标inty:旗子所在格子左上角点纵坐标intd:格子间的间距*/gezi2d(intx,inty,intd){setcolor(8);line(x,y,x,y+d);line(x,y,x+d,y);line(x+d,y+d,x,y+d);line(x+d,y+d,x+d,y);setfillstyle(1,7);bar(x+1,y+1,y+d-1,y+d-1);}/*画爆炸雷(drawBZlei)函数用于绘制给定坐标位置的爆炸雷雷画在格子的正中心格子背景色为红色intx:旗子所在格子左上角点横坐标inty:旗子所在格子左上角点纵坐标intd:格子间的间距*/drawBZlei(intx,inty,intd){intr;setcolor(4);setfillstyle(1,4);bar(x+1,y+1,x+d-1,y+d-1);setcolor(0);for(r=d/4;r>0;r--)circle(x+d/2,y+d/2,r);line(x+d/2,y+3,x+d/2,y+d-3);line(x+3,y+d/2,x+d-3,y+d/2);line(x+5,y+5,x+d-5,y+d-5);line(x-5,y+d-5,x+d-5,y+5);}/*画光标(drawGB)函数用于绘制给定坐标位置的光标光标为一个蓝色正方形intx:旗子所在格子左上角点横坐标inty:旗子所在格子左上角点纵坐标intd:格子间的间距*/drawGB(intx,inty,intd){
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 航运合同类型
- 提前解除物业服务合同申请
- 《血栓的类型和形态》课件
- 2025年吉林市货运资格证考试口诀
- 2025年拉萨货运从业资格考试试题及答案解析大全
- 2025年兰州货运从业资格考试题目和答案解析
- 《氨基酸本科》课件
- 2025年徐州货运从业资格证模拟考试下载题
- 2025年长沙货运从业资格证考试答案
- 幼儿园教师演讲稿15篇
- 小学生人际交往篇-做一个受欢迎的人
- 电气工程预算课程设计
- 新苏教版五年级科学上册活动手册答案
- 教官协作服务合同
- 2024-2025学年五年级科学上册第二单元《地球表面的变化》测试卷(教科版)
- 第八单元测试卷-2024-2025学年统编版语文三年级上册
- 第11讲 海水性质和海水运动(练习)(教师版) 2025年高考地理一轮复习讲练测(新教材新高考)
- 专题9.9 解析几何(2021-2023年)真题训练(解析版)
- GB/T 16439-2024交流伺服系统通用技术规范
- 2024年婴幼儿发展引导员(中级)职业技能鉴定考试题库(含答案)
- 《工程制图》期中测试
评论
0/150
提交评论