Create a function to give moves
It's possible to randomize it now
This commit is contained in:
parent
935d3b8f23
commit
6979749d5d
1 changed files with 21 additions and 11 deletions
|
@ -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):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue