コード例 #1
0
    def getPossibleMoves(self):
        # Function run to yield a group of all possible legal and illegal
        # 'Move' objects to the calling function. Does this by running through
        # a list of movements and testing for valid moves before yielding them.
        # Also handles the promotion of pieces and the ability for a piece to
        # move two spaces forward on its first move.
        pos = self.position
        movement = C(0, 1) if self.side == WHITE else C(0, -1)
        advanceOnePos = pos + movement
        if self.board.isValidPos(advanceOnePos):
            if self.board.pieceAtPosition(advanceOnePos) is None:
                col = advanceOnePos[1]
                if col in [7, 0]:
                    piecesForPromotion = \
                        [Rook(self.board, self.side, advanceOnePos),
                         Knight(self.board, self.side, advanceOnePos),
                         Bishop(self.board, self.side, advanceOnePos),
                         Queen(self.board, self.side, advanceOnePos)]
                    for piece in piecesForPromotion:
                        move = Move(self, advanceOnePos)
                        move.promotion = True
                        piece.movesMade = self.movesMade
                        move.specialMovePiece = piece
                        yield move
                else:
                    yield Move(self, advanceOnePos)

        if self.movesMade == 0:
            advanceTwoPos = pos + movement + movement
            if self.board.isValidPos(advanceTwoPos):
                if self.board.pieceAtPosition(advanceTwoPos) is None and \
                        self.board.pieceAtPosition(advanceOnePos) is None:
                    yield Move(self, advanceTwoPos)

        movements = [C(1, 1), C(
            -1, 1)] if self.side == WHITE else [C(1, -1), C(-1, -1)]
        for movement in movements:
            newPos = self.position + movement
            if self.board.isValidPos(newPos):
                pieceToTake = self.board.pieceAtPosition(newPos)
                if pieceToTake and pieceToTake.side != self.side:
                    col = newPos[1]
                    if col in [7, 0]:
                        piecesForPromotion = \
                            [Rook(self.board, self.side, newPos),
                             Knight(self.board, self.side, newPos),
                             Bishop(self.board, self.side, newPos),
                             Queen(self.board, self.side, newPos)]
                        for piece in piecesForPromotion:
                            move = Move(self,
                                        newPos,
                                        pieceToCapture=pieceToTake)
                            move.promotion = True
                            move.specialMovePiece = piece
                            yield move
                    else:
                        yield Move(self, newPos, pieceToCapture=pieceToTake)
