- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++自动生成迷宫游戏由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例为大家分享了C++实现迷宫游戏的具体代码,供大家参考,具体内容如下 。
运用并查集自动生成迷宫地图,并运用队列和栈寻找迷宫通路并打印出来 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
|
#include<stdlib.h>
#include<iostream>
#include<
time
.h>
#include<queue>
#include<stack>
using namespace std;
using std::queue;
using std::stack;
typedef struct Point
{
int
x;
int
y;
int
d;//方向 若方向为-1,则表示起点
}Point;
queue<Point> mqueue;
stack<Point> mstack;
Point pos, pos1;
int
m, n;//迷宫行(tm-1)/2和列(tn-1)/2
int
tm, tn;//实际作图
int
x, y, tx1, tx2, ty1, ty2;//点坐标
int
d;
int
s[10000000];
int
maze[1000][1000], mark[1000][1000];//最大迷宫
int
sign[4][2] = { { -1,0 },{ 1,0 },{ 0,-1 },{ 0,1 } };//上下左右四个方向 0上 1下 2上 3下
Point start;
int
Find_x(
int
x);
void unionSets(
int
node1,
int
node2);
void Init();
int
getAdd(
int
x,
int
y);
void foundpath();
void fixmaze();
int
connected(
int
node1,
int
node2);
void Findpath();
void changemaze();
int
main()
{
Init();
cout <<
"请输入迷宫规模2x-1,2y-1:(x y)"
<< endl;
cin >> m >> n;
tm = m * 2 + 1;
tn = n * 2 + 1;
start.x = 1;
start.y = 1;
start.d = -1;
mqueue.push(start);
for
(
int
i = 0; i < tm; i++)
{
for
(
int
j = 0; j < tn; j++)
{
maze[i][j] = 1;
mark[i][j] = 0;
}
}
for
(
int
i = 1; i < tm - 1; i += 2)
{
for
(
int
j = 1; j < tn - 1; j += 2)
maze[i][j] = 0;
}
srand(
time
(
NULL
));
foundpath();
fixmaze();
cout <<
"迷宫全图:"
<< endl;
for
(
int
i = 0; i < tm; i++)
{
for
(
int
j = 0; j < tn; j++)
{
if (maze[i][j] == 1)
cout <<
"▇"
;
else
if (maze[i][j] == 0) cout <<
"□"
;
}
cout << endl;
}
Findpath();
changemaze();
cout <<
"找到的通路:“..”表示:"
<< endl;
for
(
int
i = 0; i < tm; i++)
{
for
(
int
j = 0; j < tn; j++)
{
if (maze[i][j] == 1)
cout <<
"▇"
;
else
if (maze[i][j] == 0) cout <<
"□"
;
else
if (maze[i][j] == -1) cout <<
".."
;
}
cout << endl;
}
system(
"pause"
);
return
0;
}
int
connected(
int
node1,
int
node2)
{
return
Find_x(node1) == Find_x(node2);
}
int
Find_x(
int
x)
{
if (s[x] < 0)
return
x;
else
return
Find_x(s[x]);
};
void unionSets(
int
node1,
int
node2)
{
int
root1 = Find_x(node1);
int
root2 = Find_x(node2);
if (root1 == root2)
return
;
if (s[root2] < s[root1])
s[root1] = root2;
else
{
if (s[root1] == s[root2])
s[root1]
--;
s[root2] = root1;
}
};
int
getAdd(
int
x,
int
y)
{
return
(x*tn + y);
};
void Init()
{
for
(
int
i = 0; i < 10000000; ++i)
s[i] = -1;
};
void foundpath()
{
while (connected(getAdd(1, 1), getAdd(tm - 2, tn - 2)) != 1)
{
do
{
x = rand() % (tm - 2) + 1;
y = rand() % (tn - 2) + 1;
} while (maze[x][y] == 0);
d = x % 2;
if (d == 0)
{
tx1 = x + 1;
ty1 = y;
tx2 = x - 1;
ty2 = y;
if (connected(getAdd(tx1, ty1), getAdd(tx2, ty2)) != 1)
{
maze[x][y] = 0;
unionSets(Find_x(getAdd(tx1, ty1)), Find_x(getAdd(tx2, ty2)));
}
}
else
if (d == 1)
{
tx1 = x;
ty1 = y + 1;
tx2 = x;
ty2 = y - 1;
if (connected(getAdd(tx1, ty1), getAdd(tx2, ty2)) != 1)
{
maze[x][y] = 0;
unionSets(Find_x(getAdd(tx1, ty1)), Find_x(getAdd(tx2, ty2)));
}
}
}
}
void fixmaze()
{
for
(
int
i = 1; i < tm - 1; i++)
{
for
(
int
j = 1; j < tn - 1; j++)
{
if (maze[i - 1][j] == 1 && maze[i + 1][j] == 1 && maze[i][j + 1] == 1 && maze[i][j - 1] == 1)
{
maze[i][j] = 1;
}
}
}
for
(
int
i = 1; i < tm - 1; i++)
{
for
(
int
j = 1; j < tn - 1; j++)
{
if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0)
{
maze[i][j] = 1;
}
if (maze[i - 1][j - 1] == 1 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0)
{
maze[i][j] = 1;
}
if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 1 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0)
{
maze[i][j] = 1;
}
if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 1 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0)
{
maze[i][j] = 1;
}
if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 1 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0)
{
maze[i][j] = 1;
}
if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 1 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0)
{
maze[i][j] = 1;
}
if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 1 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0)
{
maze[i][j] = 1;
}
if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 1 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0)
{
maze[i][j] = 1;
}
if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 1 && maze[i + 1][j + 1] == 0)
{
maze[i][j] = 1;
}
if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 1)
{
maze[i][j] = 1;
}
}
}//局部优化,防止出现大面积通路
}
void Findpath()
{
int
flag = 0;
int
i, j;
while (!mqueue.empty())
{
i = mqueue.front().x;
j = mqueue.front().y;
mark[i][j] = 1;
for
(
int
k = 0; k < 4; k++)
{
if (mark[i + sign[k][0]][j + sign[k][1]] == 0 && maze[i + sign[k][0]][j + sign[k][1]] == 0)
{
pos.x = i + sign[k][0];
pos.y = j + sign[k][1];
pos.d = k;
mark[pos.x][pos.y] = 1;
mqueue.push(pos);
if (mqueue.back().x == tm - 2 && mqueue.back().y == tn - 2)
{
mstack.push(mqueue.front());
mstack.push(mqueue.back());
flag = 1;
break;
}
}
}
if (flag) break;
mstack.push(mqueue.front());
if (!mqueue.empty())
mqueue.pop();
}
}
void changemaze()
{
int
i, j, k;
i = mstack.
top
().x;
j = mstack.
top
().y;
k = mstack.
top
().d;
maze[i][j] = -1;
while (mstack.
size
()>0)
{
if (mstack.
top
().x == i - sign[k][0] && mstack.
top
().y == j - sign[k][1])
{
i = i - sign[k][0];
j = j - sign[k][1];
k = mstack.
top
().d;
maze[i][j] = -1;
if (!mstack.empty())
mstack.pop();
}
else
if (!mstack.empty())
mstack.pop();
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
最后此篇关于C++自动生成迷宫游戏的文章就讲到这里了,如果你想了解更多关于C++自动生成迷宫游戏的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试使用以下 keytool 命令为我的应用程序生成 keystore : keytool -genkey -alias tomcat -keystore tomcat.keystore -ke
编辑:在西里尔正确解决问题后,我注意到只需将生成轴的函数放在用于生成标签的函数下面就可以解决问题。 我几乎读完了 O'Reilly 书中关于 D3.js 的教程,并在倒数第二页上制作了散点图,但是当添
虽然使用 GraphiQL 效果很好,但我的老板要求我实现一个用户界面,用户可以在其中通过 UI 元素(例如复选框、映射关系)检查呈现给他们的元素并获取数据,这样做将为该人生成 graphql 输入,
我尝试在 Netbean 6.8 中使用 ws-import 生成 Java 类。我想重新生成 jax-ws,因为在 ebay.api.paypalapi 包中发现了一个错误(我认为该错误是由于 Pa
我有一个 perl 脚本,它获取系统日期并将该日期写入文件名。 系统日期被分配给 TRH1 变量,然后它被设置为一个文件名。 $TRH1 =`date + %Y%m%d%H%M`; print "TR
我是 Haskell 的新手,需要帮助。我正在尝试构建一种必须具有某种唯一性的新数据类型,因此我决定使用 UUID 作为唯一标识符: data MyType = MyType { uuid ::
我制作了一个脚本,它可以根据 Mysql 数据库中的一些表生成 XML。 该脚本在 PHP 中运行。 public function getRawMaterials($apiKey, $format
所以这是我的项目中的一个问题。 In this task, we will use OpenSSL to generate digital signatures. Please prepare a f
我在 SAS LIFEREG 中有一个加速故障时间模型,我想绘制它。因为 SAS 在绘图方面非常糟糕,我想实际重新生成 R 中曲线的数据并将它们绘制在那里。 SAS 提出了一个尺度(在指数分布固定为
我正在为 Django 后端制作一个样板,并且我需要能够使它到达下一个下载它的人显然无法访问我的 secret key 的地方,或者拥有不同的 key 。我一直在研究一些选项,并在这个过程中进行了实验
我正在创建一个生成采购订单的应用程序。我可以根据用户输入的详细信息创建文本文件。我想生成一个看起来比普通文本文件好得多的 Excel。有没有可以在我的应用程序中使用的开源库? 最佳答案 目前还没有任何
我正在尝试使用 ScalaCheck 为 BST 创建一个 Gen,但是当我调用 .sample 方法时,它给了我 java.lang.NullPointerException。我哪里错了? seal
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我尝试编写一些代码,例如(在verilog中): parameter N = 128; if (encoder_in[0] == 1) begin 23 binary_out = 1;
我正忙于在 Grails 项目中进行从 MySQL 到 Postgres 的相当复杂的数据迁移。 我正在使用 GORM 在 PostGres 中生成模式,然后执行 MySQL -> mysqldump
如何使用纯 XSLT 生成 UUID?基本上是寻找一种使用 XSLT 创建独特序列的方法。该序列可以是任意长度。 我正在使用 XSLT 2.0。 最佳答案 这是一个good example 。基本上,
我尝试安装.app文件,但是当我安装并单击“同步”(在iTunes中)时,我开始在设备上开始安装,然后停止,这是一个问题,我不知道在哪里,但我看到了我无法解决的奇怪的事情: 最佳答案 似乎您没有在Xc
自从我生成 JavaDocs 以来已经有一段时间了,我确信这些选项在过去 10 年左右的时间里已经得到了改进。 我能否得到一些有关生成器的建议,该生成器将输出类似于 .Net 文档结构的 JavaDo
我想学习如何生成 PDF,我不想使用任何第三方工具,我想自己用代码创建它。到目前为止,我所看到的唯一示例是我通过在第 3 方 dll 上打开反射器查看的代码,以查看发生了什么。不幸的是,到目前为止我看
我正在从 Epplus 库生成 excel 条形图。 这是我成功生成的。 我的 table 是这样的 Mumbai Delhi Financial D
我是一名优秀的程序员,十分优秀!