mirror of
https://github.com/kristoferssolo/2048.git
synced 2025-10-21 15:20:35 +00:00
feat: add argument parser
This commit is contained in:
parent
2d218aa449
commit
9eafca215d
65
main.py
65
main.py
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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",
|
||||||
]
|
]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user