Create a function to give moves

It's possible to randomize it now
This commit is contained in:
Yorick Barbanneau 2023-12-20 18:25:55 +01:00
parent 935d3b8f23
commit 6979749d5d

View file

@ -8,6 +8,7 @@ class PlayerEngine:
self.heuristic = heuristic self.heuristic = heuristic
self.options = options self.options = options
self.interrupt_search = False self.interrupt_search = False
self.randomize_moves = False
self.logger.info("Init engine {}, options:{}".format( self.logger.info("Init engine {}, options:{}".format(
self.__class__.__name__, self.__class__.__name__,
self.options self.options
@ -18,6 +19,12 @@ class PlayerEngine:
self.__class__.__name__, self.__class__.__name__,
self.get_player_name(self.player) self.get_player_name(self.player)
)) ))
def get_player_moves(self, board):
if self.randomize_moves is True:
return random.random(board.legal_moves())
else:
return board.legal_moves()
@staticmethod @staticmethod
def get_player_name(player): def get_player_name(player):
@ -68,7 +75,7 @@ class MinmaxPlayerEngine(PlayerEngine):
nodes = 1 nodes = 1
leafs = 0 leafs = 0
move = [] move = []
for m in board.legal_moves(): for m in self.get_player_moves(board):
board.push(m) board.push(m)
v, n, l = self.checkMinMax(board, False, self.options['depth'] - 1) v, n, l = self.checkMinMax(board, False, self.options['depth'] - 1)
if v > value: if v > value:
@ -99,7 +106,7 @@ class MinmaxPlayerEngine(PlayerEngine):
if friend_move: if friend_move:
value = -math.inf value = -math.inf
for m in board.legal_moves(): for m in self.get_player_moves(board):
board.push(m) board.push(m)
v, n, l = self.checkMinMax(board, False, depth - 1) v, n, l = self.checkMinMax(board, False, depth - 1)
if v > value: if v > value:
@ -110,7 +117,7 @@ class MinmaxPlayerEngine(PlayerEngine):
else: else:
value = math.inf value = math.inf
for m in board.legal_moves(): for m in self.get_player_moves(board):
board.push(m) board.push(m)
v, n, l = self.checkMinMax(board, True, depth - 1) v, n, l = self.checkMinMax(board, True, depth - 1)
if v < value: if v < value:
@ -130,8 +137,7 @@ class AlphabetaPlayerEngine(PlayerEngine):
nodes = 1 nodes = 1
leafs = 0 leafs = 0
move = [] move = []
all_moves = board.legal_moves() for m in self.get_player_moves(board):
for m in all_moves:
board.push(m) board.push(m)
value, n, l = self.checkAlphaBeta(board, False, self.options['depth'] - 1, alpha, beta) value, n, l = self.checkAlphaBeta(board, False, self.options['depth'] - 1, alpha, beta)
board.pop() board.pop()
@ -161,8 +167,7 @@ class AlphabetaPlayerEngine(PlayerEngine):
return self.heuristic.get(board, self.player), nodes, leafs return self.heuristic.get(board, self.player), nodes, leafs
if friend_move: if friend_move:
all_moves = board.legal_moves() for m in self.get_player_moves(board):
for m in all_moves:
board.push(m) board.push(m)
v, n, l = self.checkAlphaBeta(board, False, depth - 1, alpha, beta) v, n, l = self.checkAlphaBeta(board, False, depth - 1, alpha, beta)
board.pop() board.pop()
@ -178,8 +183,7 @@ class AlphabetaPlayerEngine(PlayerEngine):
return alpha, nodes, leafs return alpha, nodes, leafs
else: else:
all_moves = board.legal_moves() for m in self.get_player_moves(board):
for m in all_moves:
board.push(m) board.push(m)
v, n, l = self.checkAlphaBeta(board, True, depth - 1, alpha, beta) v, n, l = self.checkAlphaBeta(board, True, depth - 1, alpha, beta)
board.pop(); board.pop();
@ -247,7 +251,7 @@ class MinmaxDeepeningPlayerEngine(MinmaxPlayerEngine):
class AlphaBetaDeepeningPlayerEngine(AlphabetaPlayerEngine): class AlphaBetaDeepeningPlayerEngine(AlphabetaPlayerEngine):
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
@ -282,10 +286,16 @@ class AlphaBetaDeepeningPlayerEngine(AlphabetaPlayerEngine):
alpha alpha
)) ))
depth = depth + 1 depth = depth + 1
self.logger.debug("id_alphabeta - depth reached: {} | max depth : {}".format( self.logger.info("id_alphabeta - depth reached: {} | max depth : {}".format(
depth - 1, depth - 1,
max_depth max_depth
)) ))
self.logger.info("Tree statistics:\n\tnodes:{}\n\tleafs:{}\n\theuristic:{}".format(
nodes,
leafs,
alpha
))
return move return move
def alarm_handler(self, signal, frame): def alarm_handler(self, signal, frame):