見出し画像

Scratchで迷路を自動で作成してみた。

Scratchで自動迷路作成を行いたいと思い、作成してみました。
迷路を自動作成する方法は、いくつかあるけれども、今回は壁伸ばし法で作成したいと思います。

完成したScratch

作成方法について

スプライトは、「ペン」というスプライト1つだけにします。

スプライト「ペン」のコスチュームは4つ。すべて50×50のサイズで、白、ピンク、紫、青としました。

スプライト「ペン」の中にコードを作ります。

大きな流れとして、次のようになります。
①初期設定
※(壁を描画)
②壁の根本候補取得
③くりかえし(壁の根本候補が0になるまで)
 ・④ランダムに選んだ根本候補から壁を生やす
 ・※(壁を描画)
 ・⑤生成中の壁を生成後の壁にする
 ・壁の根本候補の取得(②と同じ内容)
※(壁を描画)

※(壁を描画)については、最後に1回だけ行うだけでもいいのですが、
作成途中を見るのが面白かった(ずっと見ていられる)ので、入れてあります。

緑の旗が押されたとき
隠す
幽霊の効果を25 にする
初期設定
壁を描画
壁の根本候補取得
壁の根本候補の長さ = 0 まで繰り返す
  ランダムに選んだ根本候補から壁を生やす
  壁を描画
  生成中の壁を生成後の壁にする
  壁の根本候補取得

壁を描画
隠す

次からは、それぞれのブロックの中身を紹介します。

①「初期設定」ブロック

定義 初期設定
全部消す
★迷路リスト のすべてを削除する
横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 ずつ変える

※「壁を描画」ブロック

定義 壁を描画
(ペン)全部消す
表示する
大きさを 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 ずつ変える

②「壁の根本候補の取得」ブロック

定義 壁の根本候補取得
壁の根本候補 のすべてを削除する
i を 1 にする
★迷路リスト の長さ 回繰り返す
  もし ★迷路リスト の i 番目 = 1 なら
    i を壁の根本候補 に追加する
  i を 1 ずつ変える

④「ランダムに選んだ根本候補から壁を生やす」ブロック

定義 ランダムに選んだ根本候補から壁を生やす
現在地 を 壁の根本候補 の 1 から 壁の根本候補 の長さ までの乱数 番目 にする 
終了判定 を 0 にする
生成中の壁に接続しないように壁を伸ばす

④-1「生成中の壁に接続しないように壁を伸ばす」ブロック

定義 生成中の壁に接続しないように壁を伸ばす
終了判定 = 1 まで繰り返す
  ★迷路リスト の現在地 番目を 2 で置き換える
  周りの様子チェック 現在地
  もし 移動方向リスト の長さ > 0 なら
    壁を生やす方向 を 移動方向リスト の 1 から 移動方向リスト の長さ までの乱数 番目 にする
    もし 壁を生やす方向 = 上 または 壁を生やす方向 = 下 なら
      もし 壁を生やす方向 = 上 なら
        処理する位置 を現在地 - 横xのブロック数 にする
        移動先 を現在地 横xのブロック数 * 2 にする
      でなければ
        処理する位置 を現在地 + 横xのブロック数にする
        移動先 を 現在地 + 横xのブロック数 * 2 にする
    でなければ
      もし 壁を生やす方向 = 左 なら
        処理する位置 を 現在地 - 1 にする
        移動先 を 現在地 + 2 にする
      でなければ
        処理する位置 を現在地 + 1 にする
        移動先 を 現在地 + 2 にする
    ★迷路リスト の処理する位置 番目を 2 で置き換える
    もし ★迷路リスト の移動先 番目 = 3 なら
    終了判定 を 1 にする
    でなければ
    現在地 を 移動先にする
  でなければ
    戻って壁を伸ばす

④-1-1「周りの様子チェック」

定義 周りの様子チェック 現在地
移動方向リスト のすべてを削除する
  もし ★迷路リスト の 現在地 - 横xのブロック数 番目 = 0 かつ
     ★迷路リスト の 現在地 - 横xのブロック数 * 2 番目 = 2 ではない なら
     上を移動方向リスト に追加する
  
  もし ★迷路リスト の 現在地 + 横xのブロック数 番目 = 0 かつ
     ★迷路リスト の 現在地 + 横xのブロック数 * 2 番目 = 2 ではない なら
     下を移動方向リスト に追加する
  
  もし ★迷路リスト の 現在地 - 1 番目 = 0 かつ
         ★迷路リスト の 現在地 - 2 番目 = 2 ではない なら
     左を移動方向リスト に追加する
  
  もし ★迷路リスト の 現在地 + 1 番目 = 0 かつ
     ★迷路リスト の 現在地 + 2 番目 = 2 ではない なら
     右を移動方向リスト に追加する

④-1-2「戻って壁を伸ばす」ブロックの中身

定義 戻って壁を伸ばす
壁の根本候補 のすべてを削除する
生成中の壁から根本候補を取得
現在地 を 壁の根本候補 の 1 から 壁の根本候補 の長さ までの乱数 番目 にする
生成中の壁に接続しないように壁を伸ばす

⑤「生成中の壁を生成後の壁にする」ブロックの中身

定義 生成中の壁から根本候補を取得
i を 1 にする
★迷路リスト の長さ 回繰り返す
  もし i を 2で 割った余り なら
    もし ★迷路リスト の i 番目 = 2 なら
      i を壁の根本候補 に追加する
  i を 1 ずつ変える


いいなと思ったら応援しよう!