![見出し画像](https://assets.st-note.com/production/uploads/images/150745232/rectangle_large_type_2_c58e9c54006beac5cbb47bb4e76dec39.png?width=1200)
Scratchで迷路を自動で作成してみた。
Scratchで自動迷路作成を行いたいと思い、作成してみました。
迷路を自動作成する方法は、いくつかあるけれども、今回は壁伸ばし法で作成したいと思います。
完成したScratch
作成方法について
スプライトは、「ペン」というスプライト1つだけにします。
![](https://assets.st-note.com/img/1723666611608-rsEpqmFdgd.png)
スプライト「ペン」のコスチュームは4つ。すべて50×50のサイズで、白、ピンク、紫、青としました。
![](https://assets.st-note.com/img/1723666637074-D7gAuQx4cA.png)
スプライト「ペン」の中にコードを作ります。
大きな流れとして、次のようになります。
①初期設定
※(壁を描画)
②壁の根本候補取得
③くりかえし(壁の根本候補が0になるまで)
・④ランダムに選んだ根本候補から壁を生やす
・※(壁を描画)
・⑤生成中の壁を生成後の壁にする
・壁の根本候補の取得(②と同じ内容)
※(壁を描画)
※(壁を描画)については、最後に1回だけ行うだけでもいいのですが、
作成途中を見るのが面白かった(ずっと見ていられる)ので、入れてあります。
![](https://assets.st-note.com/img/1723666438811-cEE74mBJpI.png)
緑の旗が押されたとき
隠す
幽霊の効果を25 にする
初期設定
壁を描画
壁の根本候補取得
壁の根本候補の長さ = 0 まで繰り返す
ランダムに選んだ根本候補から壁を生やす
壁を描画
生成中の壁を生成後の壁にする
壁の根本候補取得
壁を描画
隠す
次からは、それぞれのブロックの中身を紹介します。
①「初期設定」ブロック
![](https://assets.st-note.com/img/1723667409506-cCO0py9zrf.png?width=1200)
定義 初期設定
全部消す
★迷路リスト のすべてを削除する
横xのブロック数 を 47 にする
縦yのブロック数 を 35 にする
j を 1 にする
縦yのブロック数回繰り返す
i を 1 にする
横xのブロック数回繰り返す
もし j = 1 または j = 縦yのブロック数 なら
3 を迷路リスト に追加する
でなければ
もし i = 1 または i = 横xのブロック数 なら
3 を迷路リスト に追加する
でなければ
もし j を 2 で割った余り = 0 なら
もし i を 2 で割った余り = 0 なら
0 を迷路リスト に追加する
でなければ
0 を迷路リスト に追加する
でなければ
もしを i を 2 で割った余り = 0 なら
0 を迷路リスト に追加する
でなければ
1 を迷路リスト に追加する
i を 1 ずつ変える
j を 1 ずつ変える
※「壁を描画」ブロック
![](https://assets.st-note.com/img/1723667490678-OcRbHngu20.png?width=1200)
定義 壁を描画
(ペン)全部消す
表示する
大きさを 20 %にする
j を 1 にする
縦yのブロック数 回繰り返す
i を 1 にする
横xのブロック数 回繰り返す
x座標を -240 - (大きさ / 4) + (大きさ / 2) * i 、
y座標を 180 + (大きさ / 4) - (大きさ / 2) * j にする
コスチュームを ★迷路リスト の i * (j - 1) * 横xのブロック数 番目 にする
(ペン)スタンプ
i を 1 ずつ変える
j を 1 ずつ変える
②「壁の根本候補の取得」ブロック
![](https://assets.st-note.com/img/1723667661103-gZH5ysJQ8R.png)
定義 壁の根本候補取得
壁の根本候補 のすべてを削除する
i を 1 にする
★迷路リスト の長さ 回繰り返す
もし ★迷路リスト の i 番目 = 1 なら
i を壁の根本候補 に追加する
i を 1 ずつ変える
④「ランダムに選んだ根本候補から壁を生やす」ブロック
![](https://assets.st-note.com/img/1723667932666-vEQCbXGfBQ.png)
定義 ランダムに選んだ根本候補から壁を生やす
現在地 を 壁の根本候補 の 1 から 壁の根本候補 の長さ までの乱数 番目 にする
終了判定 を 0 にする
生成中の壁に接続しないように壁を伸ばす
④-1「生成中の壁に接続しないように壁を伸ばす」ブロック
![](https://assets.st-note.com/img/1723668185750-3mkGjaGF7f.png?width=1200)
定義 生成中の壁に接続しないように壁を伸ばす
終了判定 = 1 まで繰り返す
★迷路リスト の現在地 番目を 2 で置き換える
周りの様子チェック 現在地
もし 移動方向リスト の長さ > 0 なら
壁を生やす方向 を 移動方向リスト の 1 から 移動方向リスト の長さ までの乱数 番目 にする
もし 壁を生やす方向 = 上 または 壁を生やす方向 = 下 なら
もし 壁を生やす方向 = 上 なら
処理する位置 を現在地 - 横xのブロック数 にする
移動先 を現在地 横xのブロック数 * 2 にする
でなければ
処理する位置 を現在地 + 横xのブロック数にする
移動先 を 現在地 + 横xのブロック数 * 2 にする
でなければ
もし 壁を生やす方向 = 左 なら
処理する位置 を 現在地 - 1 にする
移動先 を 現在地 + 2 にする
でなければ
処理する位置 を現在地 + 1 にする
移動先 を 現在地 + 2 にする
★迷路リスト の処理する位置 番目を 2 で置き換える
もし ★迷路リスト の移動先 番目 = 3 なら
終了判定 を 1 にする
でなければ
現在地 を 移動先にする
でなければ
戻って壁を伸ばす
④-1-1「周りの様子チェック」
![](https://assets.st-note.com/img/1723668473713-jmAzXuglkl.png?width=1200)
定義 周りの様子チェック 現在地
移動方向リスト のすべてを削除する
もし ★迷路リスト の 現在地 - 横xのブロック数 番目 = 0 かつ
★迷路リスト の 現在地 - 横xのブロック数 * 2 番目 = 2 ではない なら
上を移動方向リスト に追加する
もし ★迷路リスト の 現在地 + 横xのブロック数 番目 = 0 かつ
★迷路リスト の 現在地 + 横xのブロック数 * 2 番目 = 2 ではない なら
下を移動方向リスト に追加する
もし ★迷路リスト の 現在地 - 1 番目 = 0 かつ
★迷路リスト の 現在地 - 2 番目 = 2 ではない なら
左を移動方向リスト に追加する
もし ★迷路リスト の 現在地 + 1 番目 = 0 かつ
★迷路リスト の 現在地 + 2 番目 = 2 ではない なら
右を移動方向リスト に追加する
④-1-2「戻って壁を伸ばす」ブロックの中身
![](https://assets.st-note.com/img/1723667866026-WuEwmTt4l0.png)
定義 戻って壁を伸ばす
壁の根本候補 のすべてを削除する
生成中の壁から根本候補を取得
現在地 を 壁の根本候補 の 1 から 壁の根本候補 の長さ までの乱数 番目 にする
生成中の壁に接続しないように壁を伸ばす
⑤「生成中の壁を生成後の壁にする」ブロックの中身
![](https://assets.st-note.com/img/1723667746837-MT5CF4l5i4.png)
定義 生成中の壁から根本候補を取得
i を 1 にする
★迷路リスト の長さ 回繰り返す
もし i を 2で 割った余り なら
もし ★迷路リスト の i 番目 = 2 なら
i を壁の根本候補 に追加する
i を 1 ずつ変える