Source code for chipiron.players.game_player

"""
Module for the GamePlayer class.
"""

import copy
import queue

import chess

from chipiron.players.move_selector.move_selector import MoveRecommendation
from chipiron.utils import seed
from chipiron.utils.communication.player_game_messages import MoveMessage
from chipiron.utils.dataclass import IsDataclass
from chipiron.utils.logger import chipiron_logger

from ..environments.chess_env.board.utils import FenPlusHistory
from .player import Player


[docs]class GamePlayer: """A class that wraps a player for a game purposes it adds the color information and probably stuff to continue the computation when the opponent is computing """ _player: Player color: chess.Color def __init__(self, player: Player, color: chess.Color) -> None: self.color = color self._player = player @property def player(self) -> Player: """Return the player object. Returns: Player: The player object. """ return self._player
[docs] def select_move( self, fen_plus_history: FenPlusHistory, seed_int: seed | None = None ) -> MoveRecommendation: """Selects the best move to play based on the current board position. Args: seed_int (seed | None, optional): The seed value for randomization. Defaults to None. Raises: Exception: If there are no legal moves in the current position. Returns: MoveRecommendation: The recommended move to play. """ assert seed_int is not None assert self.color == fen_plus_history.current_turn() best_move: MoveRecommendation = self._player.select_move( fen_plus_history=fen_plus_history, seed_int=seed_int ) return best_move
[docs]def game_player_computes_move_on_board_and_send_move_in_queue( fen_plus_history: FenPlusHistory, game_player: GamePlayer, queue_move: queue.Queue[IsDataclass], seed_int: seed, ) -> None: """Computes the move for the game player on the given board and sends the move in the queue. Args: game_player (GamePlayer): The game player. queue_move (queue.Queue[IsDataclass]): The queue to send the move. seed_int (seed): The seed for move selection. Returns: None """ if fen_plus_history.current_turn() == game_player.color: move_recommendation: MoveRecommendation = game_player.select_move( fen_plus_history=fen_plus_history, seed_int=seed_int ) message: MoveMessage = MoveMessage( move=move_recommendation.move, corresponding_board=fen_plus_history.current_fen, player_name=game_player.player.id, evaluation=move_recommendation.evaluation, color_to_play=game_player.color, ) chipiron_logger.info("Sending %s", message) deep_copy_message = copy.deepcopy(message) queue_move.put(deep_copy_message) else: chipiron_logger.warning( "Game player rejects move query %s", fen_plus_history.current_fen, )