コード例 #2
0
ファイル: King.py プロジェクト: xfang007/command-line-chess
    def getPossibleMoves(self):
        currentPos = self.position
        movements = [C(0, 1), C(0, -1), C(1, 0), C(-1, 0), C(1, 1), C(1, -1), C(-1, 1), C(-1, -1)]
        for movement in movements:
            newPos = currentPos + movement
            if self.board.isValidPos(newPos):
                pieceAtNewPos = self.board.pieceAtPosition(newPos)
                if self.board.pieceAtPosition(newPos) is None:
                    yield Move(self, newPos)
                elif pieceAtNewPos.side != self.side:
                    yield Move(self, newPos, pieceToCapture=pieceAtNewPos)

        # Castling
        if self.movesMade == 0:
            inCheck = False
            kingsideCastleBlocked = False
            queensideCastleBlocked = False
            kingsideCastleCheck = False
            queensideCastleCheck = False
            kingsideRookMoved = True
            queensideRookMoved = True

            kingsideCastlePositions = [self.position + C(1, 0), self.position + C(2, 0)]
            for pos in kingsideCastlePositions:
                if self.board.pieceAtPosition(pos):
                    kingsideCastleBlocked = True

            queensideCastlePositions = [self.position - C(1, 0), self.position - C(2, 0), self.position - C(3, 0)]
            for pos in queensideCastlePositions:
                if self.board.pieceAtPosition(pos):
                    queensideCastleBlocked = True

            if kingsideCastleBlocked and queensideCastleBlocked:
                return

            otherSideMoves = self.board.getAllMovesUnfiltered(not self.side, includeKing=False)
            for move in otherSideMoves:
                if move.newPos == self.position:
                    inCheck = True
                    break
                if move.newPos == self.position + C(1, 0) or move.newPos == self.position + C(2, 0):
                    kingsideCastleCheck = True
                if move.newPos == self.position - C(1, 0) or move.newPos == self.position - C(2, 0):
                    queensideCastleCheck = True

            kingsideRookPos = self.position + C(3, 0)
            kingsideRook = self.board.pieceAtPosition(kingsideRookPos) if self.board.isValidPos(kingsideRookPos) else None
            if kingsideRook and kingsideRook.stringRep == 'R' and kingsideRook.movesMade == 0:
                kingsideRookMoved = False

            queensideRookPos = self.position - C(4, 0)
            queensideRook = self.board.pieceAtPosition(queensideRookPos) if self.board.isValidPos(queensideRookPos) else None
            if queensideRook and queensideRook.stringRep == 'R' and queensideRook.movesMade == 0:
                queensideRookMoved = False

            if not inCheck:
                if not kingsideCastleBlocked and not kingsideCastleCheck and not kingsideRookMoved:
                    move = Move(self, self.position + C(2, 0))
                    rookMove = Move(self.position, self.position + C(1, 0))
                    move.specialMovePiece = self.board.pieceAtPosition(kingsideRookPos)
                    move.kingsideCastle = True
                    move.rookMove = rookMove
                    yield move
                if not queensideCastleBlocked and not queensideCastleCheck and not queensideRookMoved:
                    move = Move(self, self.position - C(2, 0))
                    rookMove = Move(self.position, self.position - C(1, 0))
                    move.specialMovePiece = self.board.pieceAtPosition(queensideRookPos)
                    move.queensideCastle = True
                    move.rookMove = rookMove
                    yield move
コード例 #3
0
ファイル: Pawn.py プロジェクト: ArthurChiao/code-snippets
    def get_possible_moves(self):
        pos = self.position

        # Pawn moves one up
        movement = C(0, 1) if self.side == WHITE else C(0, -1)
        up_pos = pos + movement
        if self.board.is_valid_pos(up_pos):
            # Promotion moves
            if self.board.get_piece_at_pos(up_pos) is None:
                col = up_pos[1]
                if col == 7 or col == 0:
                    piecesForPromotion = \
                        [Rook(self.board, self.side, up_pos),
                         Knight(self.board, self.side, up_pos),
                         Bishop(self.board, self.side, up_pos),
                         Queen(self.board, self.side, up_pos)]
                    for piece in piecesForPromotion:
                        move = Move(self, up_pos)
                        move.promotion = True
                        move.specialMovePiece = piece
                        yield move
                else:
                    yield Move(self, up_pos)

        # Pawn moves two up
        if self.movesMade == 0:
            movement = C(0, 2) if self.side == WHITE else C(0, -2)
            up2_pos = pos + movement
            if self.board.is_valid_pos(up2_pos):
                if self.board.get_piece_at_pos(up2_pos) is None and \
                   self.board.get_piece_at_pos(up_pos) is None:
                    yield Move(self, up2_pos)

        # Pawn takes
        movements = [C(1, 1), C(-1, 1)] \
            if self.side == WHITE else [C(1, -1), C(-1, -1)]

        for movement in movements:
            new_pos = self.position + movement
            if self.board.is_valid_pos(new_pos):
                pieceToTake = self.board.get_piece_at_pos(new_pos)
                if pieceToTake and pieceToTake.side != self.side:
                    col = new_pos[1]
                    # Promotions
                    if col == 7 or col == 0:
                        piecesForPromotion = \
                            [Rook(self.board, self.side, new_pos),
                             Knight(self.board, self.side, new_pos),
                             Bishop(self.board, self.side, new_pos),
                             Queen(self.board, self.side, new_pos)]
                        for piece in piecesForPromotion:
                            move = Move(self, up_pos)
                            move.promotion = True
                            move.specialMovePiece = piece
                            yield move
                    else:
                        yield Move(self, new_pos,
                                   piece_to_capture=pieceToTake)

        # En pessant
        movements = [C(1, 1), C(-1, 1)] \
            if self.side == WHITE else [C(1, -1), C(-1, -1)]
        for movement in movements:
            posBesidePawn = self.position + C(movement[0], 0)
            if self.board.is_valid_pos(posBesidePawn):
                pieceBesidePawn = self.board.get_piece_at_pos(posBesidePawn)
                lastPieceMoved = self.board.getLastPieceMoved()
                lastMoveWasAdvanceTwo = False
                lastMove = self.board.getLastMove()

                if lastMove:
                    if lastMove.new_pos - lastMove.old_pos == C(0, 2) or \
                       lastMove.new_pos - lastMove.old_pos == C(0, -2):
                        lastMoveWasAdvanceTwo = True

                if pieceBesidePawn and \
                   pieceBesidePawn.stringRep == 'p' and \
                   pieceBesidePawn.side != self.side and \
                   lastPieceMoved is pieceBesidePawn and \
                   lastMoveWasAdvanceTwo:
                    move = Move(self, self.position + movement,
                                piece_to_capture=pieceBesidePawn)
                    move.pessant = True
                    move.specialMovePiece = pieceBesidePawn
                    yield move
