diff --git a/__pycache__/markers.cpython-312.pyc b/__pycache__/markers.cpython-312.pyc new file mode 100644 index 0000000..d9dde5b Binary files /dev/null and b/__pycache__/markers.cpython-312.pyc differ diff --git a/__pycache__/player.cpython-312.pyc b/__pycache__/player.cpython-312.pyc index c3ad255..927c78f 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 d667fe8..28d2e07 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 c8e850b..fbf42b4 100644 --- a/escape_the_maze.py +++ b/escape_the_maze.py @@ -3,21 +3,19 @@ import random from retro.game import Game from player import Player from wall import Wall +from markers import StartMarker, FinishMarker 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 + grid[y][x] = 0 visited = set() @@ -47,7 +45,7 @@ def create_maze_walls(board_size): center_x = (width // 2) | 1 center_y = (height // 2) | 1 - grid[center_y][center_x] = 0 + grid[center_y][center_x] = 0 end_position = (center_x, center_y) wall_positions = [] @@ -63,26 +61,35 @@ def create_maze_walls(board_size): 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) + start_position = (1, 1) + + player = Player(board_size, end_position) + + start_marker = StartMarker(start_position) + finish_marker = FinishMarker(end_position) + state = { "win": False, + "message": "", } game = Game( - agents=[player] + walls, + agents=[ + start_marker, + finish_marker, + player, + ] + walls, state=state, board_size=board_size, - debug=True, + debug=False, framerate=24, color="white_on_black", ) game.play() - if __name__ == "__main__": main() \ No newline at end of file diff --git a/markers.py b/markers.py new file mode 100644 index 0000000..4f52ed3 --- /dev/null +++ b/markers.py @@ -0,0 +1,24 @@ +class StartMarker: + """ + Labels the start of the maze with 's'. + """ + character = "S" + color= "red_on_white" + blocks_movement = False + + def __init__(self, position): + # position is a tuple (x, y) + self.position = position + + +class FinishMarker: + """ + Labels the finish of the maze with 'f'. + """ + character = "F" + color = "red_on_black" + blocks_movement = False + + def __init__(self, position): + # position is a tuple (x, y) + self.position = position \ No newline at end of file diff --git a/player.py b/player.py index 3ef3627..2122aea 100644 --- a/player.py +++ b/player.py @@ -1,21 +1,36 @@ + class Player: """ Player agent for Escape the Maze. Moves one step at a time using the arrow keys. + Ends the game when it reaches the goal position. """ name = "player" - character = ">" # 🐧Penguin icon + character = ">" - def __init__(self, board_size): + def __init__(self, board_size, goal_position): # Start near the top-left corner width, height = board_size self.position = (1, 1) + self.goal_position = goal_position + + def can_move_to(self, position, game): + """ + Returns True if there is no blocking agent (e.g., Wall) on this tile. + Non-blocking agents (like start/finish markers) are ignored. + """ + for agent in game.agents: + agent_pos = getattr(agent, "position", None) + if agent_pos == position: + if getattr(agent, "blocks_movement", False): + return False + return True def handle_keystroke(self, keystroke, game): """ - Called once for each key pressed since the last turn. - Moves the player using the arrow keys. + Called for each key pressed since the last turn. + Moves the player using the arrow keys and checks for win. """ x, y = self.position new_position = None @@ -29,10 +44,13 @@ class Player: elif keystroke.name == "KEY_RIGHT": new_position = (x + 1, y) - if new_position is None: return + if game.on_board(new_position) and self.can_move_to(new_position, game): + self.position = new_position - if game.on_board(new_position) and game.is_empty(new_position): - self.position = new_position \ No newline at end of file + if self.position == self.goal_position: + game.state["win"] = True + game.state["message"] = "Congratulations! You've escaped the maze!" + game.end() \ No newline at end of file diff --git a/wall.py b/wall.py index d9c2b5e..cb98365 100644 --- a/wall.py +++ b/wall.py @@ -3,6 +3,7 @@ class Wall: A simple wall tile. It just sits on the board and blocks movement. """ character = "█" + blocks_movement = True def __init__(self, position): # position is a tuple (x, y) self.position = position \ No newline at end of file