Пример #1
0
    // update castling state
    public void UpdateCastlingState( ChessMover.sMove move )
    {
        // possible castling condition
        //1.The king has not previously moved.
        //2.The chosen rook has not previously moved.
        //3.There are no pieces between the king and the chosen rook.
        //4.The king is not currently in check.
        //5.The king does not pass through a square that is under attack by enemy pieces.[2]
        //6.The king does not end up in check (true of any legal move).

        // 1 and 2 case, disable castling state
        switch( move.srcSquare.piece.piecePlayerType )
        {
            case PiecePlayerType.eWhite_King:
            {
                currCastlingState.CastlingWKSide = CastlingState.eCastling_Disable_State;
                currCastlingState.CastlingWQSide = CastlingState.eCastling_Disable_State;
            }
            break;

            case PiecePlayerType.eWhite_RookLeft:
            {
                currCastlingState.CastlingWQSide = CastlingState.eCastling_Disable_State;
            }
            break;

            case PiecePlayerType.eWhite_RookRight:
            {
                currCastlingState.CastlingWKSide = CastlingState.eCastling_Disable_State;
            }
            break;

            case PiecePlayerType.eBlack_King:
            {
                currCastlingState.CastlingBKSide = CastlingState.eCastling_Disable_State;
                currCastlingState.CastlingBQSide = CastlingState.eCastling_Disable_State;
            }
            break;

            case PiecePlayerType.eBlack_RookLeft:
            {
                currCastlingState.CastlingBQSide = CastlingState.eCastling_Disable_State;
            }
            break;

            case PiecePlayerType.eBlack_RookRight:
            {
                currCastlingState.CastlingBKSide = CastlingState.eCastling_Disable_State;
            }
            break;
        }

        int nWhiteKingSquare = 4;
        int nWhiteKSideRookSquare = 7;
        int nWhiteQSideRookSquare = 0;

        int nBlackKingSquare = 60;
        int nBlackKSideRookSquare = 63;
        int nBlackQSideRookSquare = 56;

        // white king side check
        if( currCastlingState.CastlingWKSide != CastlingState.eCastling_Disable_State )
        {
            // 3, 4, 5 case
            if( IsWKSideCastlingRangeBlank() == false || IsWhiteKingInCheck() ||
                IsRangeNoneAttackBySquare( nWhiteKingSquare, nWhiteKSideRookSquare, BlackPBB ) == false )	{

                currCastlingState.CastlingWKSide = CastlingState.eCastling_Temporary_Disable_State;
                //UnityEngine.Debug.LogError( "ChessBitBoard::UpdateCastlingState() - CastlingWKSide disabled" );
            }
            else {

                currCastlingState.CastlingWKSide = CastlingState.eCastling_Enable_State;
                //UnityEngine.Debug.LogError( "ChessBitBoard::UpdateCastlingState() - CastlingWKSide enabled" );
            }
        }

        // white queen side check
        if( currCastlingState.CastlingWQSide != CastlingState.eCastling_Disable_State )
        {
            // 3 case
            if( IsWQSideCastlingRangeBlank() == false || IsWhiteKingInCheck() ||
                IsRangeNoneAttackBySquare( nWhiteKingSquare, nWhiteQSideRookSquare, BlackPBB ) == false ) {

                currCastlingState.CastlingWQSide = CastlingState.eCastling_Temporary_Disable_State;
                //UnityEngine.Debug.LogError( "ChessBitBoard::UpdateCastlingState() - CastlingWQSide disabled" );
            }
            else {

                currCastlingState.CastlingWQSide = CastlingState.eCastling_Enable_State;
                //UnityEngine.Debug.LogError( "ChessBitBoard::UpdateCastlingState() - CastlingWQSide enabled" );
            }
        }

        // black king side check
        if( currCastlingState.CastlingBKSide != CastlingState.eCastling_Disable_State )
        {
            // 3 case
            if( IsBKSideCastlingRangeBlank() == false || IsBlackKingInCheck() ||
                IsRangeNoneAttackBySquare( nBlackKingSquare, nBlackKSideRookSquare, WhitePBB ) == false ) {

                currCastlingState.CastlingBKSide = CastlingState.eCastling_Temporary_Disable_State;
            }
            else {

                currCastlingState.CastlingBKSide = CastlingState.eCastling_Enable_State;
            }
        }

        // black queen side	check
        if( currCastlingState.CastlingBQSide != CastlingState.eCastling_Disable_State )
        {
            // 3 case
            if( IsBQSideCastlingRangeBlank() == false || IsBlackKingInCheck() ||
                IsRangeNoneAttackBySquare( nBlackKingSquare, nBlackQSideRookSquare, WhitePBB ) == false ) {

                currCastlingState.CastlingBQSide = CastlingState.eCastling_Temporary_Disable_State;
            }
            else {

                currCastlingState.CastlingBQSide = CastlingState.eCastling_Enable_State;
            }
        }
    }
