c++实现扫雷游戏 初学
设计思路
全局变量定义地图和一些判断信息
创建三个地图 分别表示 源地图 显示的效果地图 和一个用来判断点位是否被选中的地图
功能:
玩家输入要翻开的格子的行数和列数。用一个函数来翻开目标格子,如果是地雷游戏失败,可以选择是否重新游戏并且刷新一个新的随机地图,否则用一个函数统计目标格子周围的地雷数。如果周围没有地雷,则递归使用一个函数将附近周围没有地雷的格子全部打开,最后判断是否游戏胜利,胜利可以选择是否进入下一关,并增加难度。
tips:
本代码我拿来测试了一下 将m地雷数和x关卡数设置的比较简单 可以自行修改关卡
(写的并不好 没有用到结构体和指针 可以自行加工)
代码实现
1 #include<iostream> 2 #include<windows.h> 3 using namespace std; 4 5 int i, j, stop = 0, m = 2, stop2 = 0,x=1; 6 //stop判断游戏是否失败 m雷数 x关卡 stop2 判断游戏成功 7 char k[20][20];//地图信息 8 int h=5,l=5;//地图行列 9 char show[20][20] ;//地图是否被翻开 10 char showmap[20][20];//输出的地图 11 12 13 14 void showMap(int i, int j)//输出地图 15 { 16 cout <<"关卡"<<x ; 17 cout <<' '; 18 cout <<"雷数"<<h; 19 cout << endl; 20 cout << ' '; 21 for (i = 0; i < h; i++) 22 cout << i << ' '; 23 cout << endl; 24 for (i = 0; i < h; i++) 25 { 26 cout << i; 27 cout <<' '; 28 for (j = 0; j < l; j++) 29 { 30 31 if (show[i][j] == 0)//没翻开 32 printf("■"); 33 else if (show[i][j] == 2) //标记 34 { 35 printf("# "); 36 } 37 else 38 cout << showmap[i][j] << ' ';// 39 40 } 41 cout << endl; 42 }//框架 43 if (stop == 1)//判断游戏是否结束 44 { system("cls"); 45 cout << ' '; 46 for (i = 0; i < h; i++) 47 cout << i << ' '; 48 cout << endl; 49 for (i = 0; i < h; i++) 50 { 51 cout << i; 52 for (j = 0; j < l; j++) 53 { 54 if (k[i][j] == '*') 55 printf("* "); 56 else 57 printf("■"); 58 } 59 cout << endl; 60 } 61 cout << endl; 62 } 63 } 64 65 66 67 68 69 70 bool nominefindfs(int row, int col)//遍历判断空白 71 { 72 int roemove[8] = { 1,1,1,0,0,-1,-1,-1 }; 73 int colmove[8] = { 1,0,-1,1,-1,-1,0,1 }; 74 if (k[row][col] == '*') return false; 75 if (row < 0 || col < 0 || row >= 10 || col >= 10) return false; 76 77 showmap[row][col] = k[row][col]; 78 show[row][col] = 1; 79 if (k[row][col] != ' ') return false; 80 81 for (int i = 0; i < 8; i++) 82 { 83 int nextrow = row + roemove[i]; 84 85 int nextcol = col + colmove[i]; 86 87 if (nextrow >= 0 && nextrow < h && nextcol >= 0 && nextcol < l) 88 { 89 90 if (show[nextrow][nextcol] == 0 && k[nextrow][nextcol] != '*') 91 { 92 nominefindfs(nextrow, nextcol); 93 } 94 } 95 } 96 97 } 98 99 void change(int i, int j)//把选中的坐标输出 100 { 101 switch (k[i][j]) { 102 case ' ': 103 nominefindfs(i, j); 104 break; 105 case '*': 106 cout << '*'; 107 showmap[i][j] = '*'; 108 stop = 1; 109 break; 110 default: 111 showmap[i][j] = k[i][j]; 112 break; 113 } 114 } 115 int main() 116 { 117 system("color 0B"); 118 system("cls"); 119 stop = 0; stop2 = 0; 120 for (i = 0; i < h; i++) 121 for (j = 0; j < l; j++) 122 { 123 k[i][j]=' '; 124 show[i][j] = 0;//默认没翻开 125 showmap[i][j] = ' '; 126 } 127 //数字问题 关卡 128 for (j = 0; j < h; j++) 129 { 130 k[rand() % h][rand() % h] = '*'; 131 } 132 133 int sum = 0; //统计周围地雷数量 134 for (i = 0; i < h; i++) 135 for (j = 0; j < l; j++) 136 { 137 sum = 0; 138 if(k[i][j]!='*') 139 { 140 141 142 if (i - 1 >= 0 && j - 1 >= 0 && k[i - 1][j- 1] =='*') 143 sum++; 144 if (i - 1 >= 0 && k[i - 1][j] == '*') 145 sum++; 146 if (i - 1 >= 0 && j+ 1 < 10 && k[i - 1][j+ 1] == '*') 147 sum++; 148 if ( j- 1 >= 0 && k[i ][j- 1] == '*') 149 sum++; 150 if (j+ 1 < 10 && k[i][j+1] == '*') 151 sum++; 152 if (i + 1 < 10 && j- 1 >= 0 && k[i +1][j- 1] == '*') 153 sum++; 154 if (i + 1 < 10 && k[i+ 1][j] == '*') 155 sum++; 156 if (i +1 < 10 && j+ 1 < 10 && k[i + 1][j+ 1] == '*') 157 sum++; 158 } 159 160 switch(sum){ 161 case 1: 162 k[i][j]='1'; 163 break; // 可选的 164 case 2: 165 k[i][j]='2'; 166 break; // 可选的 167 case 3: 168 k[i][j]='3'; 169 break; // 可选的 170 case 4: 171 k[i][j]='4'; 172 break; // 可选的 173 case 5: 174 k[i][j]='5'; 175 break; // 可选的 176 case 6: 177 k[i][j]='6'; 178 break; // 可选的 179 case 7: 180 k[i][j]='7'; 181 break; // 可选的 182 case 8: 183 k[i][j]='8'; 184 break; // 可选的 185 default : // 可选的 186 break; 187 } 188 } 189 190 191 192 int temp,jx; 193 showMap(i, j); 194 while (1) 195 { 196 if (stop == 1)//判断游戏是否结束 197 { 198 cout << "游戏失败QAQ"; 199 cout<<endl; 200 cout <<"重新游戏请输入1..."; 201 cout<<endl; 202 cout <<"退出游戏输入任意数字..."; 203 cout<<endl; 204 cin>>jx; 205 if(jx==1)//判断是否继续游戏 206 { 207 jx=0; 208 main(); 209 } 210 else 211 break; 212 } 213 214 if (stop2 == m) 215 { 216 cout << "游戏成功QWQ!"; 217 cout<<endl; 218 cout <<"进入下一关请输入1..."; 219 cout<<endl; 220 cout <<"退出游戏输入任意数字..."; 221 cout<<endl; 222 cin>>jx; 223 if(jx==1) 224 { 225 226 if(x==3) 227 { 228 system("cls"); 229 cout << "闯关成功!!!"; 230 cout<<endl; 231 232 break; 233 } 234 x++; 235 h+=2; 236 l+=2; 237 jx=9; 238 main(); 239 } 240 else 241 break; 242 243 } 244 cout << "---1.扫雷-------2.标记雷---"; 245 cin >> temp; 246 if (temp == 1) 247 { 248 cout << "请输入坐标"; 249 cin >> i; 250 cin >> j; 251 system("cls"); 252 show[i][j] = 1;//翻开 253 change(i, j); 254 showMap(i, j); 255 256 } 257 else 258 { 259 cout << "请输入坐标"; 260 cin >> i; 261 cin >> j; 262 system("cls"); 263 show[i][j] = 2;//标记 264 showMap(i, j); 265 stop2++; 266 } 267 268 } 269 return 0; 270 }