diff --git a/__pycache__/player.cpython-312.pyc b/__pycache__/player.cpython-312.pyc index f9bf06e..c3ad255 100644 Binary files a/__pycache__/player.cpython-312.pyc and b/__pycache__/player.cpython-312.pyc differ diff --git a/__pycache__/wall.cpython-312.pyc b/__pycache__/wall.cpython-312.pyc index 81bf806..d667fe8 100644 Binary files a/__pycache__/wall.cpython-312.pyc and b/__pycache__/wall.cpython-312.pyc differ diff --git a/escape_the_maze.py b/escape_the_maze.py index 5459d1f..c8e850b 100644 --- a/escape_the_maze.py +++ b/escape_the_maze.py @@ -1,25 +1,88 @@ +import random + from retro.game import Game from player import Player +from wall import Wall + + +def generate_maze_grid(width, height): + """ + Generate a 'perfect' maze on a width x height grid. + 1 = wall, 0 = passage. + + Uses depth-first search on a grid of cells spaced 2 apart, + which gives a nice twisty maze like your example image. + """ + grid = [[1 for _ in range(width)] for _ in range(height)] + + for y in range(1, height - 1, 2): + for x in range(1, width - 1, 2): + grid[y][x] = 0 + + visited = set() + + def dfs(cx, cy): + visited.add((cx, cy)) + + directions = [(2, 0), (-2, 0), (0, 2), (0, -2)] + random.shuffle(directions) + + for dx, dy in directions: + nx, ny = cx + dx, cy + dy + if 1 <= nx < width - 1 and 1 <= ny < height - 1 and (nx, ny) not in visited: + wall_x = cx + dx // 2 + wall_y = cy + dy // 2 + grid[wall_y][wall_x] = 0 + dfs(nx, ny) + + dfs(1, 1) + + return grid + + +def create_maze_walls(board_size): + width, height = board_size + + grid = generate_maze_grid(width, height) + + center_x = (width // 2) | 1 + center_y = (height // 2) | 1 + grid[center_y][center_x] = 0 + end_position = (center_x, center_y) + + wall_positions = [] + for y in range(height): + for x in range(width): + if grid[y][x] == 1: + wall_positions.append((x, y)) + + walls = [Wall(pos) for pos in wall_positions] + return walls, end_position + def main(): board_size = (100, 40) player = Player(board_size) + walls, end_position = create_maze_walls(board_size) + print("Exit (goal) will be around:", end_position) + state = { - "win": False, + "win": False, } game = Game( - agents=[player], + agents=[player] + walls, state=state, board_size=board_size, - debug=False, + debug=True, framerate=24, color="white_on_black", ) game.play() + if __name__ == "__main__": main() \ No newline at end of file diff --git a/player.py b/player.py index e6f5232..3ef3627 100644 --- a/player.py +++ b/player.py @@ -5,7 +5,7 @@ class Player: """ name = "player" - character = "🐧" # Penguin icon + character = ">" # 🐧Penguin icon def __init__(self, board_size): # Start near the top-left corner diff --git a/wall.py b/wall.py new file mode 100644 index 0000000..d9c2b5e --- /dev/null +++ b/wall.py @@ -0,0 +1,8 @@ +class Wall: + """ + A simple wall tile. It just sits on the board and blocks movement. + """ + character = "█" + def __init__(self, position): + # position is a tuple (x, y) + self.position = position \ No newline at end of file