Xiangiqgame
AI engine for Xiangqi
Loading...
Searching...
No Matches
player_builder.py
Go to the documentation of this file.
1"""
2Classes for building Player objects.
3"""
4
5from typing import Callable, Any, Dict, Tuple
6
7import numpy as np
8from xiangqi_bindings import (
9 GameBoard,
10 MinimaxMoveEvaluator32,
11 MinimaxMoveEvaluator64,
12 MinimaxMoveEvaluator128,
13 MinimaxMoveEvaluator32Dual,
14 MinimaxMoveEvaluator64Dual,
15 MinimaxMoveEvaluator128Dual,
16 PieceColor,
17 RandomMoveEvaluator,
18)
19
20from xiangqipy.command_input import (
21 PlayerInput,
22 XiangqiGameCommand,
23 PlayerType,
24 EvaluatorType,
25)
26from xiangqipy.players import AIPlayer, HumanPlayer
27
28
30 """
31 Builds a Player object of specific color and GameBoard.
32 """
33
35 self,
36 player_input: PlayerInput,
37 color: PieceColor,
38 game_board: GameBoard,
39 ):
40
41 self.player_input = player_input
42 self._color = color
43 self._game_board = game_board
44
45 @property
46 def _move_evaluator_args(self) -> dict[Callable, Any]:
47 dispatch_table = {
48 RandomMoveEvaluator: {
49 "evaluating_player": self._color,
50 "game_board": self._game_board,
51 },
52 MinimaxMoveEvaluator32: {
53 "evaluating_player": self._color,
54 "search_depth": self.player_input.strength,
55 "game_board": self._game_board,
56 },
57 MinimaxMoveEvaluator64: {
58 "evaluating_player": self._color,
59 "search_depth": self.player_input.strength,
60 "game_board": self._game_board,
61 },
62 MinimaxMoveEvaluator128: {
63 "evaluating_player": self._color,
64 "search_depth": self.player_input.strength,
65 "game_board": self._game_board,
66 },
67 MinimaxMoveEvaluator32Dual: {
68 "evaluating_player": self._color,
69 "search_depth": self.player_input.strength,
70 "game_board": self._game_board,
71 },
72 MinimaxMoveEvaluator64Dual: {
73 "evaluating_player": self._color,
74 "search_depth": self.player_input.strength,
75 "game_board": self._game_board,
76 },
77 MinimaxMoveEvaluator128Dual: {
78 "evaluating_player": self._color,
79 "search_depth": self.player_input.strength,
80 "game_board": self._game_board,
81 },
82 }
83
84 if self.player_input.zkeys_seed is not None:
85 for constructor in [
86 MinimaxMoveEvaluator32,
87 MinimaxMoveEvaluator64,
88 MinimaxMoveEvaluator128,
89 MinimaxMoveEvaluator32Dual,
90 MinimaxMoveEvaluator64Dual,
91 MinimaxMoveEvaluator128Dual,
92 ]:
93 dispatch_table[constructor][
94 "zkeys_seed"
95 ] = self.player_input.zkeys_seed
96 return dispatch_table
97
98 @property
99 def evaluator_constructor_dispatch(self) -> Dict[Tuple, Callable]:
100 return {
101 (EvaluatorType.RANDOM, None, None): RandomMoveEvaluator,
102 (EvaluatorType.MINIMAX, 32, 1): MinimaxMoveEvaluator32,
103 (EvaluatorType.MINIMAX, 64, 1): MinimaxMoveEvaluator64,
104 (EvaluatorType.MINIMAX, 128, 1): MinimaxMoveEvaluator128,
105 (EvaluatorType.MINIMAX, 32, 2): MinimaxMoveEvaluator32Dual,
106 (EvaluatorType.MINIMAX, 64, 2): MinimaxMoveEvaluator64Dual,
107 (EvaluatorType.MINIMAX, 128, 2): MinimaxMoveEvaluator128Dual,
108 }
109
111 return HumanPlayer(
112 color=self._color, player_type=self.player_input.player_type
113 )
114 # return self.player_input.player_type(color=self._color)
115
117 player_constructor = self.evaluator_constructor_dispatch[
118 (
119 self.player_input.algo,
120 self.player_input.key_size,
121 self.player_input.num_zobrist_states,
122 )
123 ]
124
125 constructor_kwargs = self._move_evaluator_args[player_constructor]
126 move_evaluator = player_constructor(**constructor_kwargs)
127
128 return AIPlayer(
129 color=self._color,
130 player_type=self.player_input.player_type,
131 evaluator_type=self.player_input.algo,
132 move_evaluator=move_evaluator,
133 )
134
135 @property
136 def _player_dispatch(self) -> dict[PlayerType, Any]:
137 return {
138 PlayerType.HUMAN: self._build_human_player,
139 PlayerType.AI: self._build_ai_player,
140 }
141
142 def build(self):
143 return self._player_dispatch[self.player_input.player_type]()
144
145
147 """
148 Builds two Player objects for a GameBoard based on XiangqiGameCommand.
149 """
150
152 self, xiangqi_command: XiangqiGameCommand, game_board: GameBoard
153 ):
154 self._command = xiangqi_command
155 self._board = game_board
156
157 def build(self):
158 red_player = SinglePlayerBuilder(
159 color=PieceColor.kRed,
160 player_input=self._command.red_player_input,
161 game_board=self._board,
162 ).build()
163
164 black_player = SinglePlayerBuilder(
165 color=PieceColor.kBlk,
166 player_input=self._command.black_player_input,
167 game_board=self._board,
168 ).build()
169
170 return {PieceColor.kRed: red_player, PieceColor.kBlk: black_player}
Builds two Player objects for a GameBoard based on XiangqiGameCommand.
def __init__(self, XiangqiGameCommand xiangqi_command, GameBoard game_board)
Builds a Player object of specific color and GameBoard.
def __init__(self, PlayerInput player_input, PieceColor color, GameBoard game_board)
dict[Callable, Any] _move_evaluator_args(self)
dict[PlayerType, Any] _player_dispatch(self)
Dict[Tuple, Callable] evaluator_constructor_dispatch(self)
Proposed moves selected using an implementation of core MoveEvaluator.
Definition: players.py:122
Uses terminal UI to propose moves.
Definition: players.py:29
Contains classes for collecting command line input, and converting to a form that will be convenient ...
Definition: command_input.py:1
Implementations of Player, and Exceptions for notifying specific Player types of illegal proposed Mov...
Definition: players.py:1