设计思路


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

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


功能:

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


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 }

c++实现扫雷游戏 初学的更多相关文章

  1. C语言实现扫雷游戏(完整版)

    头文件定义.函数声明 下面就是扫雷中使用到的所有函数,为了省事我把所有的代码都放在一个C文件中实现 宏定义中设置了游戏的界面布局,以及设置地雷的个数(这里默认的是10个地雷),界面是一个9*9的方格布 ...

  2. 洛谷 P2670 扫雷游戏==Codevs 5129 扫雷游戏

    题目描述 扫雷游戏是一款十分经典的单机小游戏.在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有 ...

  3. 原生javascript扫雷游戏

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Java练习(模拟扫雷游戏)

    要为扫雷游戏布置地雷,扫雷游戏的扫雷面板可以用二维int数组表示.如某位置为地雷,则该位置用数字-1表示, 如该位置不是地雷,则暂时用数字0表示. 编写程序完成在该二维数组中随机布雷的操作,程序读入3 ...

  5. JAVA_扫雷游戏(布置地雷)

    1.要为扫雷游戏布置地雷,扫雷游戏的扫雷面板可以用二维int数组表示.如某位置为地雷,则该位置用数字-1表示, 如该位置不是地雷,则暂时用数字0表示. 编写程序完成在该二维数组中随机布雷的操作,程序读 ...

  6. [LeetCode] Minesweeper 扫雷游戏

    Let's play the minesweeper game (Wikipedia, online game)! You are given a 2D char matrix representin ...

  7. C语言二维数组实现扫雷游戏

    #include<stdio.h> //使用二维数组实现 扫雷 int main() { char ui[8][8]={ '+','+','+','+','+','+','+','+', ...

  8. 【Android】自己动手做个扫雷游戏

    1. 游戏规则 扫雷是玩法极其简单的小游戏,点击玩家认为不存在雷的区域,标记出全部地雷所在的区域,即可获得胜利.当点击不包含雷的块的时候,可能它底下存在一个数,也可能是一个空白块.当点击中有数字的块时 ...

  9. C#编写扫雷游戏

    翻看了下以前大学学习的一些小项目,突然发现有个项目比较有意思,觉得有必要把它分享出来.当然现在看来,里面有很多的不足之处,但因博主现在已经工作,没有时间再去优化.这个项目就是利用C#编写一个Windo ...

随机推荐

  1. Brew error: Could not symlink, path is not writable

    As explained here by Rick: Start with brew doctor which will show you errors with your brew setup. Y ...

  2. Python数据类型--元组(tuple)

    元组与列表非常相似,最大区别在于: (1)元组是不可修改的,定义之后就"固定"了. (2)元组在形式上是用()这样的圆括号括起来 (3)元组不能插入或删除元素 注:元素可修改与不可 ...

  3. 多测师讲解 ———python2和Python3区别

    python3.x和python2.x的区别:1.Python3.X源码文件默认使用utf-8编码,而python2.x的编译最前端需要加上#coding=utf-82.python3.x里打印pri ...

  4. MeteoInfoLab脚本示例:天气现象符号

    天气现象符号分布图实际就是散点图,可以用scatterm函数绘制,但之前需要创建天气符号图例,用weatherspec函数.如果只需要绘制某些天气现象(比如雾.霾),可以给出相应的天气符号序号列表(可 ...

  5. MeteoInfoLab脚本示例:闪电位置图

    这个脚本示例读取文本格式的闪电数据,读出每条闪电记录的经纬度和强度,在地图上绘制出每个闪电的位置,并用符号和颜色区分强度正负.数据格式如下:0 2009-06-06 00:01:16.6195722 ...

  6. <audio> 标签

    <audio> 标签定义声音,比如音乐或其他音频流. 实例 一段简单的 HTML 5 音频:

  7. 【转】Python3 正则表达式特殊符号及用法(详细列表)

    转载自鱼c论坛:https://fishc.com.cn/forum.php?mod=viewthread&tid=57691&extra=page%3D1%26filter%3Dty ...

  8. Scala编程 笔记

    date: 2019-08-07 11:15:00 updated: 2019-11-25 20:00:00 Scala编程 笔记 1. makeRDD 和 parallelize 生成 RDD de ...

  9. 签到功能,用 MySQL 还是 Redis ?

    现在的网站和app开发中,签到是一个很常见的功能,如微博签到送积分,签到排行榜. 如移动app ,签到送流量等活动.   用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面我们从技术方面看看常 ...

  10. Apache POI 合并单元格--简单解释版带Demo

    合并单元格所使用的方法: sheet.addMergedRegion( CellRangeAddress  cellRangeAddress  );   CellRangeAddress  对象的构造 ...