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
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()
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