Esempio n. 1
0
    def square_clicked(self, event):
        col_size = row_size = self.dim_square
        if not self.source:
            try:
                self.source = ChessPosition._from_position(
                    Position(int(event.y / row_size), int(event.x / col_size)))
                self.focused = self.__chess_match.possible_move(self.source)
                self.draw_board()
            except ChessException.ChessException as e:
                self.current_player_label.configure(text=e)
                self.source = None
        else:
            try:
                target = ChessPosition._from_position(
                    Position(int(event.y / row_size), int(event.x / col_size)))
                captured_piece = self.__chess_match.perform_chess_move(
                    self.source, target)
                self.draw_captured_pieces(captured_piece)
                self.current_player_label.configure(
                    text='Vez das ' +
                    ('Brancas' if self.__chess_match.current_player ==
                     'WHITE' else 'Negras'))
                if self.thread != None and self.thread.is_alive():
                    self.cpu_suggestions.terminate()
                    self.thread.join(0)
            except ChessException.ChessException as e:
                self.current_player_label.configure(text=e)

            self.source = None
            self.focused = None
            self.__stockfish.set_fen_position(
                self.__chess_match.get_fen_notation())
            if self.__chess_match.current_player == self.__chess_match.bot_color:
                moviment = self.__stockfish.get_best_move()
                captured_piece = self.__chess_match.perform_chess_move(
                    ChessPosition(moviment[0], int(moviment[1])),
                    ChessPosition(moviment[2], int(moviment[3])))
                self.draw_captured_pieces(captured_piece)
                self.current_player_label.configure(
                    text='Vez das ' +
                    ('Brancas' if self.__chess_match.current_player ==
                     'WHITE' else 'Negras'))

            # Evita que entre em processo de threading
            if not self.__chess_match.checkmate and not self.__chess_match.draw:
                self.cpu_suggestions = Suggestion(self.__chess_match)
                self.thread = threading.Thread(
                    target=self.cpu_suggestions.calculate_suggestions,
                    args=(self, ))
                self.thread.start()
                self.lateral_suggestions.delete(0, tk.END)
                self.lateral_suggestions.insert(1, "Calculando Sugestões...")

            self.draw_board()
            self.draw_pieces()
        self.show_match_moves()
        if self.__chess_match.checkmate or self.__chess_match.draw:
            self.on_closing()
Esempio n. 2
0
    def square_clicked(self, event):
        col_size = row_size = self.dim_square
        if not self.source:
            try:
                self.source = ChessPosition._from_position(
                    Position(int(event.y / row_size), int(event.x / col_size)))
                self.focused = self.__chess_match.possible_move(self.source)
                self.draw_board()
            except ChessException.ChessException as e:
                self.source = None
                print(e)
        else:
            try:
                target = ChessPosition._from_position(
                    Position(int(event.y / row_size), int(event.x / col_size)))
                captured_piece = self.__chess_match.perform_chess_move(
                    self.source, target)
                if self.thread.is_alive():
                    self.cpu_suggestions.terminate()
                    self.thread.join(0)
            except ChessException.ChessException as e:
                print(e)

            self.source = None
            self.focused = None
            self.__stockfish.set_fen_position(
                self.__chess_match.get_fen_notation())
            if self.__chess_match.current_player == self.__chess_match.bot_color:
                moviment = self.__stockfish.get_best_move()
                captured_piece = self.__chess_match.perform_chess_move(
                    ChessPosition(moviment[0], int(moviment[1])),
                    ChessPosition(moviment[2], int(moviment[3])))
                self.cpu_suggestions = Suggestion(self.__chess_match)
                self.thread = threading.Thread(
                    target=self.cpu_suggestions.calculate_suggestions,
                    args=(self, ))
                self.thread.start()
                self.lateral_suggestions.delete(0, tk.END)
                self.lateral_suggestions.insert(1, "Calculando Sugestões...")
            self.draw_board()
            self.draw_pieces()
        self.show_match_moves()
        if self.__chess_match.checkmate or self.__chess_match.draw:
            if self.thread.is_alive():
                self.cpu_suggestions.terminate()
                self.thread.join(0)
            self.parent.quit()