コード例 #4
0
ファイル: Pawn.py プロジェクト: DerekDY/THE-KNIGHT
    def getPossibleMoves(self):
        currentPosition = self.position

        # Pawn moves one up
        movement = C(0, 1) if self.side == WHITE else C(0, -1)
        advanceOnePosition = currentPosition + movement
        if self.board.isValidPos(advanceOnePosition):
            #Check if piece at position to move to
            if self.board.pieceAtPosition(advanceOnePosition) is None:
                col = advanceOnePosition[1]
                if col == 7 or col == 0:
                    #print("promotion is happening without a capture")
                    '''
                    piecesForPromotion = \
                        [Rook(self.board, self.side, advanceOnePosition, self.number),      #added self.number to these
                         Knight(self.board, self.side, advanceOnePosition, self.number),
                         Bishop(self.board, self.side, advanceOnePosition, self.number),
                         Queen(self.board, self.side, advanceOnePosition, self.number)]
                    for piece in piecesForPromotion:
                    '''
                    move = Move(self, advanceOnePosition)
                    move.promotion = True
                    move.specialMovePiece = Queen(self.board, self.side, advanceOnePosition, self.number)
                    #print(move.specialMovePiece)
                    #print(move)
                    yield (move)
                else:
                    yield (Move(self, advanceOnePosition))

        # Pawn moves two up
        if self.movesMade == 0:
            movement = C(0, 2) if self.side == WHITE else C(0, -2)
            advanceTwoPosition = currentPosition + movement
            if self.board.isValidPos(advanceTwoPosition):
                if self.board.pieceAtPosition(advanceTwoPosition) is None and \
                   self.board.pieceAtPosition(advanceOnePosition) is None:
                    yield Move(self, advanceTwoPosition)

        # Pawn takes
        movements = [C(1, 1), C(-1, 1)] \
            if self.side == WHITE else [C(1, -1), C(-1, -1)]
        
        # Pawn captures another piece
        for m in movements:
            newPosition = self.position + m
            if self.board.isValidPos(newPosition):
                pieceToTake = self.board.pieceAtPosition(newPosition)
                if pieceToTake and pieceToTake.side != self.side:
                    col = newPosition[1]
                    #print("Piece for pawn to take: ")
                    #print(pieceToTake)
                    #print(pieceToTake.board)
                    
                    # Promotion with a capture
                    if col == 7 or col == 0:
                        #print("promotion is happening with capture")
                        '''
                        piecesForPromotion = \
                            [Knight(self.board, self.side, newPosition, self.number),
                             Rook(self.board, self.side, newPosition, self.number),
                             Bishop(self.board, self.side, newPosition, self.number),
                             Queen(self.board, self.side, newPosition, self.number)]
                        for piece in piecesForPromotion:
                        '''
                        move = Move(self, newPosition, pieceToCapture=pieceToTake)
                        move.promotion = True
                        move.specialMovePiece = Queen(self.board, self.side, newPosition, self.number)
                        #print("reset special move piece")
                        #print(move.specialMovePiece)
                        #print(move)
                        yield (move)
                    else:
                        yield (Move(self, newPosition,
                                   pieceToCapture=pieceToTake))

        # En pessant
        movements = [C(1, 1), C(-1, 1)] \
            if self.side == WHITE else [C(1, -1), C(-1, -1)]
        for movement in movements:
            posBesidePawn = self.position + C(movement[0], 0)
            if self.board.isValidPos(posBesidePawn):
                pieceBesidePawn = self.board.pieceAtPosition(posBesidePawn)
                lastPieceMoved = self.board.getLastPieceMoved()
                lastMoveWasAdvanceTwo = False
                lastMove = self.board.getLastMove()

                if lastMove:
                    if lastMove.newPos - lastMove.oldPos == C(0, 2) or \
                       lastMove.newPos - lastMove.oldPos == C(0, -2):
                        lastMoveWasAdvanceTwo = True

                if pieceBesidePawn and \
                   pieceBesidePawn.stringRep == 'p' and \
                   pieceBesidePawn.side != self.side and \
                   lastPieceMoved is pieceBesidePawn and \
                   lastMoveWasAdvanceTwo:
                    move = Move(self, self.position + movement,
                                pieceToCapture=pieceBesidePawn)
                    move.pessant = True
                    move.specialMovePiece = pieceBesidePawn
                    yield (move)
