迷路生成
https://scrapbox.io/files/64454eeada97c7001be27563.png
使い方
CreateMaze(int32 横幅,int32 縦幅);
横幅と縦幅は奇数にしてください。
生成アルゴリズムは穴掘り法です。
用途
ゲームなど
コード
code:迷路生成.cpp
# include <Siv3D.hpp>
/// @brief 迷路を生成する
/// @param size 迷路の大きさ(奇数)
/// @return 迷路(true:壁 false:道)
Grid<bool> CreateMaze(const Size& size)
{
constexpr Point dList4 = { {0,-2},{0,2},{-2,0},{2,0} };
Grid<bool> maze(size, true);
Array<Point>stack;
Point pos{ 2 * Random(size.x / 2 - 1) + 1,2 * Random(size.y / 2 - 1) + 1 };// 初期位置をランダムに決める(奇数)
mazepos = false;
stack << pos;
//stackが空になるまでループ
while (stack.size())
{
Point pos = stack.back();
stack.pop_back();
//確認した方向を記録する変数(上下左右)
bool checked4 = { false };
// 全方向確認するまでループ
while (not(checked0 && checked1 && checked2 && checked3))
{
// 方向をランダムに決める
int32 r = Random(3);
Point d = dListr;
checkedr = true;
// 範囲外に出ないか確認
if (InRange((pos + d).x, 1, size.x - 1) && InRange((pos + d).y, 1, size.y - 1)) {
// 既に道になっていないか確認
if (mazepos + d == true) {
mazepos + d = false;
mazepos + d / 2 = false;
pos += d;
stack << pos;
checked0 = checked1 = checked2 = checked3 = false;
}
}
}
}
return maze;
}
void Main()
{
auto map = CreateMaze({ 51, 51 });
constexpr int32 size = 10;
while (System::Update())
{
for (auto pos : step(map.size()))
{
if (mappos)
{
Rect{ pos * size, size }.draw();
}
}
}
}
#アルゴリズム
#ゲーム