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/")
|