コード例 #5
0
    def getPossibleMoves(self):
        currentPosition = self.position

        # Pawn moves one up
        movement = C(0, 1) if self.side == WHITE else C(0, -1)
        advanceOnePosition = currentPosition + movement
        if self.board.isValidPos(advanceOnePosition):
            #Promotion moves
            if self.board.pieceAtPosition(advanceOnePosition) is None:
                col = advanceOnePosition[1]
                if col == 7 or col == 0:
                    piecesForPromotion = [
                        Rook(self.board, self.side, advanceOnePosition),
                        Knight(self.board, self.side, advanceOnePosition),
                        Bishop(self.board, self.side, advanceOnePosition),
                        Queen(self.board, self.side, advanceOnePosition)
                    ]
                    for piece in piecesForPromotion:
                        move = Move(self, advanceOnePosition)
                        move.promotion = True
                        move.specialMovePiece = piece
                        yield move
                else:
                    yield Move(self, advanceOnePosition)

        #Pawn moves two up
        if self.movesMade == 0:
            movement = C(0, 2) if self.side == WHITE else C(0, -2)
            advanceTwoPosition = currentPosition + movement
            if self.board.isValidPos(advanceTwoPosition):
                if self.board.pieceAtPosition(
                        advanceTwoPosition
                ) is None and self.board.pieceAtPosition(
                        advanceOnePosition) is None:
                    yield Move(self, advanceTwoPosition)

        #Pawn takes
        movements = [C(1, 1), C(
            -1, 1)] if self.side == WHITE else [C(1, -1), C(-1, -1)]

        for movement in movements:
            newPosition = self.position + movement
            if self.board.isValidPos(newPosition):
                pieceToTake = self.board.pieceAtPosition(newPosition)
                if pieceToTake and pieceToTake.side != self.side:
                    col = newPosition[1]
                    #Promotions
                    if col == 7 or col == 0:
                        piecesForPromotion = [
                            Rook(self.board, self.side, newPosition),
                            Knight(self.board, self.side, newPosition),
                            Bishop(self.board, self.side, newPosition),
                            Queen(self.board, self.side, newPosition)
                        ]
                        for piece in piecesForPromotion:
                            move = Move(self, advanceOnePosition)
                            move.promotion = True
                            move.specialMovePiece = piece
                            yield move
                    else:
                        yield Move(self,
                                   newPosition,
                                   pieceToCapture=pieceToTake)

        #En pessant
        movements = [C(1, 1), C(
            -1, 1)] if self.side == WHITE else [C(1, -1), C(-1, -1)]
        for movement in movements:
            posBesidePawn = self.position + C(movement[0], 0)
            if self.board.isValidPos(posBesidePawn):
                pieceBesidePawn = self.board.pieceAtPosition(posBesidePawn)
                lastPieceMoved = self.board.getLastPieceMoved()
                lastMoveWasAdvanceTwo = False
                lastMove = self.board.getLastMove()

                if lastMove:
                    if lastMove.newPos - lastMove.oldPos == C(
                            0, 2) or lastMove.newPos - lastMove.oldPos == C(
                                0, -2):
                        lastMoveWasAdvanceTwo = True

                if pieceBesidePawn and pieceBesidePawn.stringRep == 'p' and pieceBesidePawn.side != self.side and lastPieceMoved is pieceBesidePawn and lastMoveWasAdvanceTwo:
                    move = Move(self,
                                self.position + movement,
                                pieceToCapture=pieceBesidePawn)
                    move.pessant = True
                    move.specialMovePiece = pieceBesidePawn
                    yield move
