Exemple #1
0
    def en_passant(self):
        if self.file_pinned() or self.rank_pinned():
            return []

        m = []
        c = 1 if self.is_white() else -1
        p_x, p_y = self.position

        if self.board.is_en_passant_rank(self.color, self.position):
            last_move = self.board.get_last_move()

            if last_move and last_move.piece.is_pawn() and last_move.piece.color != self.color and \
                    abs(last_move.origin[1] - last_move.destination[1]) > 1:
                left = (p_x - 1 * c, p_y)
                right = (p_x + 1 * c, p_y)

                if last_move.piece.position == left:
                    m.append(
                        moves.Capture(self, (p_x, p_y),
                                      (left[0], left[1] + 1 * c),
                                      self.board.pieces[left]))
                elif last_move.piece.position == right:
                    m.append(
                        moves.Capture(self, (p_x, p_y),
                                      (right[0], right[1] + 1 * c),
                                      self.board.pieces[right]))
        return m
Exemple #2
0
    def pawn_attacks(self):
        if self.file_pinned() or self.rank_pinned():
            return []

        m = []
        squares = self.influenced_squares()
        p_x, p_y = self.position
        pining_piece = self.diagonal_pin_piece()

        for s in squares:
            if s in self.board.pieces:
                if self.board.pieces[s].color != self.color:
                    if self.board.pieces[s] == self.board.get_enemy_king(
                            self.color):
                        m.append(moves.Attack(self, (p_x, p_y), s))
                    elif self.board.is_last_rank(self.color, s):
                        m += self.generate_all_promotions((p_x, p_y), s,
                                                          self.board.pieces[s])
                    else:
                        if pining_piece and pining_piece == self.board.pieces[
                                s]:
                            m.append(
                                moves.Capture(self, (p_x, p_y), s,
                                              self.board.pieces[s]))
                        elif not pining_piece:
                            m.append(
                                moves.Capture(self, (p_x, p_y), s,
                                              self.board.pieces[s]))

        return m
Exemple #3
0
    def get_moves(self):
        m = []
        squares = self.influenced_squares()
        p_x, p_y = self.position

        for s in squares:
            if self.protected_square(s):
                continue

            if s in self.board.pieces:
                if self.board.pieces[s].color != self.color:
                    m.append(
                        moves.Capture(self, (p_x, p_y), s,
                                      self.board.pieces[s]))
            else:
                m.append(moves.Move(self, (p_x, p_y), s))

        castle_short = self.short_castle()
        castle_long = self.long_castle()

        if castle_short:
            m.append(castle_short)

        if castle_long:
            m.append(castle_long)

        return m
Exemple #4
0
    def get_moves(self):
        if self.file_pinned() or self.rank_pinned():
            return []

        m = []
        p_x, p_y = self.position

        pining_piece = self.diagonal_pin_piece()

        if pining_piece and self.same_rising_diagonal(self, pining_piece):
            squares = self.get_rising_diagonal_squares()
        elif pining_piece and self.same_falling_diagonal(self, pining_piece):
            squares = self.get_falling_diagonal_squares()
        else:
            squares = self.influenced_squares()

        for s in squares:
            if s in self.board.pieces:
                if self.board.pieces[s].color != self.color:
                    if self.board.pieces[s] == self.board.get_enemy_king(
                            self.color):
                        m.append(moves.Attack(self, (p_x, p_y), s))
                    else:
                        m.append(
                            moves.Capture(self, (p_x, p_y), s,
                                          self.board.pieces[s]))
            else:
                m.append(moves.Move(self, (p_x, p_y), s))

        return m
Exemple #5
0
    def get_moves(self):
        if self.diagonally_pinned():
            return []

        m = []
        p_x, p_y = self.position

        if self.file_pinned():
            squares = self.get_file_squares()
        elif self.rank_pinned():
            squares = self.get_rank_squares()
        else:
            squares = self.influenced_squares()

        for s in squares:
            if s in self.board.pieces:
                if self.board.pieces[s].color != self.color:
                    if self.board.pieces[s] == self.board.get_enemy_king(
                            self.color):
                        m.append(moves.Attack(self, (p_x, p_y), s))
                    else:
                        m.append(
                            moves.Capture(self, (p_x, p_y), s,
                                          self.board.pieces[s]))
            else:
                m.append(moves.Move(self, (p_x, p_y), s))

        return m