예제 #1
0
    public KPKPosition(uint idx)
    {
        wksq   = Square((idx >> 0) & 0x3F);
        bksq   = Square((idx >> 6) & 0x3F);
        us     = Color((idx >> 12) & 0x01);
        psq    = GlobalMembersTypes.make_square(File((idx >> 13) & 0x3), Rank.RANK_7 - Rank((idx >> 15) & 0x7));
        result = Result.UNKNOWN;

        // Check if two pieces are on the same square or if a king can be captured
        if (GlobalMembersBitboard.distance(wksq, bksq) <= 1 || wksq == psq || bksq == psq || (us == Color.WHITE && (StepAttacksBB[(int)PieceType.PAWN][(int)psq] & (int)bksq)))
        {
            result = Result.INVALID;
        }

        else if (us == Color.WHITE)
        {
            // Immediate win if a pawn can be promoted without getting captured
            if (GlobalMembersTypes.rank_of(psq) == Rank.RANK_7 && wksq != psq + Square.DELTA_N && (GlobalMembersBitboard.distance(bksq, psq + Square.DELTA_N) > 1 || (StepAttacksBB[(int)PieceType.KING][(int)wksq] & (psq + Square.DELTA_N))))
            {
                result = Result.WIN;
            }
        }
        // Immediate draw if it is a stalemate or a king captures undefended pawn
        else if (!(StepAttacksBB[(int)PieceType.KING][(int)bksq] & ~(StepAttacksBB[(int)PieceType.KING][(int)wksq] | StepAttacksBB[(int)PieceType.PAWN][(int)psq])) || (StepAttacksBB[(int)PieceType.KING][(int)bksq] & (int)psq & ~StepAttacksBB[(int)PieceType.KING][(int)wksq]))
        {
            result = Result.DRAW;
        }
    }
예제 #2
0
    public void init()
    {
        for (Square s = Square.SQ_A1; s <= Square.SQ_H8; ++s)
        {
            SquareBB[(int)s] = 1UL << s;
            BSFTable[GlobalMembersBitboard.bsf_index(SquareBB[(int)s])] = s;
        }

        for (uint long b = 1; b < 256; ++b)
        {
            MS1BTable[b] = GlobalMembersBitboard.more_than_one(b) ? MS1BTable[b - 1] : GlobalMembersBitboard.lsb(b);
        }

        for (File f = File.FILE_A; f <= File.FILE_H; ++f)
        {
            FileBB[(int)f] = f > ((int)File.FILE_A) != 0 ? FileBB[(int)f - 1] << 1 : FileABB;
        }

        for (Rank r = Rank.RANK_1; r <= Rank.RANK_8; ++r)
        {
            RankBB[(int)r] = r > ((int)Rank.RANK_1) != 0 ? RankBB[(int)r - 1] << 8 : Rank1BB;
        }

        for (File f = File.FILE_A; f <= File.FILE_H; ++f)
        {
            AdjacentFilesBB[(int)f] = (f > ((int)File.FILE_A) != 0 ? FileBB[(int)f - 1] : 0) | (f < ((int)File.FILE_H) != 0 ? FileBB[(int)f + 1] : 0);
        }

        for (Rank r = Rank.RANK_1; r < Rank.RANK_8; ++r)
        {
            InFrontBB[(int)Color.WHITE][(int)r] = ~(InFrontBB[(int)Color.BLACK][(int)r + 1] = InFrontBB[(int)Color.BLACK][(int)r] | RankBB[(int)r]);
        }

        for (Color c = Color.WHITE; c <= Color.BLACK; ++c)
        {
            for (Square s = Square.SQ_A1; s <= Square.SQ_H8; ++s)
            {
                ForwardBB[(int)c][(int)s]      = InFrontBB[(int)c][(int)GlobalMembersTypes.rank_of(s)] & FileBB[(int)GlobalMembersTypes.file_of(s)];
                PawnAttackSpan[(int)c][(int)s] = InFrontBB[(int)c][(int)GlobalMembersTypes.rank_of(s)] & AdjacentFilesBB[(int)GlobalMembersTypes.file_of(s)];
                PassedPawnMask[(int)c][(int)s] = ForwardBB[(int)c][(int)s] | PawnAttackSpan[(int)c][(int)s];
            }
        }

        for (Square s1 = Square.SQ_A1; s1 <= Square.SQ_H8; ++s1)
        {
            for (Square s2 = Square.SQ_A1; s2 <= Square.SQ_H8; ++s2)
            {
                if (s1 != s2)
                {
                    SquareDistance[(int)s1, (int)s2] = Math.Max(GlobalMembersBitboard.distance <File>(s1, s2), GlobalMembersBitboard.distance <Rank>(s1, s2));
                    DistanceRingBB[(int)s1][SquareDistance[(int)s1, (int)s2] - 1] |= s2;
                }
            }
        }

        int[,] steps = { {, 0, 0, 0, 0, 0, 0, 0, 0 }, { 7, 9, 0, 0, 0, 0, 0, 0, 0 }, { 17, 15, 10, 6, -6, -10, -15, -17, 0 }, {, 0, 0, 0, 0, 0, 0, 0, 0 }, {, 0, 0, 0, 0, 0, 0, 0, 0 }, {, 0, 0, 0, 0, 0, 0, 0, 0 }, { 9, 7, -7, -9, 8, 1, -1, -8, 0 } };