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 #!/usr/bin/env python
import argparse
from ai import train from ai import train
from loguru import logger from loguru import logger
from path import BASE_PATH
from py2048 import Menu 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 @logger.catch
def main() -> None: def main(args: argparse.ArgumentParser) -> None:
# Menu().run() if args.debug:
train(100) 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__": 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() max_val = app.game.board.max_val()
time_passed = time.perf_counter() - start_time time_passed = time.perf_counter() - start_time
score = app.game.board.score
if ( if (
app.game.board.is_game_over() app.game.board.is_game_over()
or (app.game.board._is_full() and time_passed >= 0.1) or (app.game.board._is_full() and time_passed >= 0.1)
or max_val >= 2048 or max_val >= 2048
): ):
calculate_fitness(genome, max_val) 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() app.game.restart()
break break

View File

@ -3,7 +3,7 @@ from loguru import logger
from py2048 import Config from py2048 import Config
from py2048.objects import Board, Button, ScoreLabel 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: class Game:

View File

@ -6,14 +6,13 @@ from loguru import logger
from py2048 import Config from py2048 import Config
from py2048.objects import Button from py2048.objects import Button
from py2048.utils import Position, setup_logger from py2048.utils import Position
from .game import Game from .game import Game
class Menu: class Menu:
def __init__(self): def __init__(self):
setup_logger()
pygame.init() pygame.init()
pygame.display.set_caption("2048") pygame.display.set_caption("2048")
self._surface: pygame.Surface = pygame.display.set_mode(Config.SCREEN.size) 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 path import BASE_PATH
from .collections import Board, Font, Header, Position, Screen, Size, Tile from .collections import Board, Font, Header, Position, Screen, Size, Tile
from .color import ColorScheme from .color import ColorScheme
from .enums import Direction 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__ = [ __all__ = [
"Board", "Board",
"ColorScheme", "ColorScheme",
@ -24,7 +12,6 @@ __all__ = [
"Position", "Position",
"Size", "Size",
"Tile", "Tile",
"setup_logger",
"Header", "Header",
"Screen", "Screen",
] ]