今回は迷路の自販機を
再現するコードの実装です。

解説動画はこちら




迷路の自販機

先日、テレビで迷路の自販機なるものを
特集していました。


こんな感じのものですね

お金を入れるとその分の長さの
迷路が生成されて
プリントされるというものです。

高いほど長くなる仕組みの様です。

迷路を自動生成する事ができれば
これを再現する事ができるんじゃ
ないかなと思います。

早速コードを見てみましょう。


迷路作成コード

迷路を作成する部分と
画像を生成する部分です。
import random
import sys
from PIL import Image
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
sys.setrecursionlimit(10**6)

# 迷路を作成する
def make_maze(size):

    def make(ny, nx,tmp_maze):
        ar = list(range(4)) 
        random.shuffle(ar)
        for i in ar:
            if ny+dy[i][1]<1 or ny+dy[i][1]>=size[0]:
                continue
            if nx+dx[i][1]<1 or nx+dx[i][1]>=size[1]:
                continue
            if tmp_maze[ny+dy[i][1]][nx+dx[i][1]]==0:
                continue
            for j in range(2):
                tmp_maze[ny+dy[i][j]][nx+dx[i][j]]=0
            make(ny+dy[i][1], nx+dx[i][1],tmp_maze)
    
    tmp_maze = [[1]*size[1] for _ in range(size[0])]
    dx,dy = [(1,2), (-1,-2), (0,0), (0,0)],[(0,0), (0,0), (1,2), (-1,-2)]
    make(1, 1,tmp_maze)
    tmp_maze[1][1],tmp_maze[size[0]-2][size[1]-2] = 2,3
    return tmp_maze

# 画像を作成する
def create_image_from_maze(maze, file_path,pixel_size=20):
    # 色のマッピング
    colors = {
        0: (255, 255, 255),  # 白
        1: (0, 0, 0),        # 黒
        2: (0, 0, 255),      # 青
        3: (0, 255, 0)       # 緑
    }
    width = len(maze[0]) * pixel_size
    height = len(maze) * pixel_size
    image = Image.new("RGB", (width, height), "white")
    pixels = image.load()
    for y in range(len(maze)):
        for x in range(len(maze[0])):
            color = colors.get(maze[y][x], (255, 255, 255))
            for dy in range(pixel_size):
                for dx in range(pixel_size):
                    pixels[x * pixel_size + dx, y * pixel_size + dy] = color
    image.save(file_path)
    return image

実行する際はコレ
# 迷路を作成する
size = (31, 101) # height , width
maze = make_maze(size)

# 画像を生成
image = create_image_from_maze(maze,"image.png")
plt.figure(figsize=(16,10))
plt.imshow(image, cmap='gray')
plt.axis('off')
plt.show()
download

こんな感じで迷路が出来上がります。

黒が壁で、白が通路
青がスタート、緑がゴールです。

いい感じで横長の迷路が
出来ているんじゃないでしょうか

縦は31ピクセル固定として
横は100円分で
31ピクセルとかにすれば
いい感じに再現出来るんじゃないかと。

もっと大きな迷路も
作成は出来ると思うので
サイズ変更して試してみて下さい。

Google Colabなどで
実行できると思います。


今回は迷路の自販機を再現する
迷路作成のコードについてでした。

それでは。