コード例 #6
0
ファイル: Pawn.py プロジェクト: AndersJing/command-line-chess
    def getPossibleMoves(self) :
        currentPosition = self.position

        # Pawn moves one up
        movement = C(0, 1) if self.side == WHITE else C(0, -1)
        advanceOnePosition = currentPosition + movement
        if self.board.isValidPos(advanceOnePosition) :
            #Promotion moves
            if self.board.pieceAtPosition(advanceOnePosition) is None :
                col = advanceOnePosition[1]
                if col == 7 or col == 0:
                    piecesForPromotion = [Rook(self.board, self.side, advanceOnePosition), Knight(self.board, self.side, advanceOnePosition), Bishop(self.board, self.side, advanceOnePosition), Queen(self.board, self.side, advanceOnePosition)]
                    for piece in piecesForPromotion :
                        move = Move(self, advanceOnePosition)
                        move.promotion = True
                        move.specialMovePiece = piece
                        yield move
                else :
                    yield Move(self, advanceOnePosition)

        #Pawn moves two up
        if self.movesMade == 0 :
            movement = C(0, 2) if self.side == WHITE else C(0, -2)
            advanceTwoPosition = currentPosition + movement
            if self.board.isValidPos(advanceTwoPosition) :
                if self.board.pieceAtPosition(advanceTwoPosition) is None and self.board.pieceAtPosition(advanceOnePosition) is None:
                    yield Move(self, advanceTwoPosition)

        #Pawn takes
        movements = [C(1,1), C(-1,1)] if self.side == WHITE else [C(1,-1), C(-1,-1)]

        for movement in movements :
            newPosition = self.position + movement
            if self.board.isValidPos(newPosition) :
                pieceToTake = self.board.pieceAtPosition(newPosition)
                if pieceToTake and pieceToTake.side != self.side :
                    col = newPosition[1]
                    #Promotions
                    if col == 7 or col == 0:
                        piecesForPromotion = [Rook(self.board, self.side, newPosition), Knight(self.board, self.side, newPosition), Bishop(self.board, self.side, newPosition), Queen(self.board, self.side, newPosition)]
                        for piece in piecesForPromotion :
                            move = Move(self, advanceOnePosition)
                            move.promotion = True
                            move.specialMovePiece = piece
                            yield move
                    else :
                        yield Move(self, newPosition, pieceToCapture = pieceToTake)

        #En pessant
        movements = [C(1,1), C(-1,1)] if self.side == WHITE else [C(1,-1), C(-1,-1)]
        for movement in movements :
            posBesidePawn = self.position + C(movement[0], 0)
            if self.board.isValidPos(posBesidePawn) :
                pieceBesidePawn = self.board.pieceAtPosition(posBesidePawn)
                lastPieceMoved = self.board.getLastPieceMoved()
                lastMoveWasAdvanceTwo = False
                lastMove = self.board.getLastMove()

                if lastMove :
                    if lastMove.newPos - lastMove.oldPos == C(0,2) or lastMove.newPos - lastMove.oldPos == C(0,-2) :
                        lastMoveWasAdvanceTwo = True


                if pieceBesidePawn and pieceBesidePawn.stringRep == 'p' and pieceBesidePawn.side != self.side and lastPieceMoved is pieceBesidePawn and lastMoveWasAdvanceTwo:
                    move = Move(self, self.position + movement, pieceToCapture = pieceBesidePawn)
                    move.pessant = True
                    move.specialMovePiece = pieceBesidePawn
                    yield move
