首页 > 代码库 > 扫雷C++实现
扫雷C++实现
1 #include <iostream> 2 #include<fstream> 3 #include <ctime> 4 #include <cmath> 5 #include <stdlib.h> 6 #include<stdio.h> //时间 //文件 7 #include <string> 8 #define random(x)(rand()%x) 9 using namespace std; 10 void thunder(int Dif,int Row,int Column,char *USer) 11 { 12 int r,c,alls[22][22],backstage[22][22]={0}; 13 srand((int)time(0)); 14 for(r=1;r<=Row;r++) // 生成alls(0~1)1是雷 15 { 16 for(c=1;c<=Column;c++) 17 { 18 if(random(6)<1) {alls[r][c]=1;} else{alls[r][c]=0;}; 19 } 20 }; 21 for(r=0;r<=Row+1;r++) //生成 backstage(正确答案) 22 { 23 for(int c=0;c<=Column+1;c++) 24 { 25 if(alls[r][c]==1) 26 { 27 backstage[r][c]=‘*‘; //将1变为 * 代表雷 28 } 29 else 30 { 31 for(int i=r-1;i<=r+1;i++) //将0变为数字 (代表周围雷数) 32 for(int j=c-1;j<=c+1;j++) 33 { 34 35 if(alls[i][j]!=alls[r][c]&&alls[i][j]==1){backstage[r][c]++;}; 36 } 37 }; //else 结束 38 }; // for 结束 39 }; // for 结束 40 cout<<"======================*********================================"<<endl; 41 char surface[22][22]; //生成surface(用户界面) 42 for(r=0;r<22;r++) //全部为零 43 for(c=0;c<22;c++) 44 { 45 surface[r][c]=‘0‘; 46 } 47 for(r=1;r<=Row;r++) //中间化 # 形成0包围#的形式 (通过数 #-->(*||数字) 的个数 赢的时候停止循环) 48 for(c=1;c<=Column;c++) 49 { 50 surface[r][c]=‘#‘; 51 } 52 for(r=1;r<=Row;r++) //输出 surface 界面 便于检查 53 { 54 for(c=1;c<=Column;c++) {cout<<" "<<surface[r][c];}; 55 cout<<endl; 56 }; 57 cout<<"请按格式输入"<<endl 58 <<"前两个数字为坐标,最后一个数字“1”表示此位置为雷,“0”则表示不是。"<<endl 59 <<"如:1 3 1 表示一行三列是雷;2 4 0 表示二行四列不是雷"<<endl 60 <<"提示:当数字周围雷都被扫出时,可再次按要求输入此位置,可得到周围数字。"<<endl; 61 long i=10000000L; //计算时间开始 62 clock_t start,finish; 63 double duration; 64 start=clock(); 65 while(i--); //计算时间开始 66 int num=Row*Column; //计算#号个数 67 while(num!=0) //控制 是否点完所有位置 68 { 69 int x,y,judge; 70 cin>>x>>y>>judge; 71 if(alls[x][y]!=judge) 72 { 73 cout<<"you lose!!!"<<endl; 74 cout<<"The answer is:"<<endl; 75 for(r=1;r<=Row;r++) //输了 输出backstage 显示正确答案 76 { 77 for(int c=1;c<=Column;c++) 78 { 79 cout<<" "<<(char)(backstage[r][c]==42?backstage[r][c]:backstage[r][c]+‘0‘); //输出backstage 80 } 81 cout<<endl; 82 } 83 break; 84 } 85 else 86 { 87 if(alls[x][y]==1) {if(surface[x][y]==‘#‘){num--;}surface[x][y]=‘@‘; } // 雷 判断正确 显示“@”;数“#” 88 else 89 { 90 if(backstage[x][y]!=0) // 数字 判断正确 显示数字 91 { 92 if(surface[x][y]==‘#‘){num--; surface[x][y]=backstage[x][y]+‘0‘; } // 数“#” 93 else 94 { 95 int lei_num=0; 96 for(int i=x-1;i<=x+1;i++) //数 数字周围 雷的个数 97 for(int j=y-1;j<=y+1;j++) 98 { 99 if(surface[i][j]==‘@‘)100 lei_num++;101 }102 if(backstage[x][y]==lei_num) // 看数字周围雷是否全部扫出 提示 显示数字周围103 {104 for(int i=x-1;i<=x+1;i++)105 for(int j=y-1;j<=y+1;j++)106 if(surface[i][j]==‘#‘) //数“#”107 {108 surface[i][j]=backstage[i][j]+‘0‘;109 num--; 110 }111 }112 }113 }114 else // 数字为零时 显示零周围的零115 {116 if(surface[x][y]==‘#‘){num--;}; //数“#”117 surface[x][y]=backstage[x][y]+‘0‘;118 for(int i=x-1;i<=x+1;i++) // 显示零周围的数字119 for(int j=y-1;j<=y+1;j++)120 if(surface[i][j]==‘#‘) // 避免 死循环121 {122 surface[i][j]=backstage[i][j]+‘0‘; 123 num--; //数“#”124 }125 for(int k=0;k<20;k++) //最多20层零 (点出最边上的零)126 {127 for (int R=1;R<=Row;R++) //检查所有零128 for(int C=1;C<=Column;C++) //再次显示零周围的数字129 {130 if(surface[R][C]==‘0‘)131 {132 for(int i=R-1;i<=R+1;i++)133 for(int j=C-1;j<=C+1;j++)134 {135 if(surface[i][j]==‘#‘) // 避免 死循环 数“#”136 {137 surface[i][j]=backstage[i][j]+‘0‘;138 num--;139 } 140 }141 }142 } //匹配for 内143 } //匹配 for 外144 }//匹配else145 }//匹配else146 }//匹配els147 cout<<endl;148 cout<<"======================*********================================"<<endl;149 for(r=1;r<=Row;r++) //输出界面(已修改)150 {151 for(c=1;c<=Column;c++) {cout<<" "<<surface[r][c];};152 cout<<endl;153 };154 } //匹配while155 finish=clock(); //计算时间结束156 duration=(double)(finish-start)/CLOCKS_PER_SEC; //时间变量157 if(num==0) //所有158 {159 cout<<" You win! Congratulations!! "<<endl;160 cout<<" Your time is: "<<duration<<endl;161 if(Dif==1) //读取 简单扫雷 的存储文件162 {163 string Name;164 string name[6];165 double Time,rang;166 double times[6];167 int i=0;168 ifstream inf("扫雷 简单.txt");169 for(i=0;i<5;i++) //文件中信息导入到数组里170 {171 inf>>Name;inf>>rang>>Time;172 name[i]=Name;173 times[i]=Time;174 }175 inf.close();176 name[5]=USer; //本轮玩家信息177 times[5]=duration;178 double t1=0;179 string t2;180 for(int j=0;j<5;j++) //冒泡排序法181 { 182 for(i=0;i<5-j;i++)183 {184 if(times[i]>times[i+1])185 {186 t1=times[i];187 times[i]=times[i+1];188 times[i+1]=t1;189 t2=name[i];190 name[i]=name[i+1];191 name[i+1]=t2;192 }193 }194 }195 ofstream outf("扫雷 简单.txt");196 for(i=0;i<5;i++) //将前五名玩家信息存储到文件中197 {198 cout<<name[i]<<" "<<i+1<<" "<<times[i]<<endl;199 outf<<name[i]<<" "<<i+1<<" "<<times[i]<<endl;200 }201 outf.close();202 }203 if(Dif==2) //读取 一般扫雷 的存储文件204 {205 string Name;206 string name[6];207 double Time,rang;208 double times[6];209 int i=0;210 ifstream inf("扫雷 一般.txt");211 for(i=0;i<5;i++) //文件中信息导入到数组里212 {213 inf>>Name;inf>>rang>>Time;214 name[i]=Name;215 times[i]=Time;216 }217 inf.close();218 name[5]=USer; //本轮玩家信息219 times[5]=duration;220 double t1=0;221 string t2;222 for(int j=0;j<5;j++) //冒泡排序法223 { 224 for(i=0;i<5-j;i++)225 {226 if(times[i]>times[i+1])227 {228 t1=times[i];229 times[i]=times[i+1];230 times[i+1]=t1;231 t2=name[i];232 name[i]=name[i+1];233 name[i+1]=t2;234 }235 }236 }237 ofstream outf("扫雷 一般.txt");238 for(i=0;i<5;i++) //将前五名玩家信息存储到文件中 并输出239 {240 cout<<name[i]<<" "<<i+1<<" "<<times[i]<<endl;241 outf<<name[i]<<" "<<i+1<<" "<<times[i]<<endl;242 }243 outf.close();244 }245 if(Dif==3) //读取 困难扫雷 的存储文件246 {247 string Name;248 string name[6];249 double Time,rang;250 double times[6];251 int i=0;252 ifstream inf("扫雷 困难.txt");253 for(i=0;i<5;i++) //文件中信息导入到数组里254 {255 inf>>Name;inf>>rang>>Time;256 name[i]=Name;257 times[i]=Time;258 }259 inf.close();260 name[5]=USer; //本轮玩家信息261 times[5]=duration;262 double t1=0;263 string t2;264 for(int j=0;j<5;j++) //冒泡排序法265 { 266 for(i=0;i<5-j;i++)267 {268 if(times[i]>times[i+1])269 {270 t1=times[i];271 times[i]=times[i+1];272 times[i+1]=t1;273 t2=name[i];274 name[i]=name[i+1];275 name[i+1]=t2;276 }277 }278 }279 ofstream outf("扫雷 困难.txt");280 for(i=0;i<5;i++) //将前五名玩家信息存储到文件中281 {282 cout<<name[i]<<" "<<i+1<<" "<<times[i]<<endl;283 outf<<name[i]<<" "<<i+1<<" "<<times[i]<<endl;284 }285 outf.close();286 }287 }288 }289 void scale(int dif,char *User) //选择难度290 {291 int row,column;292 if(dif==1) {row=3;column=3;}293 if(dif==2) {row=7;column=7;}294 if(dif==3) {row=10;column=10;}295 cout<<"The scale is: "<<row<<"*"<<column<<endl;296 thunder(dif,row,column,User);297 };298 int main()299 { 300 int Continue=1;301 int difficulty;302 char user[10];303 cout<<" Welcom to the game! "<<endl304 <<" 请输入用户名! "<<endl;305 cin>>user;306 while(Continue==1)307 {308 cout<<"=======================*******************======================="<<endl309 <<" 请选择难度! "<<endl310 <<" 简单——1 "<<endl311 <<" 一般——2 "<<endl312 <<" 困难——3 "<<endl;313 cin>>difficulty;314 scale(difficulty,user);315 cout<<"继续游戏——1 结束游戏——0"<<endl;316 cin>>Continue;317 }318 return 0;319 }
扫雷C++实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。