Source code for chipiron.scripts.replay_game.replay_game

"""
This module contains the `ReplayGameScript` class, which is responsible for replaying a chess game.
"""

import os
import sys
from dataclasses import dataclass, field
from enum import Enum
from typing import Any

import dacite
import yaml
from PySide6.QtWidgets import QApplication

from chipiron.displays.gui_replay_games import MainWindow
from chipiron.environments.chess_env.board.board_chi import BoardChi
from chipiron.environments.chess_env.board.factory import create_board_chi
from chipiron.environments.chess_env.board.utils import FenPlusHistory
from chipiron.games.game.final_game_result import GameReport
from chipiron.scripts.script import Script
from chipiron.scripts.script_args import BaseScriptArgs


[docs]@dataclass class ReplayScriptArgs: """ The input arguments needed by the replay game script to run. """ # path to the yaml file with the Game Report stored file_game_report: str = ( "chipiron/scripts/one_match/outputs/Sunday-10-13-2024--22:40:58:049918/games_0_W:Sequool-vs-B:Random_game_report.yaml" ) base_script_args: BaseScriptArgs = field(default_factory=BaseScriptArgs) # whether to display the match in a GUI gui: bool = False
[docs]class ReplayGameScript: """ The `ReplayGameScript` class is responsible for replaying a chess game. """ args_dataclass_name: type[ReplayScriptArgs] = ReplayScriptArgs base_script: Script[ReplayScriptArgs] chess_board: BoardChi base_experiment_output_folder = os.path.join( Script.base_experiment_output_folder, "replay_game/outputs/" ) def __init__( self, base_script: Script[ReplayScriptArgs], ) -> None: """ Initializes the `ReplayGameScript` object. Args: base_script (Script): The base script object. """ self.base_script = base_script # Calling the init of Script that takes care of a lot of stuff, especially parsing the arguments into self.args self.args: ReplayScriptArgs = self.base_script.initiate( experiment_output_folder=self.base_experiment_output_folder, ) with open(self.args.file_game_report, "r") as fileGame: game_report_dict: dict[Any, Any] = yaml.safe_load(fileGame) game_report: GameReport = dacite.from_dict( data_class=GameReport, data=game_report_dict, config=dacite.Config(cast=[Enum]), ) self.chess_board: BoardChi = create_board_chi( fen_with_history=FenPlusHistory( current_fen=game_report.fen_history[0], historical_moves=game_report.move_history, ) )
[docs] def run(self) -> None: """ Runs the replay game script. If `gui` is set to True, it displays the match in a GUI. Otherwise, it runs a console version (TODO). """ if self.args.gui: chess_gui = QApplication(sys.argv) window = MainWindow(self.chess_board) window.show() chess_gui.exec_() else: # TODO: code a console version ...
[docs] def terminate(self) -> None: """ Finishes the script. Performs any necessary cleanup or finalization steps. """ ...