Esempio n. 3
0
    def possible_moves(self):
        mat = Lista.Lista(8, copy.copy(Lista.Lista(8, False)))

        # Movimentos pra cima
        p = Position(self._position.row - 1, self._position.column)
        while self.board.is_position_exists(
                p.row, p.column) and not self.board.is_there_a_piece(p):
            mat[p.row][p.column] = True
            p.row -= 1
        if self.board.is_position_exists(
                p.row, p.column) and self._is_there_opponent_piece(p):
            mat[p.row][p.column] = True

        # Movimentos pra baixo
        p = Position(self._position.row + 1, self._position.column)
        while self.board.is_position_exists(
                p.row, p.column) and not self.board.is_there_a_piece(p):
            mat[p.row][p.column] = True
            p.row += 1
        if self.board.is_position_exists(
                p.row, p.column) and self._is_there_opponent_piece(p):
            mat[p.row][p.column] = True

        # Movimentos pra direita
        p = Position(self._position.row, self._position.column + 1)
        while self.board.is_position_exists(
                p.row, p.column) and not self.board.is_there_a_piece(p):
            mat[p.row][p.column] = True
            p.column += 1
        if self.board.is_position_exists(
                p.row, p.column) and self._is_there_opponent_piece(p):
            mat[p.row][p.column] = True

        # Movimentos pra esquerda
        p = Position(self._position.row, self._position.column - 1)
        while self.board.is_position_exists(
                p.row, p.column) and not self.board.is_there_a_piece(p):
            mat[p.row][p.column] = True
            p.column -= 1
        if self.board.is_position_exists(
                p.row, p.column) and self._is_there_opponent_piece(p):
            mat[p.row][p.column] = True

        return mat
Esempio n. 4
0
    def possible_moves(self):
        mat = Lista.Lista(8, copy.copy(Lista.Lista(8, False)))

        # Movimentos pra cima/direita
        p = Position(self._position.row - 2, self._position.column + 1)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra direita/cima
        p = Position(self._position.row - 1, self._position.column + 2)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra direita/baixo
        p = Position(self._position.row + 1, self._position.column + 2)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra baixo/direita
        p = Position(self._position.row + 2, self._position.column + 1)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra baixo/esquerda
        p = Position(self._position.row + 2, self._position.column - 1)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra esquerda/baixo
        p = Position(self._position.row + 1, self._position.column - 2)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra esquerda/cima
        p = Position(self._position.row - 1, self._position.column - 2)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra cima/esquerda
        p = Position(self._position.row - 2, self._position.column - 1)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        return mat
Esempio n. 5
0
    def _undo_move(self, source, target, captured_piece):
        p = self.__board.remove_piece(target)
        p.decrease_move_count()
        self.__board.place_piece(p, source)

        if captured_piece != None:
            self.__board.place_piece(captured_piece, target)
            self.__captured_pieces.excluir_posicao(captured_piece)
            self.__pieces_on_the_board.insere_final(captured_piece)

        # Movimento especial rook pelo lado do rei
        if isinstance(p, King.King) and target.column == source.column + 2:
            source_tower = Position(source.row, source.column + 3)
            target_tower = Position(source.row, source.column + 1)
            rook = self.__board.remove_piece(target_tower)
            self.__board.place_piece(rook, source_tower)
            rook.decrease_move_count()

        # Movimento especial rook pelo lado da rainha
        if isinstance(p, King.King) and target.column == source.column - 2:
            source_tower = Position(source.row, source.column - 4)
            target_tower = Position(source.row, source.column - 1)
            rook = self.__board.remove_piece(target_tower)
            self.__board.place_piece(rook, source_tower)
            rook.decrease_move_count()

        # Movimento especial en passant
        if isinstance(p, Pawn.Pawn):
            if source.column != target.column and captured_piece == self.__en_passant_vulnerable:
                pawn = self.__board.remove_piece(target)
                if p.color == 'WHITE':
                    pawn_positon = Position(3, target.column)
                else:
                    pawn_positon = Position(4, target.column)
                self.__board.place_piece(pawn, pawn_positon)
Esempio n. 6
0
    def __test_checkmate(self, color):
        if not self.__test_check(color):
            return False

        for i in range(len(self.__pieces_on_the_board)):
            p = self.__pieces_on_the_board[i]
            if p.color == color:
                mat = p.possible_moves()
                for j in range(len(mat)):
                    for k in range(len(mat)):
                        if mat[j][k]:
                            source = p.chess_position()._to_position()
                            target = Position(j, k)
                            captured_piece = self._make_move(source, target)
                            test_check = self.__test_check(color)
                            self._undo_move(source, target, captured_piece)
                            if not test_check:
                                return False
        return True
