from time import sleep from game.handlers.gameHandler import GameHandler from game.game import Game from game.gameState import GameState from game.mapReader import MapReader from game.mapSet import MapSet class UserPlayerGameHandler(GameHandler): KEYBOARD_INPUTS = ["w", "q", "a", "z", "e", "d", "c"] def __init__(self): super().__init__() self.mapReader = MapReader() self.mapSet = MapSet(self.mapReader, self.mapReader.get_map_names()) self.map = self._choose_map() self.gameState = GameState() self.game = Game(self.map, self.gameState) self.game.set_waiting_for_input_callback(self.on_input_request) self.game.set_position_update_callback(self.on_position_update) def _choose_map(self): """ Prompt the user to choose a map from the available maps """ print("\nAvailable maps:") for i, map_name in enumerate(self.mapReader.get_map_names()): print(f"{i + 1}. {map_name.replace("_", " ").title()}") while True: try: choice = int(input("Choose a map by number: ")) - 1 if 0 <= choice < len(self.mapReader.get_map_names()): return self.mapSet.get_map(choice) else: print("Invalid choice. Please try again.") except ValueError: print("Invalid input. Please enter a number.") def run(self) -> None: """ Run the game loop """ self.game.start_game() print("Game over : You " + ("Won!" if self.game.gameState.gameWon else "Lost!")) def on_position_update(self) -> None: """ Refresh the screen """ print("\n\033[2J") # Add margin for stupid vscode terminal game_string = self.game.to_string() for i, line in enumerate(game_string.splitlines()): if i == 0: line += "\tCoins: " + str(self.game.gameState.coins) elif i == 1: line += "\tMoves: " + str(self.game.gameState.movesCount) print(line) sleep(0.1) def on_input_request(self) -> str: """ Listen for keyboard input, and map it to a gameState PLAYER_MOVEMENTS """ user_input = input(f"Enter a movement ({', '.join(self.KEYBOARD_INPUTS)}): ") if user_input not in self.KEYBOARD_INPUTS: print(f"Invalid input: {user_input}. Please enter one of {', '.join(self.KEYBOARD_INPUTS)}.") return self.on_input_request() return self.game.gameState.PLAYER_MOVEMENTS[self.KEYBOARD_INPUTS.index(user_input)]