c++实现扫雷游戏 初学


设计思路


全局变量定义地图和一些判断信息

创建三个地图 分别表示 源地图  显示的效果地图  和一个用来判断点位是否被选中的地图


功能:

玩家输入要翻开的格子的行数和列数。用一个函数来翻开目标格子,如果是地雷游戏失败,可以选择是否重新游戏并且刷新一个新的随机地图,否则用一个函数统计目标格子周围的地雷数。如果周围没有地雷,则递归使用一个函数将附近周围没有地雷的格子全部打开,最后判断是否游戏胜利,胜利可以选择是否进入下一关,并增加难度。


tips:

本代码我拿来测试了一下 将m地雷数和x关卡数设置的比较简单 可以自行修改关卡

(写的并不好 没有用到结构体和指针 可以自行加工)


代码实现


  1 #include
  2 #include
  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 }