コード例 #1
0
ファイル: Board.py プロジェクト: jackesfonseca/project_EDA
 def __init__(self, rows, columns):
     if rows < 1 or columns < 1:
         raise BoardException(
             'Error criando Board, é necessário ao menos 1 linha e 1 coluna'
         )
     self.__rows = rows
     self.__columns = columns
     self.__pieces = Lista.Lista(8, copy.copy(Lista.Lista(8)))
コード例 #2
0
    def pieces(self):
        mat = Lista.Lista()

        for i in range(self.__board.columns):
            row = Lista.Lista()
            for j in range(self.__board.columns):
                row.insere_final(self.__board.piece(i, j))
            mat.insere_final(row)
        return mat
コード例 #3
0
ファイル: Knight.py プロジェクト: jackesfonseca/project_EDA
    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
コード例 #4
0
 def __init__(self, bot_color=None):
     self.bot_color = bot_color
     self.__board = Board(8, 8)
     self.__turn = 1
     self.__half_move = 0
     self.__current_player = 'WHITE'
     self.__pieces_on_the_board = Lista.Lista()
     self.__captured_pieces = Lista.Lista()
     self.__match_moves = Pilha.Pilha()
     self.__check = False
     self.__checkmate = False
     self.__draw = False
     self.__en_passant_vulnerable = None
     self.__promoted = None
     self.initial_setup()
コード例 #5
0
 def test_initialize_list(self):
     lista_test = Lista.Lista(3, 'teste')
     self.assertEqual(len(lista_test), 3, 'Tamanho Invalido.')
     self.assertEqual(lista_test[0], 'teste',
                      'Valor não corresponde com o esperado.')
     self.assertEqual(lista_test[1], 'teste',
                      'Valor não corresponde com o esperado.')
     self.assertEqual(lista_test[2], 'teste',
                      'Valor não corresponde com o esperado.')
コード例 #6
0
ファイル: Rook.py プロジェクト: jackesfonseca/project_EDA
    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
コード例 #7
0
 def setUp(self):
     self.lista = Lista.Lista()
     self.lista.insere_inicio('meio')
コード例 #8
0
ファイル: King.py プロジェクト: jackesfonseca/project_EDA
    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
コード例 #9
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
コード例 #10
0
    def perform_chess_move(self, source_position, target_position):
        if self.__current_player == 'WHITE':
            self.__turn_move = Lista.Lista()

        source = source_position._to_position()
        target = target_position._to_position()
        self.__validate_source_position(source)
        self.__validate_target_position(source, target)
        captured_piece = self._make_move(source, target)
        moved_piece = self.__board.piece(target.row, target.column)

        if isinstance(self.__board.piece(target.row, target.column),
                      Pawn.Pawn) or captured_piece != None:
            self.__half_move = 0
        else:
            self.__half_move += 1

        # Movimento especial promoção
        self.__promoted = None
        if isinstance(moved_piece, Pawn.Pawn):
            if (moved_piece.color == 'WHITE'
                    and target.row == 0) or (moved_piece.color == 'BLACK'
                                             and target.row == 7):
                self.__promoted = self.__board.piece(target.row, target.column)
                self.__promoted = self.replace_promoted_piece('Q')

        if self.__test_check(self.__current_player):
            self._undo_move(source, target, captured_piece)
            raise ChessException('O seu rei está em check')

        self.__check = True if self.__test_check(
            self._opponent_color(self.__current_player)) else False

        # Cria a lista de movimentos da partida
        # Apenas movimentação
        if captured_piece == None:
            if self.__promoted != None:
                self.__match_moves.empilhar(
                    str(target_position) + str(self.__promoted).upper())
            elif isinstance(moved_piece, Pawn.Pawn):
                self.__match_moves.empilhar(str(target_position))
            # Rook pelo lado do rei
            elif isinstance(moved_piece,
                            King.King) and target.column - source.column == 2:
                self.__match_moves.empilhar('O-O')
            # Rook pelo lado da rainha
            elif isinstance(moved_piece,
                            King.King) and target.column - source.column == -2:
                self.__match_moves.empilhar('O-O-O')
            else:
                self.__match_moves.empilhar(
                    str(moved_piece).upper() + str(target_position))

            # Se estiver em check, o movimento que ocasionou deve ser adicionado um + no final
            if self.__check:
                self.__match_moves.altera_topo(
                    self.__match_moves.retorna_topo() + '+')
        # Capturas
        elif captured_piece != None:
            if isinstance(moved_piece, Pawn.Pawn):
                self.__match_moves.empilhar(
                    str(source_position.column) + 'x' + str(target_position))
            else:
                self.__match_moves.empilhar(
                    str(moved_piece) + 'x' + str(target_position))

        # Testa check e checkmate
        if self.__test_checkmate(self._opponent_color(self.__current_player)):
            self.__checkmate = True
            self.__match_moves.altera_topo(self.__match_moves.retorna_topo() +
                                           '+')
        elif self.__test_draw():
            self.__draw = True
        else:
            self.__next_turn()

        # Movimento especial en passant
        if isinstance(moved_piece,
                      Pawn.Pawn) and (target.row == source.row - 2
                                      or target.row == source.row + 2):
            self.__en_passant_vulnerable = moved_piece
        else:
            self.__en_passant_vulnerable = None

        return captured_piece