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 }
c++实现扫雷游戏 初学的更多相关文章
- C语言实现扫雷游戏(完整版)
头文件定义.函数声明 下面就是扫雷中使用到的所有函数,为了省事我把所有的代码都放在一个C文件中实现 宏定义中设置了游戏的界面布局,以及设置地雷的个数(这里默认的是10个地雷),界面是一个9*9的方格布 ...
- 洛谷 P2670 扫雷游戏==Codevs 5129 扫雷游戏
题目描述 扫雷游戏是一款十分经典的单机小游戏.在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有 ...
- 原生javascript扫雷游戏
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Java练习(模拟扫雷游戏)
要为扫雷游戏布置地雷,扫雷游戏的扫雷面板可以用二维int数组表示.如某位置为地雷,则该位置用数字-1表示, 如该位置不是地雷,则暂时用数字0表示. 编写程序完成在该二维数组中随机布雷的操作,程序读入3 ...
- JAVA_扫雷游戏(布置地雷)
1.要为扫雷游戏布置地雷,扫雷游戏的扫雷面板可以用二维int数组表示.如某位置为地雷,则该位置用数字-1表示, 如该位置不是地雷,则暂时用数字0表示. 编写程序完成在该二维数组中随机布雷的操作,程序读 ...
- [LeetCode] Minesweeper 扫雷游戏
Let's play the minesweeper game (Wikipedia, online game)! You are given a 2D char matrix representin ...
- C语言二维数组实现扫雷游戏
#include<stdio.h> //使用二维数组实现 扫雷 int main() { char ui[8][8]={ '+','+','+','+','+','+','+','+', ...
- 【Android】自己动手做个扫雷游戏
1. 游戏规则 扫雷是玩法极其简单的小游戏,点击玩家认为不存在雷的区域,标记出全部地雷所在的区域,即可获得胜利.当点击不包含雷的块的时候,可能它底下存在一个数,也可能是一个空白块.当点击中有数字的块时 ...
- C#编写扫雷游戏
翻看了下以前大学学习的一些小项目,突然发现有个项目比较有意思,觉得有必要把它分享出来.当然现在看来,里面有很多的不足之处,但因博主现在已经工作,没有时间再去优化.这个项目就是利用C#编写一个Windo ...
随机推荐
- MATLAB利用solve函数解多元一次方程组
matlab求解多元方程组示例: syms k1 k2 k3; [k1 k2 k3] = solve(-3-k3==6, 2-k1-k2+2*k3==11, 2*k1+k2-k3+1==6)或者用[k ...
- 用cgroup限制内存以防止Linux因内存用尽卡死
Linux在内存用尽的情况下,整个界面,包括tty和ctrl-alt-F1都会卡住难以响应.虽然Linux内核有OOM Killer机制杀掉吃内存的进程,但经常内存用尽时连OOM Killer都无法动 ...
- centos8平台使用rz/sz上传下载文件
一,rz/sz的用途 1,rz,sz是Linux/Unix服务器同客户端通过ZModem进行文件传输的命令行工具 说明:客户端需要使用支持ZModem的telnet/ssh客户端(比如windows平 ...
- Navigator 的使用方法
对象属性 属性 Navigator 说明 appCodeName 返回浏览器的代码名 appName 返回浏览器的名称 appVersion 返回浏览器的平台和版本信息 cookieEnabled 返 ...
- C++ 设置软件激活不息屏
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);
- C# 将Excel里面的数据填充到DataSet中
/// <summary> /// 将Excel表里的数据填充到DataSet中 /// </summary> /// <param name="filenam ...
- C#Socket通讯(1)
前言 因为自己需要开发一款自己的游戏,因为设计网络方面,所以我找了很多的资料,再加上考虑到Unity游戏客户端直接连接数据库很容易导致数据库泄露,再加上网上很多的服务端都是用控制台做的,所以我就想做个 ...
- 如何解决json返回的乱码
方法一: 通过@RequestMaping的produces属性来实现,修改下代码 //produces:指定响应体返回类型和编码@RequestMapping(value = "/xxx& ...
- IntentService下载任务
onHandleIntent开启一个线程按顺序处理任务,不适合做大量任务 public class MainActivity extends AppCompatActivity { protected ...
- ORACLE 数据泵 expdp/impdp
ORACLE 数据泵 expdp/impdp 一.概念 Oracle Database 10g 引入了最新的数据泵(Data Dump)技术,数据泵导出导入 (EXPDP 和 IMPDP)的作用: 1 ...