

import os
import random

os.makedirs("mazes", exist_ok=True)


def save_maze(filename: str, lines: list[str]) -> None:
    path = os.path.join("mazes", filename)
    with open(path, "w", encoding="utf-8") as f:
        f.write("\n".join(lines))
    print(f"Создан: {path}")


small = [
    "##########",
    "#S       #",
    "# ###### #",
    "# #    # #",
    "# # ## # #",
    "# # ## # #",
    "# #    # #",
    "# ###### #",
    "#       E#",
    "##########",
]
save_maze("small_10x10.txt", small)


def gen_medium():
    W, H = 20, 20
    grid = [["#"] * W for _ in range(H)]

    def carve(x, y):
        dirs = [(2, 0), (-2, 0), (0, 2), (0, -2)]
        random.shuffle(dirs)
        for dx, dy in dirs:
            nx, ny = x + dx, y + dy
            if 1 <= nx < W - 1 and 1 <= ny < H - 1 and grid[ny][nx] == "#":
                grid[y + dy // 2][x + dx // 2] = " "
                grid[ny][nx] = " "
                carve(nx, ny)

    grid[1][1] = " "
    carve(1, 1)
    grid[1][1] = "S"
    # Убедимся что выход соединён с лабиринтом
    grid[H - 2][W - 2] = " "
    # Прорубаем проход к выходу если нужно
    if grid[H - 3][W - 2] == "#" and grid[H - 2][W - 3] == "#":
        grid[H - 3][W - 2] = " "
    grid[H - 2][W - 2] = "E"
    return ["".join(row) for row in grid]

random.seed(42)
save_maze("medium_20x20.txt", gen_medium())


def gen_large(w=50, h=50, seed=7):
    random.seed(seed)
    grid = [["#"] * w for _ in range(h)]

    def carve(x, y):
        dirs = [(2, 0), (-2, 0), (0, 2), (0, -2)]
        random.shuffle(dirs)
        for dx, dy in dirs:
            nx, ny = x + dx, y + dy
            if 1 <= nx < w - 1 and 1 <= ny < h - 1 and grid[ny][nx] == "#":
                grid[y + dy // 2][x + dx // 2] = " "
                grid[ny][nx] = " "
                carve(nx, ny)

    import sys
    sys.setrecursionlimit(100000)
    grid[1][1] = " "
    carve(1, 1)
    grid[1][1] = "S"
    grid[h - 2][w - 2] = " "
    if grid[h - 3][w - 2] == "#" and grid[h - 2][w - 3] == "#":
        grid[h - 3][w - 2] = " "
    grid[h - 2][w - 2] = "E"
    return ["".join(row) for row in grid]

save_maze("large_50x50.txt", gen_large())


def gen_open(w=20, h=20):
    lines = []
    for y in range(h):
        row = ""
        for x in range(w):
            if y == 0 or y == h - 1 or x == 0 or x == w - 1:
                row += "#"
            elif x == 1 and y == 1:
                row += "S"
            elif x == w - 2 and y == h - 2:
                row += "E"
            else:
                row += " "
        lines.append(row)
    return lines

save_maze("open_20x20.txt", gen_open())

no_exit = [
    "##########",
    "#S       #",
    "# ########",
    "#        #",
    "##########",
]
save_maze("no_exit.txt", no_exit)

print("\nВсе лабиринты созданы в папке mazes/")
