From 9eafca215db626830529f1a25670b620b67c42a9 Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Wed, 3 Jan 2024 04:43:52 +0200 Subject: [PATCH] feat: add argument parser --- main.py | 65 +++++++++++++++++++++++++++++++++--- src/ai/evaluation.py | 3 +- src/py2048/screens/game.py | 2 +- src/py2048/screens/menu.py | 3 +- src/py2048/utils/__init__.py | 13 -------- 5 files changed, 65 insertions(+), 21 deletions(-) diff --git a/main.py b/main.py index eacc5eb..0fe8836 100755 --- a/main.py +++ b/main.py @@ -1,16 +1,73 @@ #!/usr/bin/env python +import argparse from ai import train from loguru import logger +from path import BASE_PATH from py2048 import Menu +def pos_int(string: str) -> int: + try: + value = int(string) + except ValueError: + raise argparse.ArgumentTypeError(f"Expected integer, got {string!r}") + if value < 0: + raise argparse.ArgumentTypeError(f"Expected non negative number, got {value}") + return value + + +parser = argparse.ArgumentParser(description="2048 game with AI") +group = parser.add_mutually_exclusive_group() +group.add_argument( + "-d", + "--debug", + action="store_true", + help="Debug", +) +group.add_argument( + "-v", + "--verbose", + action="store_true", + help="Verbose", +) +group.add_argument( + "-t", + "--train", + type=pos_int, + nargs="?", + const=100, + metavar="int", + help="Trains the AI", +) + + +def setup_logger(debug_level: str) -> None: + logger.add( + BASE_PATH / ".logs" / "game.log", + format="{time} | {level} | {message}", + level=debug_level.upper(), + rotation="10 MB", + compression="zip", + ) + + @logger.catch -def main() -> None: - # Menu().run() - train(100) +def main(args: argparse.ArgumentParser) -> None: + if args.debug: + setup_logger("debug") + elif args.verbose: + setup_logger("debug") + else: + setup_logger("warning") + + if args.train is not None: + train(args.train) + else: + Menu().run() if __name__ == "__main__": - main() + args = parser.parse_args() + main(args) diff --git a/src/ai/evaluation.py b/src/ai/evaluation.py index 3058ec5..7aa64a1 100644 --- a/src/ai/evaluation.py +++ b/src/ai/evaluation.py @@ -38,13 +38,14 @@ def eval_genomes(genomes, config: neat.Config): max_val = app.game.board.max_val() time_passed = time.perf_counter() - start_time + score = app.game.board.score if ( app.game.board.is_game_over() or (app.game.board._is_full() and time_passed >= 0.1) or max_val >= 2048 ): calculate_fitness(genome, max_val) - logger.info(f"{max_val=}\tscore={app.game.board.score}") + logger.info(f"{max_val=}\t{score=:_}\t{genome_id=}") app.game.restart() break diff --git a/src/py2048/screens/game.py b/src/py2048/screens/game.py index 857923c..f721c73 100644 --- a/src/py2048/screens/game.py +++ b/src/py2048/screens/game.py @@ -3,7 +3,7 @@ from loguru import logger from py2048 import Config from py2048.objects import Board, Button, ScoreLabel -from py2048.utils import Direction, Position, Size, setup_logger +from py2048.utils import Direction, Position, Size class Game: diff --git a/src/py2048/screens/menu.py b/src/py2048/screens/menu.py index 2e5d224..7cc1348 100644 --- a/src/py2048/screens/menu.py +++ b/src/py2048/screens/menu.py @@ -6,14 +6,13 @@ from loguru import logger from py2048 import Config from py2048.objects import Button -from py2048.utils import Position, setup_logger +from py2048.utils import Position from .game import Game class Menu: def __init__(self): - setup_logger() pygame.init() pygame.display.set_caption("2048") self._surface: pygame.Surface = pygame.display.set_mode(Config.SCREEN.size) diff --git a/src/py2048/utils/__init__.py b/src/py2048/utils/__init__.py index d3c9469..bab2b62 100644 --- a/src/py2048/utils/__init__.py +++ b/src/py2048/utils/__init__.py @@ -1,21 +1,9 @@ -from loguru import logger from path import BASE_PATH from .collections import Board, Font, Header, Position, Screen, Size, Tile from .color import ColorScheme from .enums import Direction - -def setup_logger() -> None: - logger.add( - BASE_PATH.joinpath(".logs", "game.log"), - format="{time} | {level} | {message}", - level="DEBUG" if BASE_PATH.joinpath("debug").exists() else "INFO", - rotation="10 MB", - compression="zip", - ) - - __all__ = [ "Board", "ColorScheme", @@ -24,7 +12,6 @@ __all__ = [ "Position", "Size", "Tile", - "setup_logger", "Header", "Screen", ]