import random
class levelgen:
def __init__(self, size: int):
self.r_coord = random.randint(1, size)
self.c_coord = random.randint(1, size)
self.maze_size = size + 2
self.size = size * 2
self.dir = ""
self.dir_dic = {"u": "d", "d": "u", "r": "l", "l": "r"}
self.node_stack = []
self.DIRS = ["l", "r", "d", "u"]
self.maze = [[" " for x in range(self.maze_size)] for y in range(self.maze_size)]
self.rooms_made = 0
self.add_borders()
print("start row",self.r_coord)
print("start column",self.c_coord)
print(self.node_stack)
while not self.is_filled():
self.generate_room()
print("T")
for row in self.maze:
print(row)
def generate_room(self):
self.available_dirs = ["l", "r", "d", "u"]
print("constant",["l", "r", "d", "u"])
self.check_dirs()
print("checked dirs")
self.dir = random.choice(self.available_dirs)
self.maze[self.r_coord][self.c_coord] = self.dir
self.move(self.dir)
print(f"rooms made : {self.rooms_made}")
for row in self.maze:
print(row)
def check_dirs(self):
#print("available:", self.available_dirs)
if self.maze[self.r_coord - 1][self.c_coord] != " " and "u" in self.available_dirs:
self.available_dirs.remove("u")
if len(self.available_dirs) <= 0:
self.backtrack()
if self.maze[self.r_coord + 1][self.c_coord] != " " and "d" in self.available_dirs:
self.available_dirs.remove("d")
if len(self.available_dirs) <= 0:
self.backtrack()
if self.maze[self.r_coord][self.c_coord + 1] != " " and "r" in self.available_dirs:
self.available_dirs.remove("r")
if len(self.available_dirs) <= 0:
self.backtrack()
if self.maze[self.r_coord][self.c_coord - 1] != " " and "l" in self.available_dirs:
self.available_dirs.remove("l")
if len(self.available_dirs) <= 0:
self.backtrack()
print("available:", self.available_dirs)
self.dir = random.choice(self.available_dirs)
def move(self, direction):
if direction == "r":
self.c_coord += 1
elif direction == "l":
self.c_coord -= 1
elif direction == "u":
self.r_coord -= 1
elif direction == "d":
self.r_coord += 1
def add_borders(self):
for j in range(1, self.maze_size):
self.maze[j - 1][0] = "x"
for j in range(1, self.maze_size):
self.maze[j - 1][-1] = "x"
for j in range(1, self.maze_size):
self.maze[0][j - 1] = "x"
for j in range(1, self.maze_size):
self.maze[-1][j - 1] = "x"
self.maze[-1][self.maze_size - 1] = "x"
def backtrack(self):
if len(self.node_stack) > 0:
self.node_stack.pop(-1)
else:
breakpoint()
print("backtracked")
print("visited:",self.node_stack)
self.r_coord = self.node_stack[-1][0]
self.c_coord = self.node_stack[-1][1]
self.available_dirs = ["l", "r", "d", "u"]
self.check_dirs()
def is_filled(self):
for r in self.maze:
for c in r:
if c == " ":
return False
return True
def check_rooms(self):
self.rooms_made = 0
for r in self.maze:
for c in r:
if c != "x" and c != " ":
self.rooms_made += 1
return self.rooms_made
levelgen(3)