feat: add argument parser

This commit is contained in:
Kristofers Solo 2024-01-03 04:43:52 +02:00
parent 2d218aa449
commit 9eafca215d
5 changed files with 65 additions and 21 deletions

65
main.py
View File

@ -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)

View File

@ -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

View File

@ -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:

View File

@ -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)

View File

@ -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",
]