Shuffle on legal_move() by default

This commit is contained in:
Yorick Barbanneau 2023-12-20 22:45:04 +01:00
parent 1a670b59b5
commit b4a2fd7484
2 changed files with 47 additions and 15 deletions

View file

@ -8,7 +8,6 @@ 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
@ -21,10 +20,10 @@ class PlayerEngine:
)) ))
def get_player_moves(self, board): def get_player_moves(self, board):
if self.randomize_moves is True: moves = board.legal_moves()
return random.random(board.legal_moves()) if self.options['randomize_moves'] is True:
else: random.shuffle(moves)
return board.legal_moves() return moves
@staticmethod @staticmethod
def get_player_name(player): def get_player_name(player):
@ -79,7 +78,8 @@ class MinmaxPlayerEngine(PlayerEngine):
nodes = 1 nodes = 1
leafs = 0 leafs = 0
move = [] move = []
for m in self.get_player_moves(board): moves = self.get_player_moves(board)
for m in moves:
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 +110,8 @@ class MinmaxPlayerEngine(PlayerEngine):
if friend_move: if friend_move:
value = -math.inf value = -math.inf
for m in self.get_player_moves(board): moves = self.get_player_moves(board)
for m in moves:
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:
@ -121,7 +122,8 @@ class MinmaxPlayerEngine(PlayerEngine):
else: else:
value = math.inf value = math.inf
for m in self.get_player_moves(board): moves = self.get_player_moves(board)
for m in moves:
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:
@ -145,7 +147,8 @@ class AlphabetaPlayerEngine(PlayerEngine):
nodes = 1 nodes = 1
leafs = 0 leafs = 0
move = [] move = []
for m in self.get_player_moves(board): moves = self.get_player_moves(board)
for m in moves:
board.push(m) board.push(m)
value, n, l = self.checkAlphaBeta(board, False, depth - 1, alpha, beta) value, n, l = self.checkAlphaBeta(board, False, depth - 1, alpha, beta)
board.pop() board.pop()
@ -175,7 +178,9 @@ 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:
for m in self.get_player_moves(board):
moves = self.get_player_moves(board)
for m in 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()
@ -191,7 +196,8 @@ class AlphabetaPlayerEngine(PlayerEngine):
return alpha, nodes, leafs return alpha, nodes, leafs
else: else:
for m in self.get_player_moves(board): moves = self.get_player_moves(board)
for m in 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();

View file

@ -56,7 +56,22 @@ def parse_aguments():
help='Weight table for weight based heuristic engines', help='Weight table for weight based heuristic engines',
type=int, type=int,
nargs=3, nargs=3,
default=[2,10,25] default=[-5, 2, 10,25]
)
parser.add_argument('-bR', '--black-randomize-moves',
help='Apply a random function on moves list before explore the game tree - black player',
type=bool,
default=True,
)
parser.add_argument('-wR', '--white-randomize-moves',
help='Apply a random function on moves list before explore the game tree - white player',
type=bool,
default=True,
)
parser.add_argument('--show-weights-table',
help='Display weight table used in \'weight\' and \'full\' heuristic calculation',
action='store_true',
) )
debug_group = parser.add_mutually_exclusive_group() debug_group = parser.add_mutually_exclusive_group()
@ -94,6 +109,16 @@ if __name__ == '__main__':
tty_handler.setFormatter(CustomFormatter()) tty_handler.setFormatter(CustomFormatter())
logger.addHandler(tty_handler) logger.addHandler(tty_handler)
# IT shoud be better implemented but no time to make it clean
if args.show_weights_table:
print("{}".format(
heuristic_engine['weight'](logger,{
'weight': args.weight,
'size': 10
}).show_weights()
))
exit(0)
# Activate verbose or debug mode # Activate verbose or debug mode
if args.verbose is True: if args.verbose is True:
logger.setLevel(log.INFO) logger.setLevel(log.INFO)
@ -102,7 +127,6 @@ if __name__ == '__main__':
if args.debug is True: if args.debug is True:
logger.setLevel(log.DEBUG) logger.setLevel(log.DEBUG)
logger.debug('DEBUG mode activated') logger.debug('DEBUG mode activated')
game = Board(10) game = Board(10)
logger.debug("Init players engines - black:{} / white:{}".format( logger.debug("Init players engines - black:{} / white:{}".format(
args.black_engine, args.black_engine,
@ -120,7 +144,8 @@ if __name__ == '__main__':
), ),
{ {
'depth': args.white_depth_exploration, 'depth': args.white_depth_exploration,
'time_limit': 10 'time_limit': 10,
'randomize_moves': args.white_randomize_moves
} }
) )
bplayer = player_engines[args.black_engine]( bplayer = player_engines[args.black_engine](
@ -134,7 +159,8 @@ if __name__ == '__main__':
), ),
{ {
'depth': args.black_depth_exploration, 'depth': args.black_depth_exploration,
'time_limit': 10 'time_limit': 10,
'randomize_moves': args.black_randomize_moves
} }
) )
while ( not game.is_game_over()): while ( not game.is_game_over()):