Пример #2
0
    public void MoveUpdate( ChessMover.sMove move )
    {
        bool bWillEnpassantInit = true;

        int nSrcPlayerSide, nSrcPieceBBIndex, nSrcSq, nTrgSq;
        nSrcPlayerSide = (int)move.srcSquare.piece.playerSide;
        nSrcPieceBBIndex = (int)move.srcSquare.piece.pieceType * 2 + 2 + nSrcPlayerSide;
        nSrcSq = (int)move.srcSquare.position.pos;
        nTrgSq = (int)move.trgSquare.position.pos;

        ulong ulSrcSqBB = (ulong)1 << nSrcSq;
        ulong ulTrgSqBB = (ulong)1 << nTrgSq;

        // normal move
        if( ChessMover.IsNormalMove( move.moveType ) ) {

            // pawn move
            if( ChessMover.IsPawnMove( move.moveType ) ) {

                // promote move
                if( ChessMover.IsPromoteMove( move.moveType ) ) {

                }
                // one/two move
                else  {

                    // normal one square move
                    if( ChessMover.IsPawnOneMove( move.moveType ) ) {

                    }
                    // two square move
                    else if( ChessMover.IsPawnTwoMove( move.moveType ) ) {

                        // en passant target square update
                        // if enemy pawn exist in east/west square, set enpassant target square
                        if( ((EastOne(ulTrgSqBB) & pieceBB[WhitePawnPBB + 1 - nSrcPlayerSide]) > 0) ||
                            ((WestOne(ulTrgSqBB) & pieceBB[WhitePawnPBB + 1 - nSrcPlayerSide]) > 0) ) {

                            currEnPassantTrgSq.enpassantCapturSqBB = ulTrgSqBB;
                            bWillEnpassantInit = false;
                        }
                    }
                }
            }

            // update piece bb for normal move
            MoveUpdatePieceBB( nSrcPlayerSide, nSrcPieceBBIndex, ulSrcSqBB, ulTrgSqBB );
        }
        // capture move
        else if( ChessMover.IsCaptureMove( move.moveType ) ) {

            int nTrgPlayerSide, nTrgPieceBBIndex;
            nTrgPlayerSide = (int)move.trgSquare.piece.playerSide;
            nTrgPieceBBIndex = (int)move.trgSquare.piece.pieceType * 2 + 2 + nTrgPlayerSide;

            // pawn move
            if( ChessMover.IsPawnMove( move.moveType ) ) {

                // promote move
                if( ChessMover.IsPromoteMove( move.moveType ) ) {

                }
            }

            // update piece bb for Capture
            CaptureUpdatePieceBB( nSrcPlayerSide, nSrcPieceBBIndex, nTrgPlayerSide, nTrgPieceBBIndex, ulSrcSqBB, ulTrgSqBB );
        }
        // enpassantmove
        else if( ChessMover.IsEnpassantMove( move.moveType ) ) {

            ulong ulCaptureSqBB = 0;
            int nCapturePlayerSide, nCapurePieceBBIndex;
            nCapturePlayerSide = 1 - (int)move.srcSquare.piece.playerSide;
            nCapurePieceBBIndex = (int)PieceType.e_Pawn * 2 + 2 + nCapturePlayerSide;
            if( nSrcPlayerSide == WhitePBB )
                ulCaptureSqBB = SoutOne(ulSrcSqBB);
            else
                ulCaptureSqBB = NortOne(ulSrcSqBB);

            // update piece bb for en passant capture move
            EnpassantCaptureUpdatePieceBB( nSrcPlayerSide, nSrcPieceBBIndex, nCapturePlayerSide, nCapurePieceBBIndex, ulSrcSqBB, ulTrgSqBB, ulCaptureSqBB );
        }
        // castling move
        else if( ChessMover.IsCastlingMove( move.moveType ) ) {

            // update piece bb for castling move
            // king move
            MoveUpdatePieceBB( nSrcPlayerSide, nSrcPieceBBIndex, ulSrcSqBB, ulTrgSqBB );

            // rook move
            ulong ulRookSrcSqBB = 0, ulRookTrgSqBB = 0;
            int nRookSrcPieceBBIndex, nRookSrcSq, nRookTrgSq;
            nRookSrcPieceBBIndex = (int)PieceType.e_Rook * 2 + 2 + nSrcPlayerSide;
            if( ChessMover.IsWhiteKingSideCastlingMove( move.moveType ) ||
                ChessMover.IsBlackKingSideCastlingMove( move.moveType ) ) {

                nRookSrcSq = nSrcPlayerSide == WhitePBB ? 7 : 63;
                ulRookSrcSqBB = (ulong)1 << nRookSrcSq;
                nRookTrgSq = nRookSrcSq - 2;
                ulRookTrgSqBB = (ulong)1 << nRookTrgSq;
            }
            else if( ChessMover.IsWhiteQueenSideCastlingMove( move.moveType ) ||
                     ChessMover.IsBlackQueenSideCastlingMove( move.moveType ) ) {

                nRookSrcSq = nSrcPlayerSide == WhitePBB ? 0 : 56;
                ulRookSrcSqBB = (ulong)1 << nRookSrcSq;
                nRookTrgSq = nRookSrcSq + 3;
                ulRookTrgSqBB = (ulong)1 << nRookTrgSq;
            }

            MoveUpdatePieceBB( nSrcPlayerSide, nRookSrcPieceBBIndex, ulRookSrcSqBB, ulRookTrgSqBB );
        }

        // en passant target square init
        if( bWillEnpassantInit )
            currEnPassantTrgSq.enpassantCapturSqBB = 0;

        UpdateCastlingState( move );
    }
