70 lines
2.6 KiB
Python
70 lines
2.6 KiB
Python
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)] |