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)))
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
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
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()
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.')
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
def setUp(self): self.lista = Lista.Lista() self.lista.insere_inicio('meio')
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
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
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