Esempio n. 7
0
 def __test_draw(self):
     # Falta de material (B e K vs K, N e K vs K, K vs K)
     if len(self.__pieces_on_the_board) == 3:
         for i in range(len(self.__pieces_on_the_board)):
             p = self.__pieces_on_the_board[i]
             if isinstance(p, Knight.Knight) or isinstance(
                     p, Bishop.Bishop):
                 return True
     elif len(self.__pieces_on_the_board) == 2:
         return True
     else:
         # Afogamento
         for i in range(len(self.__pieces_on_the_board)):
             p = self.__pieces_on_the_board[i]
             if p.color == self._opponent_color(self.__current_player):
                 if p.is_there_any_possible_move() and not isinstance(
                         p, King.King):
                     return False
                 elif isinstance(p, King.King):
                     mat = p.possible_moves()
                     for j in range(len(mat)):
                         for k in range(len(mat)):
                             if mat[j][k]:
                                 source = p.chess_position()._to_position()
                                 target = Position(j, k)
                                 captured_piece = self._make_move(
                                     source, target)
                                 test_check = self.__test_check(
                                     self._opponent_color(
                                         self.__current_player))
                                 self._undo_move(source, target,
                                                 captured_piece)
                                 if not test_check:
                                     return False
         return True
     return False
Esempio n. 8
0
    def _make_move(self, source, target):
        p = self.__board.remove_piece(source)
        p.increase_move_count()
        captured_piece = self.__board.remove_piece(target)
        self.__board.place_piece(p, target)

        if captured_piece != None:
            self.__pieces_on_the_board.excluir_posicao(captured_piece)
            self.__captured_pieces.insere_final(captured_piece)

        # Movimento especial rook pelo lado do rei
        if isinstance(p, King.King) and target.column == source.column + 2:
            source_tower = Position(source.row, source.column + 3)
            target_tower = Position(source.row, source.column + 1)
            rook = self.__board.remove_piece(source_tower)
            self.__board.place_piece(rook, target_tower)
            rook.increase_move_count()

        # Movimento especial rook pelo lado da rainha
        if isinstance(p, King.King) and target.column == source.column - 2:
            source_tower = Position(source.row, source.column - 4)
            target_tower = Position(source.row, source.column - 1)
            rook = self.__board.remove_piece(source_tower)
            self.__board.place_piece(rook, target_tower)
            rook.increase_move_count()

        # Movimento especial en passant
        if isinstance(p, Pawn.Pawn):
            if source.column != target.column and captured_piece == None:
                if p.color == 'WHITE':
                    pawn_positon = Position(target.row + 1, target.column)
                else:
                    pawn_positon = Position(target.row - 1, target.column)
                captured_piece = self.__board.remove_piece(pawn_positon)
                self.__captured_pieces.insere_final(captured_piece)
                self.__pieces_on_the_board.excluir_posicao(captured_piece)

        return captured_piece
Esempio n. 9
0
    def possible_moves(self):
        mat = Lista.Lista(8, copy.copy(Lista.Lista(8, False)))

        # Movimentos pra cima
        p = Position(self._position.row - 1, self._position.column)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra baixo
        p = Position(self._position.row + 1, self._position.column)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra direita
        p = Position(self._position.row, self._position.column + 1)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra esquerda
        p = Position(self._position.row, self._position.column - 1)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra cima/direita
        p = Position(self._position.row - 1, self._position.column + 1)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra cima/esquerda
        p = Position(self._position.row - 1, self._position.column - 1)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra baixo/direita
        p = Position(self._position.row + 1, self._position.column + 1)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimentos pra baixo/esquerda
        p = Position(self._position.row + 1, self._position.column - 1)
        if self.board.is_position_exists(p.row,
                                         p.column) and self.__can_move(p):
            mat[p.row][p.column] = True

        # Movimento especial Rook
        if self.move_count == 0 and not self.__chess_match.check:
            # Rook pelo lado do rei
            position_tower = Position(self._position.row,
                                      self._position.column + 3)
            if self.__test_rook(position_tower):
                p1 = Position(self._position.row, self._position.column + 1)
                p2 = Position(self._position.row, self._position.column + 2)
                if self.board.piece(p1.row,
                                    p1.column) == None and self.board.piece(
                                        p2.row, p2.column) == None:
                    mat[self._position.row][self._position.column + 2] = True

            # Rook pelo lado da rainha
            position_tower = Position(self._position.row,
                                      self._position.column - 4)
            if self.__test_rook(position_tower):
                p1 = Position(self._position.row, self._position.column - 1)
                p2 = Position(self._position.row, self._position.column - 2)
                p3 = Position(self._position.row, self._position.column - 3)
                if self.board.piece(
                        p1.row, p1.column) == None and self.board.piece(
                            p2.row, p2.column) == None and self.board.piece(
                                p3.row, p3.column) == None:
                    mat[self._position.row][self._position.column - 2] = True

        return mat
