Source code for j_chess_lib.client.match.Game

from typing import Callable
from uuid import uuid4, UUID

from j_chess_lib.ai import AI
from j_chess_lib.ai.container import GameState
from j_chess_lib.communication import JchessMessage, JchessMessageType
from j_chess_lib.communication.schema import GameStartMessage, GameOverMessage, MoveMessage
from .Match import Match


[docs]class Game: def __init__(self, data: GameStartMessage, recv: Callable[[], JchessMessage], send: Callable[[JchessMessage], None], ai: AI, match: Match): self._id = uuid4() self._recv = recv self._send = send self._data = data self._ai = ai self._match = match self._ai.new_game(game_id=self.id, match_id=match.id, white_player=self._data.name_white) @property def id(self) -> UUID: return self._id
[docs] def play(self) -> GameOverMessage: while True: message = self._recv() if message.message_type == JchessMessageType.AWAIT_MOVE: move_data = self._ai.get_move(game_id=self.id, match_id=self._match.id, game_state=GameState.from_await_move(data=message.await_move)) move_message = self._match.client.base_msg() move_message.message_type = JchessMessageType.MOVE move_message.move = MoveMessage(move=move_data) self._send(move_message) elif message.message_type == JchessMessageType.GAME_OVER: winner = None if message.game_over.is_draw else message.game_over.winner self._ai.finalize_game(game_id=self.id, match_id=self._match.id, winner=winner, pgn=message.game_over.pgn) return message.game_over else: raise Exception(f"Unexpected message of {message.message_type}: {message}")