From 10a3d9382179ab80f4957c4121a63368b0f50ed4 Mon Sep 17 00:00:00 2001 From: Matthias Guillitte Date: Sat, 10 Oct 2026 15:28:42 +0200 Subject: [PATCH] Added coins --- .env | 2 ++ .env.example | 2 ++ game/blocks/__init__.py | 2 ++ game/blocks/coinBlock.py | 28 ++++++++++++++++++++++++++ game/gameState.py | 12 +++++------ game/handlers/userPlayerGameHandler.py | 16 +++++++++++++-- main.py | 5 +++++ 7 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 .env create mode 100644 .env.example create mode 100644 game/blocks/coinBlock.py diff --git a/.env b/.env new file mode 100644 index 0000000..e807d73 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +# show extra spaces after certains emojis to align them in the terminal +SHOW_EXTRA_EMOJI_SPACES=true \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..e807d73 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +# show extra spaces after certains emojis to align them in the terminal +SHOW_EXTRA_EMOJI_SPACES=true \ No newline at end of file diff --git a/game/blocks/__init__.py b/game/blocks/__init__.py index acac64b..2381260 100644 --- a/game/blocks/__init__.py +++ b/game/blocks/__init__.py @@ -1,9 +1,11 @@ from .stoneBlock import StoneBlock from .spawnPointBlock import SpawnPointBlock from .finishBlock import FinishBlock +from .coinBlock import CoinBlock BLOCKS = [ StoneBlock, SpawnPointBlock, FinishBlock, + CoinBlock ] \ No newline at end of file diff --git a/game/blocks/coinBlock.py b/game/blocks/coinBlock.py new file mode 100644 index 0000000..b6a53f1 --- /dev/null +++ b/game/blocks/coinBlock.py @@ -0,0 +1,28 @@ +import os + +from game.blocks.block import Block +from game.gameState import GameState + +class CoinBlock(Block): + def __init__(self): + self.collected = False + + @property + def character(self): + return '°' + + @property + def type(self): + return 'coin' + + @property + def solid(self): + return False + + def on_collision(self, gameState: GameState): + if not self.collected: + gameState.add_coin() + self.collected = True + + def to_string(self): + return " " if self.collected else "🪙" + (" " if os.getenv("SHOW_EXTRA_EMOJI_SPACES", "false").lower() == "true" else "") \ No newline at end of file diff --git a/game/gameState.py b/game/gameState.py index 60c4091..22b3833 100644 --- a/game/gameState.py +++ b/game/gameState.py @@ -1,7 +1,7 @@ """ Represents the current state of the game. Contains : -- Player score +- Player coins - stopGame flag - Player position """ @@ -10,15 +10,12 @@ class GameState: PLAYER_VELOCITIES = [*PLAYER_MOVEMENTS, "down"] def __init__(self): - self.score = 0 self.playerPosition = (0, 0) self.stopGame = False self.movesCount = 0 self.playerVelocity = -1 # -1 means no velocity self.gameWon = False - - def add_score(self, points): - self.score += points + self.coins = 0 def set_player_position(self, x, y): self.playerPosition = (x, y) @@ -43,4 +40,7 @@ class GameState: self.stopGame = stop def set_game_won(self, won): - self.gameWon = won \ No newline at end of file + self.gameWon = won + + def add_coin(self): + self.coins += 1 \ No newline at end of file diff --git a/game/handlers/userPlayerGameHandler.py b/game/handlers/userPlayerGameHandler.py index 9dd2d34..328d99a 100644 --- a/game/handlers/userPlayerGameHandler.py +++ b/game/handlers/userPlayerGameHandler.py @@ -14,11 +14,23 @@ class UserPlayerGameHandler(GameHandler): """ Refresh the screen """ - print("\033[2J\033[H" + self.game.to_string()) + 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 """ - return self.game.gameState.PLAYER_MOVEMENTS[self.KEYBOARD_INPUTS.index(input(f"Enter a movement ({', '.join(self.KEYBOARD_INPUTS)}): "))] \ No newline at end of file + 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)] \ No newline at end of file diff --git a/main.py b/main.py index abfdd42..c05c609 100644 --- a/main.py +++ b/main.py @@ -1,9 +1,14 @@ +from dotenv import load_dotenv + from game.game import Game from game.gameState import GameState from game.handlers import GAME_HANDLERS from game.map import Map from game.mapReader import MapReader from game.mapSet import MapSet + +# loading variables from .env file +load_dotenv() if __name__ == "__main__": mapReader = MapReader()