Add sume utility methods

This commit is contained in:
Yorick Barbanneau 2023-12-21 21:45:19 +01:00
parent d480887a1d
commit 5f69c5ed9f

View file

@ -20,20 +20,20 @@ class PlayerEngine:
self.options = options self.options = options
self.interrupt_search = False self.interrupt_search = False
self.logger.info("Init engine {}, options:{}".format( self.logger.info("Init engine {}, options:{}".format(
self.__class__.__name__, self._get_class_name(),
self.options self.options
)) ))
""" """
get move get move
@param board: Board @param board: Board
""" """
def get_move(self, board): def get_move(self, board):
self.logger.info("engine: {} - player:{}".format( self.logger.info("engine: {} - player:{}".format(
self.__class__.__name__, self._get_class_name(),
self.get_player_name(self.player) self._get_player_name(self.player)
)) ))
""" """
Get possibles player move an apply a Random.shuffle on it (if needed) Get possibles player move an apply a Random.shuffle on it (if needed)
@param none @param none
@ -44,16 +44,31 @@ class PlayerEngine:
if self.options['randomize_moves'] is True: if self.options['randomize_moves'] is True:
random.shuffle(moves) random.shuffle(moves)
return moves return moves
""" """
Get player name based on his number Get player name based on his number
@param player: int @param player: int
@return: string @return: string
""" """
@staticmethod def _get_player_name(self, player):
def get_player_name(player): return 'White (O)' if self.player == 2 else 'Black (X)'
return 'White (O)' if player == 2 else 'Black (X)'
def _show_stats_info(self, depth, nodes, leafs, heuristic):
self.logger.info(" -> stats: depth:{:.>2} | node:{:.>6} | leafs:{:.>6} | heuristic:{:.>4}".format(
depth,
nodes,
leafs,
heuristic
))
def _show_better_move(self, move, heuristic):
self.logger.debug(" -> Found a better move: {},{} | heuristic:{}".format(
move[1],move[2],
heuristic
))
def _get_class_name(self):
return self.__class__.__name__
""" """
Random game engine Random game engine
@ -93,7 +108,7 @@ class HumanPlayerEngine(PlayerEngine):
move = self.validate_input(user_input, board) move = self.validate_input(user_input, board)
return move return move
""" """
Validate user input an verify than the move is possible Validate user input an verify than the move is possible
@param input: string @param input: string
@ -156,19 +171,12 @@ class MinmaxPlayerEngine(PlayerEngine):
if v > value: if v > value:
value = v value = v
move = m move = m
self.logger.debug("\tfound a better move: {} (heuristic:{})".format( self._show_better_move(move, value)
move,
value
))
nodes += n nodes += n
leafs += l leafs += l
board.pop() board.pop()
self.logger.info("Tree statistics:\n\tnodes:{}\n\tleafs:{}\n\theuristic:{}".format( self._show_stats_info(depth, nodes, leafs, value)
nodes,
leafs,
value
))
return move, value return move, value
""" """
@ -185,7 +193,7 @@ class MinmaxPlayerEngine(PlayerEngine):
if depth == 0 or board.is_game_over() or self.interrupt_search: if depth == 0 or board.is_game_over() or self.interrupt_search:
leafs +=1 leafs +=1
return self.heuristic.get(board, self.player), nodes, leafs return self.heuristic.get(board, self.player), nodes, leafs
if friend_move: if friend_move:
value = -math.inf value = -math.inf
moves = self.get_player_moves(board) moves = self.get_player_moves(board)
@ -242,16 +250,9 @@ class AlphabetaPlayerEngine(PlayerEngine):
if value >= alpha: if value >= alpha:
alpha = value alpha = value
move = m move = m
self.logger.debug("\t-> found a better move: {} | heuristic:{})".format( self._show_stats_info(move, alpha)
move,
alpha
))
self.logger.info("Tree statistics:\n\tnodes:{}\n\tleafs:{}\n\theuristic:{}".format( self._show_stats_info(depth, nodes, leafs, value)
nodes,
leafs,
alpha
))
return move, alpha return move, alpha
""" """
@ -305,7 +306,7 @@ class MinmaxDeepeningPlayerEngine(MinmaxPlayerEngine):
def get_move(self, board): def get_move(self, board):
super().get_move(board) super().get_move(board)
self.interrupt_search = False self.interrupt_search = False
# Get an alarm signal to stop iterations # Get an alarm signal to stop iterations
signal.signal(signal.SIGALRM, self.alarm_handler) signal.signal(signal.SIGALRM, self.alarm_handler)
signal.alarm(self.options['time_limit']) signal.alarm(self.options['time_limit'])
@ -353,7 +354,7 @@ class AlphaBetaDeepeningPlayerEngine(AlphabetaPlayerEngine):
""" """
def get_move(self, board): def get_move(self, board):
self.interrupt_search = False self.interrupt_search = False
# Get an alarm signal to stop iterations # Get an alarm signal to stop iterations
signal.signal(signal.SIGALRM, self.alarm_handler) signal.signal(signal.SIGALRM, self.alarm_handler)
signal.alarm(self.options['time_limit']) signal.alarm(self.options['time_limit'])