Shuffle on legal_move() by default
This commit is contained in:
parent
1a670b59b5
commit
b4a2fd7484
2 changed files with 47 additions and 15 deletions
|
@ -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();
|
||||||
|
|
34
src/game.py
34
src/game.py
|
@ -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()):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue