Exemplo n.º 1
0
        /*
         * East                Sout                 SoEa                SoWe
         * . . . . . . . .     . . . . . . . .      . . . . . . . .     . . . . . . . .
         * . . . . . . . .     . . . . . . . .      . . . . . . . .     . . . . . . . .
         * . . . . . . . .     . . . . . . . .      . . . . . . . .     . . . . . . . .
         * . . . . . . . .     . . . . . . . .      . . . . . . . .     . . . . . . . .
         * . . . R 1 1 1 1     . . . R . . . .      . . . B . . . .     . . . B . . . .
         * . . . . . . . .     . . . 1 . . . .      . . . . 1 . . .     . . 1 . . . . .
         * . . . . . . . .     . . . 1 . . . .      . . . . . 1 . .     . 1 . . . . . .
         * . . . . . . . .     . . . 1 . . . .      . . . . . . 1 .     1 . . . . . . .
         */
        private static UInt64 getPositiveRayAttacks(UInt64 occupied, int rayDir, byte square)
        {
            UInt64 attacks = rayAttacks[rayDir, square];
            UInt64 blocker = attacks & occupied;

            if (blocker != 0UL)
            {
                square   = BitOps.bitScanForward(blocker);
                attacks ^= rayAttacks[rayDir, square];
            }
            return(attacks);
        }
Exemplo n.º 2
0
        internal static UInt64 GetAllTargets(UInt64 king, bool pieceColor, Board board)
        {
            UInt64 kingMoves = KingAttacks[(BitOps.bitScanForward(king))];

            //Cannot castle if already castled or is in check
            UInt64 empty;

            if (pieceColor && !board.playerHasCastled && !board.isCheck)
            {
                empty = board.GetEmptySquares();
                //Right castle
                if (BitOps.IsBitSet(empty, 61) && BitOps.IsBitSet(empty, 62) && BitOps.IsBitSet(board.WR, 63))
                {
                    kingMoves |= (1UL << 62);
                }
                //Left castle
                else if (BitOps.IsBitSet(empty, 59) && BitOps.IsBitSet(empty, 58) && BitOps.IsBitSet(empty, 57) && BitOps.IsBitSet(board.WR, 56))
                {
                    kingMoves |= (1UL << 58);
                }
            }
            else if (!pieceColor && !board.computerHasCastled && !board.isCheck)
            {
                empty = board.GetEmptySquares();
                //Right castle
                if (BitOps.IsBitSet(empty, 5) && BitOps.IsBitSet(empty, 6) && BitOps.IsBitSet(board.BR, 7))
                {
                    kingMoves |= (1UL << 6);
                }
                //Left castle
                else if (BitOps.IsBitSet(empty, 3) && BitOps.IsBitSet(empty, 2) && BitOps.IsBitSet(empty, 1) && BitOps.IsBitSet(board.BR, 0))
                {
                    kingMoves |= (1UL << 2);
                }
            }

            return(kingMoves & ~board.GetColorPieces(pieceColor));
        }