Esempio n. 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
Esempio n. 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
Esempio n. 3
0
class GUI(QWidget):
    name_to_color = {
        ".": QColor(0, 0, 0),
        "x": QColor(255, 0, 0),
        "o": QColor(0, 255, 255),
        "+": QColor(0, 0, 255),
        "*": QColor(125, 125, 125)
    }

    def __init__(self, p1, p2, grid_lenght):
        super().__init__()
        #self.init_game()
        self.grid = Grid(grid_lenght)
        self.player1 = p1
        self.current_player = self.player1
        self.player2 = p2
        self.player1.set_adversary(self.player2)
        self.player2.set_adversary(self.player1)
        #self.grid.add_a_pawn(p1, 1, 1)
        self.initUI()

    def initUI(self):
        self.setGeometry(0, 0, 500, 500)
        self.setWindowTitle("Virus Game")
        self.show()

    def paintEvent(self, e):
        qp = QPainter()
        self.drawgame(qp)

    def drawgame(self, qp):
        qp.begin(self)
        pen = QPen()
        pen.setColor(QColor("black"))
        pen.setWidth(3)
        qp.setPen(pen)
        for index_x in range(len(self.grid.grid)):
            qp.drawLine(
                QPoint(
                    int(index_x * float(self.width()) / self.grid.grid_length),
                    0),
                QPoint(
                    int(index_x * float(self.width()) / self.grid.grid_length),
                    self.height()))
            for index_y in range(len(self.grid.grid[index_x])):
                qp.drawLine(
                    QPoint(
                        0,
                        int(index_y * float(self.height()) /
                            self.grid.grid_length)),
                    QPoint(
                        self.width(),
                        int(index_y * float(self.height()) /
                            self.grid.grid_length)))
                if self.grid.grid[index_x][index_y].color is None:
                    continue
                pen.setColor(QColor(self.grid.grid[index_x][index_y].color))
                qp.fillRect(
                    QRect(
                        QPoint(
                            int(index_x * float(self.width()) /
                                self.grid.grid_length + 1),
                            int(index_y * float(self.height()) /
                                self.grid.grid_length + 1)),
                        QPoint(
                            int(index_x * float(self.width()) /
                                self.grid.grid_length +
                                float(self.width()) / self.grid.grid_length),
                            int(index_y * float(self.height()) /
                                self.grid.grid_length + float(self.height()) /
                                self.grid.grid_length))),
                    QColor(self.grid.grid[index_x][index_y].color))
                pen.setColor(QColor("black"))
        qp.end()

    def mousePressEvent(self, event):
        pos_x = int(event.x() / self.width() * self.grid.grid_length)
        pos_y = int(event.y() / self.height() * self.grid.grid_length)
        if pos_x < 0 or pos_x >= self.grid.grid_length:
            return
        if pos_y < 0 or pos_y >= self.grid.grid_length:
            return
        if not self.grid.add_a_pawn(self.current_player, pos_x, pos_y):
            return
        self.current_player = self.current_player.adversary
        self.repaint()
        if type(self.current_player) is Computer:

            pos = self.current_player.play(self.grid)
            self.grid.add_a_pawn(self.current_player, pos[0], pos[1])
            self.current_player = self.current_player.adversary
            self.update()
Esempio n. 4
0
class VirusGame:
    """
    describe the virus game
    :Param: grille_lenght: int
            player1: Player
            Player2: Player
            no_print: bool
    """
    def __init__(self, grid_lenght: int,\
                player1: Player, player2: Player,\
                no_print=False):

        self.no_print = no_print
        self.grid = Grid(grid_lenght)
        if isinstance(player1, CE) and isinstance(player2, CE):
            self.player1 = CE("comp1", "rouge", player1.depth, player1.genes)
            self.player2 = CE("comp2", "bleu", player2.depth, player2.genes)
        else:
            self.player1 = player1
            self.player2 = player2
        self.player1.set_adversary(self.player2)
        self.player2.set_adversary(self.player1)
        self.player = self.player1

    def play(self):
        """
        launch 1 turn and add a pawn to the game
        :Param

        :Return Value: bool
        """
        if self.grid.is_finished():
            if not self.no_print:
                print(self.grid)
            return False

        if not self.no_print:
            print(self.player.name, "play on this grid")
            print(self.grid)

        pos = self.player.play(self.grid)
        self.grid.add_a_pawn(self.player, pos[0], pos[1])
        self.player = self.player.get_adversary()
        return True

    def print_score(self):
        """
        print the result of the game
        :Param

        :Return Value: str
        """
        score1, score2 = self.get_score()
        print("score", self.player1.name, score1)
        print("score", self.player2.name, score2)
        if score1 == score2:
            return "there is no winner"
        else:
            return "winner is..." + str(
                self.player1.name if score1 > score2 else self.player2.name)

    def get_score(self):
        """
        return the 2 score of the game
        :Param

        :Return Value: int, int
        """
        score1 = 0
        score2 = 0
        for line in self.grid.grid:
            for pawn in line:
                if pawn.color == self.player1.color:
                    score1 += 1
                else:
                    score2 += 1
        return score1, score2