コード例 #7
0
ファイル: Pawn.py プロジェクト: MysticProgg/mychess
    def getPossibleMoves(self):
        currentPosition = self.position

        # Движение пешки вперед на 1 клетку
        movement = C(0, 1) if self.side == WHITE else C(0, -1)
        advanceOnePosition = currentPosition + movement
        if self.board.isValidPos(advanceOnePosition):
            # Продвижение
            if self.board.pieceAtPosition(advanceOnePosition) is None:
                col = advanceOnePosition[1]
                if col == 7 or col == 0:
                    piecesForPromotion = \
                        [Rook(self.board, self.side, advanceOnePosition),
                         Knight(self.board, self.side, advanceOnePosition),
                         Bishop(self.board, self.side, advanceOnePosition),
                         Queen(self.board, self.side, advanceOnePosition)]
                    for piece in piecesForPromotion:
                        move = Move(self, advanceOnePosition)
                        move.promotion = True
                        move.specialMovePiece = piece
                        yield move
                else:
                    yield Move(self, advanceOnePosition)

        # Пешка ходит вперед на 2 клетки
        if self.movesMade == 0:
            movement = C(0, 2) if self.side == WHITE else C(0, -2)
            advanceTwoPosition = currentPosition + movement
            if self.board.isValidPos(advanceTwoPosition):
                if self.board.pieceAtPosition(advanceTwoPosition) is None and \
                   self.board.pieceAtPosition(advanceOnePosition) is None:
                    yield Move(self, advanceTwoPosition)

        # Пешка ест фигуру противника
        movements = [C(1, 1), C(-1, 1)] \
            if self.side == WHITE else [C(1, -1), C(-1, -1)]

        for movement in movements:
            newPosition = self.position + movement
            if self.board.isValidPos(newPosition):
                pieceToTake = self.board.pieceAtPosition(newPosition)
                if pieceToTake and pieceToTake.side != self.side:
                    col = newPosition[1]
                    # достижения другого конца доски, выбор новой фигуры
                    if col == 7 or col == 0:
                        piecesForPromotion = \
                            [Rook(self.board, self.side, newPosition),
                             Knight(self.board, self.side, newPosition),
                             Bishop(self.board, self.side, newPosition),
                             Queen(self.board, self.side, newPosition)]
                        for piece in piecesForPromotion:
                            move = Move(self, advanceOnePosition)
                            move.promotion = True
                            move.specialMovePiece = piece
                            yield move
                    else:
                        yield Move(self, newPosition,
                                   pieceToCapture=pieceToTake)

        #
        movements = [C(1, 1), C(-1, 1)] \
            if self.side == WHITE else [C(1, -1), C(-1, -1)]
        for movement in movements:
            posBesidePawn = self.position + C(movement[0], 0)
            if self.board.isValidPos(posBesidePawn):
                pieceBesidePawn = self.board.pieceAtPosition(posBesidePawn)
                lastPieceMoved = self.board.getLastPieceMoved()
                lastMoveWasAdvanceTwo = False
                lastMove = self.board.getLastMove()

                if lastMove:
                    if lastMove.newPos - lastMove.oldPos == C(0, 2) or \
                       lastMove.newPos - lastMove.oldPos == C(0, -2):
                        lastMoveWasAdvanceTwo = True

                if pieceBesidePawn and \
                   pieceBesidePawn.stringRep == 'p' and \
                   pieceBesidePawn.side != self.side and \
                   lastPieceMoved is pieceBesidePawn and \
                   lastMoveWasAdvanceTwo:
                    move = Move(self, self.position + movement,
                                pieceToCapture=pieceBesidePawn)
                    move.pessant = True
                    move.specialMovePiece = pieceBesidePawn
                    yield move