Пример #3
0
    bool IsValidAIMove( ChessBoardSquare srcSquare, ChessBoardSquare trgSquare, List<ChessMover.sMove> listMove, ChessMover.sMove aiMove )
    {
        foreach( ChessMover.sMove move in listMove ) {

            if( move.srcSquare == srcSquare && move.trgSquare == trgSquare ) {

                aiMove.Set( move );
                return true;
            }
        }

        aiMove.Clear();
        return false;
    }
Пример #4
0
    bool IsValidMove( ChessBoardSquare srcSquare, ChessBoardSquare trgSquare, ChessMover.sMove userMove )
    {
        foreach( ChessMover.sMove move in listCurrMovable ) {

            if( move.srcSquare == srcSquare && move.trgSquare == trgSquare ) {

                userMove.Set( move );
                return true;
            }
        }

        userMove.Clear();
        return false;
    }
Пример #5
0
    public void MoveUpdate( ChessMover.sMove move )
    {
        if( move.srcSquare.piece.playerSide == PlayerSide.e_White )
            listWhiteMoveHistory.Add( move );
        else if( move.srcSquare.piece.playerSide == PlayerSide.e_Black )
            listBlackMoveHistory.Add( move );

        // bit board update
        bitBoard.MoveUpdate( move );

        // normal move
        if( ChessMover.IsNormalMove( move.moveType ) ) {

            // promote move
            if( ChessMover.IsPromoteMove( move.moveType ) ) {

                //UnityEngine.Debug.LogError( "ChessBoard::MoveUpdate() - Normal Move(promote)" );
                move.trgSquare.SetPiece( move.srcSquare.piece );
                move.srcSquare.ClearPiece();

                // show promte gui
                //GUIManager.Instance.ShowPanelElement( "MainGameUI", "MainGamePanel", "PromotePopupMenu", true );
            }
            else {

                //UnityEngine.Debug.LogError( "ChessBoard::MoveUpdate() - Normal Move" );
                move.trgSquare.SetPiece( move.srcSquare.piece );
                move.srcSquare.ClearPiece();
            }
        }
        // capture move
        else if( ChessMover.IsCaptureMove( move.moveType ) ) {

            // promote move
            if( ChessMover.IsPromoteMove( move.moveType ) ) {

                //UnityEngine.Debug.LogError( "ChessBoard::MoveUpdate() - Capture Move(promote)" );
                CaptureSquare( move.trgSquare );

                move.trgSquare.SetPiece( move.srcSquare.piece );
                move.srcSquare.ClearPiece();

                //GUIManager.Instance.ShowPanelElement( "MainGameUI", "MainGamePanel", "PromotePopupMenu", true );
            }
            else {

                //UnityEngine.Debug.LogError( "ChessBoard::MoveUpdate() - Capture Move" );

                CaptureSquare( move.trgSquare );

                move.trgSquare.SetPiece( move.srcSquare.piece );
                move.srcSquare.ClearPiece();
            }
        }

        // enpassantmove
        if( ChessMover.IsEnpassantMove( move.moveType ) ) {

            //UnityEngine.Debug.LogError( "ChessBoard::MoveUpdate() - en passant move" );

            move.trgSquare.SetPiece( move.srcSquare.piece );
            move.srcSquare.ClearPiece();

            // remove captured pawn
            CaptureSquare( move.capturedSquare );
        }

        // castling move
        if( ChessMover.IsCastlingMove( move.moveType ) ) {

            //UnityEngine.Debug.LogError( "ChessBoard::MoveUpdate() - castling move" );

            int nDestRookRank = 0, nDestRookPile = 0;
            nDestRookRank = move.trgSquare.position.nRank;
            nDestRookPile = move.trgSquare.position.nPile;
            // white king side castling
            if( ChessMover.IsWhiteKingSideCastlingMove( move.moveType ) ) {

                ChessBoardSquare rookSquare = aBoardSquare[0,7];
                nDestRookRank = nDestRookRank - 1;
                aBoardSquare[nDestRookPile, nDestRookRank].SetPiece( rookSquare.piece );
                rookSquare.ClearPiece();
            }

            // white Queen side castling
            if( ChessMover.IsWhiteQueenSideCastlingMove( move.moveType ) ) {

                ChessBoardSquare rookSquare = aBoardSquare[0,0];
                nDestRookRank = nDestRookRank + 1;
                aBoardSquare[nDestRookPile, nDestRookRank].SetPiece( rookSquare.piece );
                rookSquare.ClearPiece();
            }

            // black king side castling
            if( ChessMover.IsBlackKingSideCastlingMove( move.moveType ) ) {

                ChessBoardSquare rookSquare = aBoardSquare[7, 7];
                nDestRookRank = nDestRookRank - 1;
                aBoardSquare[nDestRookPile, nDestRookRank].SetPiece( rookSquare.piece );
                rookSquare.ClearPiece();
            }

            // black queen side castling
            if( ChessMover.IsBlackQueenSideCastlingMove( move.moveType ) ) {

                ChessBoardSquare rookSquare = aBoardSquare[7, 0];
                nDestRookRank = nDestRookRank + 1;
                aBoardSquare[nDestRookPile, nDestRookRank].SetPiece( rookSquare.piece );
                rookSquare.ClearPiece();
            }

            move.trgSquare.SetPiece( move.srcSquare.piece );
            move.srcSquare.ClearPiece();
        }

        UpdateMoveCount();

        // for debugging
        if( bitBoard.CheckPositionSync( this ) == false ) {

            UnityEngine.Debug.LogError( "ChessBoard::MoveUpdate() - Position Sync Broken!!!!!!!!" );
        }

        UpdateMoveFinalize();
    }