116 lines
2.8 KiB
Python
116 lines
2.8 KiB
Python
|
||
|
||
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/")
|