Exemple #1
0
class Game:
    def __init__(self):
        self.board = Board(ROWS, COLUMNS)
        self.gui = GUI(ROWS, COLUMNS, SIZE, self.board)
        self.rules = Rules()
        self.cursor = Cursor()
        self.player1 = Player(1)
        self.player2 = AIPlayer(2, self.rules, self.board)
        self.currentPlayer = self.assign_player()
        self.gameOver = False
        self.menuFlag = False

    def assign_player(self):
        a = random.randint(0, 1)
        if a == 0:
            self.gui.next_move_message(self.player1.get_id())
            return self.player1
        else:
            self.gui.next_move_message(self.player2.get_id())
            return self.player2

    def switch_players(self):
        if self.currentPlayer == self.player1:
            self.currentPlayer = self.player2
        else:
            self.currentPlayer = self.player1
        self.gui.next_move_message(self.currentPlayer.get_id())

    def reset(self):
        self.menuFlag = False
        self.board.reset()

    def change_rules(self, rule):
        if rule == 1:
            self.rules = Rules()
        elif rule == 2:
            self.rules = DiagonalOnly()
        else:
            self.rules = RowsColumnsOnly()
        self.reset()

    def update_cursor(self, event):
        x = event.pos[0]
        y = event.pos[1]
        self.cursor.update(x, y)

    def mouse_motion(self):
        if self.gameOver is False and self.menuFlag is False:
            if self.gui.are_buttons_hovered(self.cursor.gety()):
                self.gui.buttons_hovered(self.cursor.getx())
            else:
                self.gui.draw_gui(self.board)
        elif self.menuFlag:
            if self.gui.are_rules_hovered(self.cursor.getx(),
                                          self.cursor.gety()):
                self.gui.rules_hovered(self.cursor.getx(), self.cursor.gety())
            else:
                self.gui.draw_gui(self.board)

    def move_made(self):
        if self.rules.winning_move(self.board.get_board(),
                                   self.currentPlayer.get_id(),
                                   self.board.get_columns(),
                                   self.board.get_rows()):
            self.gameOver = True
            self.gui.winning_move_message(self.currentPlayer.get_id())
        elif self.board.is_full():
            self.gui.draw_message()
            self.gameOver = True
        else:
            self.switch_players()
        #print(self.board.get_board())

    def mouse_clicked(self):
        if self.gameOver is False and self.menuFlag is False:
            if self.gui.are_buttons_hovered(self.cursor.gety()):
                col = int(math.floor(self.cursor.getx() / self.gui.get_size()))
                if self.currentPlayer.make_move(self.board, col):
                    self.move_made()
                else:
                    self.gui.not_valid_loc_message(self.currentPlayer.get_id())
            self.gui.draw_gui(self.board)
        elif self.menuFlag:
            if self.gui.are_rules_hovered(self.cursor.getx(),
                                          self.cursor.gety()):
                rule = self.gui.get_rule(self.cursor.getx(),
                                         self.cursor.gety())
                self.change_rules(rule)
                self.gui.shut_rules()
                self.gameOver = self.menuFlag = False
                self.reset()
        if self.gui.reset_hovered(self.cursor.getx(), self.cursor.gety()):
            self.board.reset()
            self.assign_player()
            self.gameOver = self.menuFlag = False
        if self.gui.are_options_hovered(self.cursor.getx(),
                                        self.cursor.gety()):
            self.gui.options_hovered(self.menuFlag)
            self.menuFlag = not self.menuFlag
        self.gui.draw_gui(self.board)

    def start_game(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                if self.currentPlayer.get_type() == "player":
                    if event.type == pygame.MOUSEMOTION:
                        self.update_cursor(event)
                        self.mouse_motion()
                    elif event.type == pygame.MOUSEBUTTONDOWN:
                        self.update_cursor(event)
                        self.mouse_clicked()
                elif self.currentPlayer.get_type() == "AI":
                    if not self.gameOver and not self.menuFlag:
                        if self.currentPlayer.make_move(self.board, 0):
                            self.move_made()
                        else:
                            self.gui.not_valid_loc_message(
                                self.currentPlayer.get_id())
                        self.gui.draw_gui(self.board)
                    else:
                        self.currentPlayer = self.player1