程序设计.docx
- 文档编号:30311209
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:33
- 大小:566KB
程序设计.docx
《程序设计.docx》由会员分享,可在线阅读,更多相关《程序设计.docx(33页珍藏版)》请在冰豆网上搜索。
程序设计
程序设计报告
(2014/2015学年第一学期)
题目:
挖地雷
专业
组长学号姓名
组员学号姓名
指导教师
指导单位
日期
成员分工
组长(潘孙翔)
编写主要程序,并根据实际情况及建议不断改进并完善程序
组员(卜曼曼)
编写部分程序,并共同编写了部分的程序,运行程序并对程序提出修改意见,撰写程序设计报告
组员()
评分细则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
简短评语
教师签名:
年月日
评分等级
备注
评分等级共五种:
优秀、良好、中等、及格、不及格
挖地雷
一、课题内容和要求
【问题描述】
你玩过扫雷游戏吧?
Windows操作系统中带了这个小游戏,那个系统叫什么来着?
在游戏中要想过关,就必须要在一个NxM的区域上找出所有的地雷。
游戏过程中,计算机会在地图上显示一些数字从而帮助你确定哪里有地雷。
例如,在下面这个有两颗地雷的4x4的地图(*表示地雷):
*...
....
.*..
....
根据上面的地图,可以计算出应该提供给游戏者的数字如下所示:
*100
2210
1*10
1110
每个数字表示了该方格周围到底有几个地雷,当然,一个方格周围最多的时候只会有八个。
【功能要求】
(1)定义一个矩阵,随机产生地雷的分布并由此产生提供给游戏者的数字信息。
(2)定义成绩排行榜,记录前五名的用户名及时间。
(3)提供菜单功能,定义不同等级的地雷地图供选择。
(4)游戏者通过坐标(如1(1,2)、0(3,4)判定第一行第二列位置为地雷,第3行第四列不是地雷)判定是否为地雷,标记地雷位置正确,则正确位置显示@符号,如触碰地雷,游戏结束,没有触碰地雷,显示该坐标位置周边地雷分布情况,如果周边有地雷不显示。
(5)成绩排行榜以文件形式保存。
【程序设计的开发环境】
采用C或C++实现,VC++6.0、Windows98/XP
【★拓展功能要求★】
鼓励采用TurboC/C++、MFC等开发工具,实现彩色或图形操作界面。
二、需求分析
功能框架图:
(见图2-1)
图2—1功能框架图
核心算法流程图:
三、概要设计
1.主要结构体:
voidthunder(intRow,intColumn);//r*c扫雷区域的产生
while(num!
=0);//循环体进行游戏的执行
voidscale(intdif);//选择游戏难度
clock();//时间函数计算时间
if(Dif==1or2or3);//文件的建立与存储
2.主要函数流程:
(1)voidthunder(intDif,intRow,intColumn,char*USer)
(2)clock();计算游戏时间
(3)voidscale(intdif);选择游戏难度
(4)if(Dif==1or2or3);文件的建立与存储
四、源程序代码
#include
#include
#include
#include
#include
#include
#include
#definerandom(x)(rand()%x)
usingnamespacestd;
voidthunder(intDif,intRow,intColumn,char*USer)
{
intr,c,alls[22][22],backstage[22][22]={0};
srand((int)time(0));
for(r=1;r<=Row;r++)//生成alls(0~1)1是雷
{
for(c=1;c<=Column;c++)
{
if(random(8)<1){alls[r][c]=1;}else{alls[r][c]=0;};
cout<<""< } cout< }; for(r=0;r<=Row+1;r++)//生成backstage(正确答案) { for(intc=0;c<=Column+1;c++) { if(alls[r][c]==1) { (int)backstage[r][c]='*';//将1变为*代表雷 } else { for(inti=r-1;i<=r+1;i++)//将0变为数字(代表周围雷数) for(intj=c-1;j<=c+1;j++) { if(alls[i][j]! =alls[r][c]&&alls[i][j]==1){backstage[r][c]++;}; } };//else结束 };//for结束 };//for结束 cout<<"========================************=========================="< for(r=1;r<=Row;r++)//输出backstage { for(intc=1;c<=Column;c++) { cout<<""<<(char)(backstage[r][c]==42? backstage[r][c]: backstage[r][c]+'0'); } cout< }; cout<<"======================*********================================"< charsurface[22][22];//生成surface(用户界面) for(r=0;r<22;r++)//全部为零 for(c=0;c<22;c++) { surface[r][c]='0'; } for(r=1;r<=Row;r++)//中间化#形成0包围#的形式(通过数#-->(*||数字)的个数赢的时候停止循环) for(c=1;c<=Column;c++) { surface[r][c]='#'; } for(r=1;r<=Row;r++)//输出surface界面便于检查 { for(c=1;c<=Column;c++){cout<<""< cout< }; cout<<"请按格式输入"< <<"前两个数字为坐标,最后一个数字“1”表示此位置为雷,“0”则表示不是。 "< <<"如: 131表示一行三列是雷;240表示二行四列不是雷"< <<"提示: 当数字周围雷都被扫出时,可再次按要求输入此位置,可得到周围数字。 "< longi=10000000L;//计算时间开始 clock_tstart,finish; doubleduration; start=clock(); while(i--);//计算时间开始 intnum=Row*Column;//计算#号个数 while(num! =0)//控制是否点完所有位置 { intx,y,judge; cin>>x>>y>>judge; if(alls[x][y]! =judge) { cout<<"youlose! ! ! "< cout<<"Theansweris: "< for(r=1;r<=Row;r++)//输了输出backstage显示正确答案 { for(intc=1;c<=Column;c++) { cout<<""<<(char)(backstage[r][c]==42? backstage[r][c]: backstage[r][c]+'0');//输出backstage } cout< } break; } else { if(alls[x][y]==1){if(surface[x][y]=='#'){num--;}surface[x][y]='@';}//雷判断正确显示“@”;数“#” else { if(backstage[x][y]! =0)//数字判断正确显示数字 { if(surface[x][y]=='#'){num--;surface[x][y]=backstage[x][y]+'0';}//数“#” else { intlei_num=0; for(inti=x-1;i<=x+1;i++)//数数字周围雷的个数 for(intj=y-1;j<=y+1;j++) { if(surface[i][j]=='@') lei_num++; } if(backstage[x][y]==lei_num)//看数字周围雷是否全部扫出提示显示数字周围 { for(inti=x-1;i<=x+1;i++) for(intj=y-1;j<=y+1;j++) if(surface[i][j]=='#')//数“#” { surface[i][j]=backstage[i][j]+'0'; num--; } } } } else//数字为零时显示零周围的零 { if(surface[x][y]=='#'){num--;};//数“#” surface[x][y]=backstage[x][y]+'0'; for(inti=x-1;i<=x+1;i++)//显示零周围的数字 for(intj=y-1;j<=y+1;j++) if(surface[i][j]=='#')//避免死循环 { surface[i][j]=backstage[i][j]+'0'; num--;//数“#” } for(intk=0;k<20;k++)//最多20层零(点出最边上的零) { for(intR=1;R<=Row;R++)//检查所有零 for(intC=1;C<=Column;C++)//再次显示零周围的数字 { if(surface[R][C]=='0') { for(inti=R-1;i<=R+1;i++) for(intj=C-1;j<=C+1;j++) { if(surface[i][j]=='#')//避免死循环数“#” { surface[i][j]=backstage[i][j]+'0'; num--; } } } }//匹配for内 }//匹配for外 }//匹配else }//匹配else }//匹配els cout< for(r=1;r<=Row;r++)//检查用输出backstage { for(intc=1;c<=Column;c++) { cout<<""<<(char)(backstage[r][c]==42? backstage[r][c]: backstage[r][c]+'0'); } cout< }; cout<<"======================*********================================"< for(r=1;r<=Row;r++)//输出界面(已修改) { for(c=1;c<=Column;c++){cout<<""< cout< }; cout<<"======================*********================================"< }//匹配while finish=clock();//计算时间结束 duration=(double)(finish-start)/CLOCKS_PER_SEC;//时间变量 if(num==0)//所有 { cout<<"Youwin! Congratulations! ! "< cout<<"Yourtimeis: "< if(Dif==1)//读取简单扫雷的存储文件 { stringName; stringname[6]; doubleTime,rang; doubletimes[6]; inti=0; ifstreaminf("扫雷简单.txt"); for(i=0;i<5;i++)//文件中信息导入到数组里 { inf>>Name;inf>>rang>>Time; name[i]=Name; times[i]=Time; } inf.close(); name[5]=USer;//本轮玩家信息 times[5]=duration; doublet1=0; stringt2; for(intj=0;j<5;j++)//冒泡排序法 { for(i=0;i<5-j;i++) { if(times[i]>times[i+1]) { t1=times[i]; times[i]=times[i+1]; times[i+1]=t1; t2=name[i]; name[i]=name[i+1]; name[i+1]=t2; } } } ofstreamoutf("扫雷简单.txt"); for(i=0;i<5;i++)//将前五名玩家信息存储到文件中 { cout< outf< } outf.close(); } if(Dif==2)//读取一般扫雷的存储文件 { stringName; stringname[6]; doubleTime,rang; doubletimes[6]; inti=0; ifstreaminf("扫雷一般.txt"); for(i=0;i<5;i++)//文件中信息导入到数组里 { inf>>Name;inf>>rang>>Time; name[i]=Name; times[i]=Time; } inf.close(); name[5]=USer;//本轮玩家信息 times[5]=duration; doublet1=0; stringt2; for(intj=0;j<5;j++)//冒泡排序法 { for(i=0;i<5-j;i++) { if(times[i]>times[i+1]) { t1=times[i]; times[i]=times[i+1]; times[i+1]=t1; t2=name[i]; name[i]=name[i+1]; name[i+1]=t2; } } } ofstreamoutf("扫雷一般.txt"); for(i=0;i<5;i++)//将前五名玩家信息存储到文件中并输出 { cout< outf< } outf.close(); } if(Dif==3)//读取困难扫雷的存储文件 { stringName; stringname[6]; doubleTime,rang; doubletimes[6]; inti=0; ifstreaminf("扫雷困难.txt"); for(i=0;i<5;i++)//文件中信息导入到数组里 { inf>>Name;inf>>rang>>Time; name[i]=Name; times[i]=Time; } inf.close(); name[5]=USer;//本轮玩家信息 times[5]=duration; doublet1=0; stringt2; for(intj=0;j<5;j++)//冒泡排序法 { for(i=0;i<5-j;i++) { if(times[i]>times[i+1]) { t1=times[i]; times[i]=times[i+1]; times[i+1]=t1; t2=name[i]; name[i]=name[i+1]; name[i+1]=t2; } } } ofstreamoutf("扫雷困难.txt"); for(i=0;i<5;i++)//将前五名玩家信息存储到文件中 { cout< outf< } outf.close(); } } } voidscale(intdif,char*User)//选择难度 { introw,column; if(dif==1){row=3;column=3;} if(dif==2){row=7;column=7;} if(dif==3){row=10;column=10;} cout<<"Thescaleis: "< thunder(dif,row,column,User); }; intmain() { intContinue=1; intdifficulty; charuser[10]; cout<<"Welcomtothegame! "< <<"请输入用户名! "< cin>>user; while(Continue==1) { cout<<"=======================*******************======================="< <<"请选择难度! "< <<"简单——1"< <<"一般——2"< <<"困难——3"< cin>>difficulty; scale(difficulty,user); cout<<"继续游戏——1结束游戏——0"< cin>>Continue; } return0; } 五、测试数据及其结果分析 显示的主菜单界面: Welcometothegame! 菜单: 请输入用户名! 测试数据: Q130104 菜单: 请选择菜单难度! 简单--1 一般--2 困难--3 选择菜单: 1 测试图: 游戏图: 不再需要检测,所以不再输出alls、surface数组 输入: 241 正确判断雷的位置,则用“@”表示 输入: 110 若正确选择了零的位置,则显示零周围的数字,及相临零及其周围数字 输入: 140 若正确选择数字位置,则显示数字 正确判断所有雷的位置并显示出所有数字 显示用户名及其所用时间,并保存在制定文件中 菜单: 继续游戏--1结束游戏--2 输入1按上述步骤成功后 显示已经玩过的人的成绩,并进行排名 若错误判断数字及雷的位置 选择菜单: 2 选择菜单: 3 六、调试过程中的问题 (1)刚开始编程时,随机产生的地雷数太少,后来放大了产生地雷条件的范围解决了问题; (2)无法正确输出附近的地雷数目,因为在数(x,y)周围地雷数时,会算到点(x-1,y)等可能不在数组范围内的点,最后我们放大了数组的范围,超出我们需要的,从而排除了这种情况;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计