Esempio n. 10
0
    def possible_moves(self):
        mat = Lista.Lista(8, copy.copy(Lista.Lista(8, False)))

        if self.color == 'WHITE':
            # Movimento para cima (1 casa)
            p = Position(self._position.row - 1, self._position.column)
            if self.board.is_position_exists(
                    p.row, p.column) and not self.board.is_there_a_piece(p):
                mat[p.row][p.column] = True

            # Movimento para cima (2 casa)
            p = Position(self._position.row - 2, self._position.column)
            p2 = Position(self._position.row - 1, self._position.column)
            if self.board.is_position_exists(
                    p.row, p.column) and not self.board.is_there_a_piece(
                        p) and self.board.is_position_exists(
                            p2.row,
                            p2.column) and not self.board.is_there_a_piece(
                                p2) and self.move_count == 0:
                mat[p.row][p.column] = True

            # Movimento para comer peça adversária (esquerda)
            p = Position(self._position.row - 1, self._position.column - 1)
            if self.board.is_position_exists(
                    p.row, p.column) and self._is_there_opponent_piece(p):
                mat[p.row][p.column] = True

            # Movimento para comer peça adversária (direita)
            p = Position(self._position.row - 1, self._position.column + 1)
            if self.board.is_position_exists(
                    p.row, p.column) and self._is_there_opponent_piece(p):
                mat[p.row][p.column] = True

            # Movimento especial en passant
            if self._position.row == 3:
                left_pawn = Position(self._position.row,
                                     self._position.column - 1)
                if self.board.is_position_exists(
                        left_pawn.row,
                        left_pawn.column) and self._is_there_opponent_piece(
                            left_pawn) and self.board.piece(
                                left_pawn.row, left_pawn.column
                            ) == self.__chess_match.en_passant_vulnerable:
                    mat[left_pawn.row - 1][left_pawn.column] = True

                right_pawn = Position(self._position.row,
                                      self._position.column + 1)
                if self.board.is_position_exists(
                        right_pawn.row,
                        right_pawn.column) and self._is_there_opponent_piece(
                            right_pawn) and self.board.piece(
                                right_pawn.row, right_pawn.column
                            ) == self.__chess_match.en_passant_vulnerable:
                    mat[right_pawn.row - 1][right_pawn.column] = True

        else:
            # Movimento para cima (1 casa)
            p = Position(self._position.row + 1, self._position.column)
            if self.board.is_position_exists(
                    p.row, p.column) and not self.board.is_there_a_piece(p):
                mat[p.row][p.column] = True

            # Movimento para cima (2 casa)
            p = Position(self._position.row + 2, self._position.column)
            p2 = Position(self._position.row + 1, self._position.column)
            if self.board.is_position_exists(
                    p.row, p.column) and not self.board.is_there_a_piece(
                        p) and self.board.is_position_exists(
                            p2.row,
                            p2.column) and not self.board.is_there_a_piece(
                                p2) and self.move_count == 0:
                mat[p.row][p.column] = True

            # Movimento para comer peça adversária (esquerda)
            p = Position(self._position.row + 1, self._position.column - 1)
            if self.board.is_position_exists(
                    p.row, p.column) and self._is_there_opponent_piece(p):
                mat[p.row][p.column] = True

            # Movimento para comer peça adversária (direita)
            p = Position(self._position.row + 1, self._position.column + 1)
            if self.board.is_position_exists(
                    p.row, p.column) and self._is_there_opponent_piece(p):
                mat[p.row][p.column] = True

            # Movimento especial en passant
            if self._position.row == 4:
                left_pawn = Position(self._position.row,
                                     self._position.column - 1)
                if self.board.is_position_exists(
                        left_pawn.row,
                        left_pawn.column) and self._is_there_opponent_piece(
                            left_pawn) and self.board.piece(
                                left_pawn.row, left_pawn.column
                            ) == self.__chess_match.en_passant_vulnerable:
                    mat[left_pawn.row + 1][left_pawn.column] = True

                right_pawn = Position(self._position.row,
                                      self._position.column + 1)
                if self.board.is_position_exists(
                        right_pawn.row,
                        right_pawn.column) and self._is_there_opponent_piece(
                            right_pawn) and self.board.piece(
                                right_pawn.row, right_pawn.column
                            ) == self.__chess_match.en_passant_vulnerable:
                    mat[right_pawn.row + 1][right_pawn.column] = True

        return mat
Esempio n. 11
0
 def _to_position(self):
     return Position(8 - self.__row, ord(self.__column) - ord('a'))