def play(self, grid: Grid): """ """ #print(self.name) empty_square = grid.get_empty_square() max_value = -float('inf') best_move = [] for available_pos_index, available_pos in enumerate(empty_square): #print(possible_grid[possible_result_index]) grid.add_a_pawn(self, available_pos[0], available_pos[1]) value, branch = self.minmax(grid, self.depth, self.adversary) branch.set_pos(available_pos) self.tree.add(branch) if value > max_value: max_value = value best_move = [empty_square[available_pos_index]] elif value == max_value: best_move.append(empty_square[available_pos_index]) grid.cancel_move() self.tree.set_value(max_value) pos = random.choice(best_move) #print(self.color, best_move, len(best_move), len(empty_square)) self.turn += 1 self.tree.write_in_file("./tree/tree " + str(self.name) + str(self.turn) + " turn") self.tree = Tree() return pos
def minmax(self, grid: Grid, depth: int, player: Player) -> int: """ """ current_tree = Tree() if grid.is_finished() or depth == 0: #print(grid, "val :", self.eval(grid, depth), "player",player) value = self.eval(grid, depth) current_tree.set_value(value) #grid.cancel_move() return value, current_tree empty_square = grid.get_empty_square() if player.color == self.color: value = [] for available_pos in empty_square: grid.add_a_pawn(self, available_pos[0], available_pos[1]) current_value, branch = self.minmax(grid, depth - 1, player.adversary) branch.set_pos(available_pos) current_tree.add(branch) value.append(current_value) grid.cancel_move() value = max(value) current_tree.set_value(value) return value, current_tree else: value = [] for available_pos in empty_square: grid.add_a_pawn(self.adversary, available_pos[0], available_pos[1]) current_value, branch = self.minmax(grid, depth - 1, player.adversary) branch.set_pos(available_pos) current_tree.add(branch) value.append(current_value) grid.cancel_move() value = min(value) current_tree.set_value(value) return value, current_tree