Exemple #1
0
    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
Exemple #2
0
    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