
Pythonで棒倒し法による迷路作成プログラム
棒倒し法を使用して迷路を作成するプログラムをPythonで実装します。この手法では、壁で埋めたグリッドにランダムな通路を追加して迷路を生成します。
1. 棒倒し法の概要
棒倒し法のステップは次のとおりです。
壁で埋められたグリッドを用意します。
任意の位置からランダムな方向に「棒」を倒すことで通路を作成します。
特徴
ランダムに選択した方向に1マス分壁を壊すため、迷路に規則性が少なくなります。
2. 環境構築
Pythonの環境構築は、こちらを確認してください。
3. プログラム実装
maze.pyという名前で以下のコードを保存してください。
import random
class Maze:
def __init__(self, width, height):
self.width = width
self.height = height
self.grid = [['#' for _ in range(width)] for _ in range(height)]
def generate(self):
for y in range(1, self.height, 2):
for x in range(1, self.width, 2):
self.grid[y][x] = ' '
self.knock_down_wall(x, y)
# スタート地点とゴール地点を設定
self.grid[1][1] = '☆' # スタート地点
self.grid[self.height - 2][self.width - 2] = '☆' # ゴール地点
def knock_down_wall(self, x, y):
directions = []
if x > 1: directions.append((-1, 0)) # 左
if x < self.width - 2: directions.append((1, 0)) # 右
if y > 1: directions.append((0, -1)) # 上
if y < self.height - 2: directions.append((0, 1)) # 下
if directions:
dx, dy = random.choice(directions)
self.grid[y + dy][x + dx] = ' '
def print_maze(self):
for row in self.grid:
print(''.join(row))
if __name__ == "__main__":
maze = Maze(21, 21) # 幅と高さは奇数
maze.generate()
maze.print_maze()
4. 実行
以下のコマンドを使用してプログラムを実行します。
python maze.py
コンソールに生成された迷路が出力されます。
実行するたびに新しい迷路が生まれます。
#####################
#☆ # # # #
# # # ####### # # ###
# # # # # # #
# # ### # ### ### ###
# # # # # # # # #
# # # # ####### # # #
# # # # # # # #
### ##### ######### #
# # # # # # # #
# ##### ######### ###
# # # # # #
##### # ##### ### # #
# # # # # #
####### ##### ##### #
# # # # # # #
# # ####### ##### # #
# # # # # #
# # ### ### # #######
# # # # ☆#
#####################
まとめ
Pythonの実装を通じて、棒倒し法のシンプルなアルゴリズムを紹介しました。コードの応用や改良を試してみてください。