|
|
@ -10,9 +10,18 @@ class Map: |
|
|
|
self.width = width |
|
|
|
self.width = width |
|
|
|
self.height = height |
|
|
|
self.height = height |
|
|
|
grid = self.make_grid() |
|
|
|
grid = self.make_grid() |
|
|
|
|
|
|
|
dead_ends = self.hunt_and_kill(grid) |
|
|
|
|
|
|
|
grid = self.sample_rooms(grid, dead_ends, 4, int(len(dead_ends) * 0.6)) |
|
|
|
self.hunt_and_kill(grid) |
|
|
|
self.hunt_and_kill(grid) |
|
|
|
self.render_map(grid) |
|
|
|
self.render_map(grid) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def sample_rooms(self, grid, dead_ends, size, count): |
|
|
|
|
|
|
|
grid = self.make_grid() |
|
|
|
|
|
|
|
for x, y in random.sample(dead_ends, count): |
|
|
|
|
|
|
|
if x < self.width - size and y < self.height - size: |
|
|
|
|
|
|
|
self.make_room(grid, x, y, size) |
|
|
|
|
|
|
|
return grid |
|
|
|
|
|
|
|
|
|
|
|
def make_grid(self): |
|
|
|
def make_grid(self): |
|
|
|
grid = [] |
|
|
|
grid = [] |
|
|
|
for y in range(0, self.height): |
|
|
|
for y in range(0, self.height): |
|
|
@ -20,6 +29,11 @@ class Map: |
|
|
|
|
|
|
|
|
|
|
|
return grid |
|
|
|
return grid |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def make_room(self, grid, x, y, size): |
|
|
|
|
|
|
|
for row in range(y, y+size): |
|
|
|
|
|
|
|
for col in range(x, x+size): |
|
|
|
|
|
|
|
grid[row][col] = SPACE |
|
|
|
|
|
|
|
|
|
|
|
def find_coord(self, grid): |
|
|
|
def find_coord(self, grid): |
|
|
|
for y in range(1, self.height, 2): |
|
|
|
for y in range(1, self.height, 2): |
|
|
|
for x in range(1, self.width, 2): |
|
|
|
for x in range(1, self.width, 2): |
|
|
@ -69,10 +83,12 @@ class Map: |
|
|
|
def hunt_and_kill(self, grid): |
|
|
|
def hunt_and_kill(self, grid): |
|
|
|
on_x = 1 |
|
|
|
on_x = 1 |
|
|
|
on_y = 1 |
|
|
|
on_y = 1 |
|
|
|
|
|
|
|
dead_ends = [] |
|
|
|
|
|
|
|
|
|
|
|
while True: |
|
|
|
while True: |
|
|
|
n = self.neighbors(grid, on_x, on_y) |
|
|
|
n = self.neighbors(grid, on_x, on_y) |
|
|
|
if len(n) == 0: |
|
|
|
if len(n) == 0: |
|
|
|
|
|
|
|
dead_ends.append([on_x, on_y]) |
|
|
|
t = self.find_coord(grid) |
|
|
|
t = self.find_coord(grid) |
|
|
|
if t == None: break |
|
|
|
if t == None: break |
|
|
|
on_x, on_y = t[0] |
|
|
|
on_x, on_y = t[0] |
|
|
@ -90,6 +106,7 @@ class Map: |
|
|
|
on_x, on_y = nb_x, nb_y |
|
|
|
on_x, on_y = nb_x, nb_y |
|
|
|
|
|
|
|
|
|
|
|
assert self.complete(grid), "Maze is not complete." |
|
|
|
assert self.complete(grid), "Maze is not complete." |
|
|
|
|
|
|
|
return dead_ends |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def render_map(self, grid): |
|
|
|
def render_map(self, grid): |
|
|
|