コード例 #8
0
    def getPossibleMoves(self):
        # Function run to yield a group of all possible legal and illegal
        # 'Move' objects to the calling function. Does this by running through
        # a list of movements and testing for valid moves before yielding them.
        # Also goes through another special algorithm to test if it can also
        # perform another special type of move, a 'castle'.
        pos = self.position
        movements = [
            C(0, 1),
            C(-1, -1),
            C(1, 0),
            C(-1, 0),
            C(1, 1),
            C(1, -1),
            C(-1, 1),
            C(0, -1)
        ]
        for movement in movements:
            newPos = pos + movement
            if self.board.isValidPos(newPos):
                pieceAtNewPos = self.board.pieceAtPosition(newPos)
                if self.board.pieceAtPosition(newPos) is None:
                    yield Move(self, newPos)
                elif pieceAtNewPos.side != self.side:
                    yield Move(self, newPos, pieceToCapture=pieceAtNewPos)

        if self.movesMade == 0:  # CASTLING, HIGHLY WIP
            inCheck = False
            kingSideCastleBlocked = False
            queenSideCastleBlocked = False
            kingSideCastleCheck = False
            queenSideCastleCheck = False
            kingSideRookMoved = True
            queenSideRookMoved = True

            kingSideCastlePositions = [
                self.position - C(1, 0), self.position - C(2, 0)
            ]
            for position in kingSideCastlePositions:
                if self.board.pieceAtPosition(position):
                    kingSideCastleBlocked = True

            queenSideCastlePositions = [
                self.position + C(1, 0), self.position + C(2, 0),
                self.position + C(3, 0)
            ]
            for position in queenSideCastlePositions:
                if self.board.pieceAtPosition(position):
                    queenSideCastleBlocked = True

            if kingSideCastleBlocked and queenSideCastleBlocked:
                return

            opponentMoves = self.board.getAllMovesUnfiltered(not self.side,
                                                             includeKing=False)

            for move in opponentMoves:
                if move.newPos == self.position:
                    inCheck = True
                    break
                if move.newPos == self.position - C(1, 0) or \
                        move.newPos == self.position - C(2, 0):
                    kingSideCastleCheck = True
                if move.newPos == self.position + C(1, 0) or \
                        move.newPos == self.position + C(2, 0):
                    queenSideCastleCheck = True

            kingSideRookPos = self.position - C(3, 0)
            kingSideRook = self.board.pieceAtPosition(kingSideRookPos) \
                if self.board.isValidPos(kingSideRookPos) else None
            if kingSideRook and \
                    kingSideRook.stringRep == 'R' and \
                    kingSideRook.movesMade == 0:
                kingSideRookMoved = False

            queenSideRookPos = self.position + C(4, 0)
            queenSideRook = self.board.pieceAtPosition(queenSideRookPos) \
                if self.board.isValidPos(kingSideRookPos) else None
            if queenSideRook and \
                    queenSideRook.stringRep == 'R' and \
                    queenSideRook.movesMade == 0:
                queenSideRookMoved = False

            if not inCheck:
                if not kingSideCastleBlocked and \
                        not kingSideCastleCheck and \
                        not kingSideRookMoved:
                    move = Move(self, self.position - C(2, 0))
                    move.specialMovePiece = self.board.pieceAtPosition(
                        kingSideRookPos)
                    rookMove = Move(move.specialMovePiece,
                                    self.position - C(1, 0))
                    move.kingSideCastle = True
                    move.rookMove = rookMove
                    move.castle = True
                    yield move
                if not queenSideCastleBlocked and \
                        not queenSideCastleCheck and \
                        not queenSideRookMoved:
                    move = Move(self, self.position + C(2, 0))
                    move.specialMovePiece = self.board.pieceAtPosition(
                        queenSideRookPos)
                    rookMove = Move(move.specialMovePiece,
                                    self.position + C(1, 0))
                    move.queenSideCastle = True
                    move.rookMove = rookMove
                    move.castle = True
                    yield move