Xiangiqgame
AI engine for Xiangqi
Loading...
Searching...
No Matches
players.py
Go to the documentation of this file.
1"""
2Implementations of Player, and Exceptions for notifying specific Player types
3of illegal proposed Move.
4
5Human Player does not have an associated Exception - just prompt for new entry.
6"""
7
8import numpy as np
10from typing import List, Tuple
11
12from xiangqipy.enums import PlayerType, EvaluatorType
13
14from xiangqipy.game_interfaces import Player
15import xiangqipy.terminal_output as msg
16
17from xiangqi_bindings import (
18 GameBoard,
19 PieceColor,
20 Move,
21 MoveCollection,
22 MinimaxMoveEvaluator64,
23 MinimaxMoveEvaluator128,
24 RandomMoveEvaluator,
25 SearchSummaries,
26)
27
28
30 """
31 Uses terminal UI to propose moves.
32 """
33
34 def __init__(self, color: PieceColor, player_type: PlayerType) -> None:
35 super().__init__(color=color, player_type=player_type)
36 self._input_req = msg.InputRetrievalMessages()
37
39 self, game_board: GameBoard, cur_moves: List[Move]
40 ) -> Move:
41 valid_input = None
42
43 while not valid_input:
44 user_input = input(self._input_req.input_prompt)
45 parsed_input = mt.parse_input(user_input)
46 if mt.is_valid_algebraic_pair(parsed_input):
47 valid_input = parsed_input
48 else:
49 self._input_req.notify_invalid_input()
50
51 proposed_move = mt.convert_parsed_input_to_move(
52 parsed_input=valid_input
53 )
54 return proposed_move
55
57 self, illegal_move: Move, game_board: GameBoard, cur_moves: List[Move]
58 ):
59 self._input_req.notify_illegal_move()
60 # self.propose_move(game_board, cur_moves)
61
62
64 """
65 Proposes moves sequentially from a list of algebraic notation moves.
66 """
67
68 def __init__(self, color: PieceColor, move_list: List[str]):
69 super().__init__(color=color, player_type=PlayerType.SCRIPTED)
70 self._move_list = move_list
71 self._move_index = 0
72
74 self, game_board: GameBoard, cur_moves: List[Move]
75 ) -> Move:
76 # time.sleep(0.2)
77 parsed_input = mt.parse_input(self._move_list[self._move_index])
78 if not mt.is_valid_algebraic_pair(parsed_input):
80 self._move_index += 1
81 move = mt.convert_parsed_input_to_move(parsed_input=parsed_input)
82 return move
83
85 self,
86 illegal_move: Tuple[str],
87 game_board: GameBoard,
88 cur_moves: List[Move],
89 ):
90 raise IllegalMoveInMoveList(illegal_move, game_board.map)
91
92
94 """
95 Has intentionally illegal move in list, followed by legal move (for tests).
96 """
97
98 def __init__(self, color: PieceColor, move_list: List[str]):
99 super().__init__(color=color, player_type=PlayerType.SCRIPTED)
100 self._move_list = move_list
101 self._move_index = 0
102 self._input_req = msg.InputRetrievalMessages()
103
105 self, game_board: GameBoard, cur_moves: List[Move]
106 ) -> Move:
107 # time.sleep(0.2)
108 parsed_input = mt.parse_input(self._move_list[self._move_index])
109 if not mt.is_valid_algebraic_pair(parsed_input):
111 self._move_index += 1
112 move = mt.convert_parsed_input_to_move(parsed_input=parsed_input)
113 return move
114
116 self, illegal_move: Move, game_board: GameBoard, cur_moves: List[Move]
117 ):
118 self._input_req.notify_illegal_move()
119 # self.propose_move(game_board, cur_moves)
120
121
123 """
124 Proposed moves selected using an implementation of core MoveEvaluator.
125 """
126
128 self,
129 color: PieceColor,
130 player_type: PlayerType,
131 evaluator_type: EvaluatorType,
132 move_evaluator: (
133 MinimaxMoveEvaluator64
134 | MinimaxMoveEvaluator128
135 | RandomMoveEvaluator
136 ),
137 ):
138 super().__init__(
139 color=color, player_type=player_type, evaluator_type=evaluator_type
140 )
141 self._move_evaluator = move_evaluator
142
143 @property
144 def move_selection_summary(self) -> SearchSummaries | None:
145 if type(self._move_evaluator).__name__ in [
146 "MinimaxMoveEvaluator64",
147 "MinimaxMoveEvaluator128",
148 ]:
149 return self._move_evaluator.search_summaries
150
152 self, game_board: GameBoard, cur_moves: MoveCollection
153 ) -> Move:
154 proposed_move = self._move_evaluator.select_move(
155 allowed_moves=cur_moves
156 )
157 return proposed_move
158
160 self, illegal_move: Move, game_board: GameBoard, cur_moves: List[Move]
161 ):
162 raise IllegalAIMove(illegal_move)
163
164
166 """
167 Raised when scripted player proposed move has invalid syntax.
168 """
169
171 self,
172 algebraic_move_input: str,
173 message="Invalid value for proposed move ",
174 ):
175 self._algebraic_move_input = algebraic_move_input
176 self._msg = message
177
178 def __str__(self):
179 return f"{self._algebraic_move_input} -> {self._msg}"
180
181
183 """
184 Raised when scripted player proposes an illegal move.
185 """
186
188 self,
189 board_map: np.array,
190 move: Tuple[str],
191 message="Illegal move in list provided by scripted player",
192 ):
193 self._move = move
194 self._msg = message
195 self._board_map = board_map
196
197 def __str__(self):
198 return f"{self._move} -> {self._msg}\n{self._board_map}"
199
200
202 """
203 Raised when AI player proposed illegal move.
204 """
205
207 self, move: Move, message="AI player proposed an illegal move"
208 ):
209 self._move = move
210 self._msg = message
211
212 def __str__(self):
213 return f"From: {self._move.start.rank}, {self._move.end.file}; To: {self._move.end.rank}, {self._move.end.file}"
Can take a turn in a Game.
Proposed moves selected using an implementation of core MoveEvaluator.
Definition: players.py:122
def illegal_move_notice_response(self, Move illegal_move, GameBoard game_board, List[Move] cur_moves)
Definition: players.py:161
def __init__(self, PieceColor color, PlayerType player_type, EvaluatorType evaluator_type,(MinimaxMoveEvaluator64|MinimaxMoveEvaluator128|RandomMoveEvaluator) move_evaluator)
Definition: players.py:137
SearchSummaries|None move_selection_summary(self)
Definition: players.py:144
Move propose_move(self, GameBoard game_board, MoveCollection cur_moves)
Definition: players.py:153
Uses terminal UI to propose moves.
Definition: players.py:29
None __init__(self, PieceColor color, PlayerType player_type)
Definition: players.py:34
def illegal_move_notice_response(self, Move illegal_move, GameBoard game_board, List[Move] cur_moves)
Definition: players.py:58
Move propose_move(self, GameBoard game_board, List[Move] cur_moves)
Definition: players.py:40
Raised when AI player proposed illegal move.
Definition: players.py:201
def __init__(self, Move move, message="AI player proposed an illegal move")
Definition: players.py:208
Raised when scripted player proposes an illegal move.
Definition: players.py:182
def __init__(self, np.array board_map, Tuple[str] move, message="Illegal move in list provided by scripted player")
Definition: players.py:192
Raised when scripted player proposed move has invalid syntax.
Definition: players.py:165
def __init__(self, str algebraic_move_input, message="Invalid value for proposed move ")
Definition: players.py:174
Has intentionally illegal move in list, followed by legal move (for tests).
Definition: players.py:93
Move propose_move(self, GameBoard game_board, List[Move] cur_moves)
Definition: players.py:106
def illegal_move_notice_response(self, Move illegal_move, GameBoard game_board, List[Move] cur_moves)
Definition: players.py:117
def __init__(self, PieceColor color, List[str] move_list)
Definition: players.py:98
Proposes moves sequentially from a list of algebraic notation moves.
Definition: players.py:63
def illegal_move_notice_response(self, Tuple[str] illegal_move, GameBoard game_board, List[Move] cur_moves)
Definition: players.py:89
Move propose_move(self, GameBoard game_board, List[Move] cur_moves)
Definition: players.py:75
def __init__(self, PieceColor color, List[str] move_list)
Definition: players.py:68
Enums that are only used on the Python side of the app.
Definition: enums.py:1
Python abstract classes used by a Game.
Contains functions used to convert algebraic board notation into integer indices array notation.
Classes for terminal UI output including board representation and, messages requesting info,...