From b4a2fd74844282a13e4594578e50d007e9fe6aba Mon Sep 17 00:00:00 2001 From: Yorick Barbanneau Date: Wed, 20 Dec 2023 22:45:04 +0100 Subject: [PATCH] Shuffle on legal_move() by default --- src/classes/Engines.py | 28 +++++++++++++++++----------- src/game.py | 34 ++++++++++++++++++++++++++++++---- 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/src/classes/Engines.py b/src/classes/Engines.py index d31c5fc..b567786 100644 --- a/src/classes/Engines.py +++ b/src/classes/Engines.py @@ -8,7 +8,6 @@ class PlayerEngine: self.heuristic = heuristic self.options = options self.interrupt_search = False - self.randomize_moves = False self.logger.info("Init engine {}, options:{}".format( self.__class__.__name__, self.options @@ -21,10 +20,10 @@ class PlayerEngine: )) def get_player_moves(self, board): - if self.randomize_moves is True: - return random.random(board.legal_moves()) - else: - return board.legal_moves() + moves = board.legal_moves() + if self.options['randomize_moves'] is True: + random.shuffle(moves) + return moves @staticmethod def get_player_name(player): @@ -79,7 +78,8 @@ class MinmaxPlayerEngine(PlayerEngine): nodes = 1 leafs = 0 move = [] - for m in self.get_player_moves(board): + moves = self.get_player_moves(board) + for m in moves: board.push(m) v, n, l = self.checkMinMax(board, False, depth - 1) if v > value: @@ -110,7 +110,8 @@ class MinmaxPlayerEngine(PlayerEngine): if friend_move: value = -math.inf - for m in self.get_player_moves(board): + moves = self.get_player_moves(board) + for m in moves: board.push(m) v, n, l = self.checkMinMax(board, False, depth - 1) if v > value: @@ -121,7 +122,8 @@ class MinmaxPlayerEngine(PlayerEngine): else: value = math.inf - for m in self.get_player_moves(board): + moves = self.get_player_moves(board) + for m in moves: board.push(m) v, n, l = self.checkMinMax(board, True, depth - 1) if v < value: @@ -145,7 +147,8 @@ class AlphabetaPlayerEngine(PlayerEngine): nodes = 1 leafs = 0 move = [] - for m in self.get_player_moves(board): + moves = self.get_player_moves(board) + for m in moves: board.push(m) value, n, l = self.checkAlphaBeta(board, False, depth - 1, alpha, beta) board.pop() @@ -175,7 +178,9 @@ class AlphabetaPlayerEngine(PlayerEngine): return self.heuristic.get(board, self.player), nodes, leafs if friend_move: - for m in self.get_player_moves(board): + + moves = self.get_player_moves(board) + for m in moves: board.push(m) v, n, l = self.checkAlphaBeta(board, False, depth - 1, alpha, beta) board.pop() @@ -191,7 +196,8 @@ class AlphabetaPlayerEngine(PlayerEngine): return alpha, nodes, leafs else: - for m in self.get_player_moves(board): + moves = self.get_player_moves(board) + for m in moves: board.push(m) v, n, l = self.checkAlphaBeta(board, True, depth - 1, alpha, beta) board.pop(); diff --git a/src/game.py b/src/game.py index 966f832..8c156ed 100755 --- a/src/game.py +++ b/src/game.py @@ -56,7 +56,22 @@ def parse_aguments(): help='Weight table for weight based heuristic engines', type=int, 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() @@ -94,6 +109,16 @@ if __name__ == '__main__': tty_handler.setFormatter(CustomFormatter()) 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 if args.verbose is True: logger.setLevel(log.INFO) @@ -102,7 +127,6 @@ if __name__ == '__main__': if args.debug is True: logger.setLevel(log.DEBUG) logger.debug('DEBUG mode activated') - game = Board(10) logger.debug("Init players engines - black:{} / white:{}".format( args.black_engine, @@ -120,7 +144,8 @@ if __name__ == '__main__': ), { 'depth': args.white_depth_exploration, - 'time_limit': 10 + 'time_limit': 10, + 'randomize_moves': args.white_randomize_moves } ) bplayer = player_engines[args.black_engine]( @@ -134,7 +159,8 @@ if __name__ == '__main__': ), { 'depth': args.black_depth_exploration, - 'time_limit': 10 + 'time_limit': 10, + 'randomize_moves': args.black_randomize_moves } ) while ( not game.is_game_over()):