Esempio n. 1
0
 public static int getFirstLegalMove(string moves, ulong WP, ulong WN, ulong WB, ulong WR, ulong WQ, ulong WK, ulong BP, ulong BN, ulong BB, ulong BR, ulong BQ, ulong BK, ulong EP, bool CWK, bool CWQ, bool CBK, bool CBQ, bool WhiteToMove)
 {
     for (int i = 0; i < moves.Length; i += 4)
     {
         ulong WPt = Moves.makeMove(WP, moves.Substring(i, 4), 'P'), WNt = Moves.makeMove(WN, moves.Substring(i, 4), 'N'),
               WBt = Moves.makeMove(WB, moves.Substring(i, 4), 'B'), WRt = Moves.makeMove(WR, moves.Substring(i, 4), 'R'),
               WQt = Moves.makeMove(WQ, moves.Substring(i, 4), 'Q'), WKt = Moves.makeMove(WK, moves.Substring(i, 4), 'K'),
               BPt = Moves.makeMove(BP, moves.Substring(i, 4), 'p'), BNt = Moves.makeMove(BN, moves.Substring(i, 4), 'n'),
               BBt = Moves.makeMove(BB, moves.Substring(i, 4), 'b'), BRt = Moves.makeMove(BR, moves.Substring(i, 4), 'r'),
               BQt = Moves.makeMove(BQ, moves.Substring(i, 4), 'q'), BKt = Moves.makeMove(BK, moves.Substring(i, 4), 'k');
         WRt = Moves.makeMoveCastle(WRt, WK | BK, moves.Substring(i, 4), 'R');
         BRt = Moves.makeMoveCastle(BRt, WK | BK, moves.Substring(i, 4), 'r');
         if (((WKt & Moves.unSafeForWhite(WPt, WNt, WBt, WRt, WQt, WKt, BPt, BNt, BBt, BRt, BQt, BKt)) == 0 && WhiteToMove) ||
             ((BKt & Moves.unSafeForBlack(WPt, WNt, WBt, WRt, WQt, WKt, BPt, BNt, BBt, BRt, BQt, BKt)) == 0 && !WhiteToMove))
         {
             return(i);
         }
     }
     return(-1);
 }
Esempio n. 2
0
        public static void perft(ulong WP, ulong WN, ulong WB, ulong WR, ulong WQ, ulong WK, ulong BP, ulong BN, ulong BB, ulong BR, ulong BQ, ulong BK, ulong EP, bool CWK, bool CWQ, bool CBK, bool CBQ, bool WhiteToMove, int depth)
        {
            if (depth < perftMaxDepth)
            {
                string moves;
                if (WhiteToMove)
                {
                    moves = Moves.possibleMovesW(WP, WN, WB, WR, WQ, WK, BP, BN, BB, BR, BQ, BK, EP, CWK, CWQ, CBK, CBQ);
                }
                else
                {
                    moves = Moves.possibleMovesB(WP, WN, WB, WR, WQ, WK, BP, BN, BB, BR, BQ, BK, EP, CWK, CWQ, CBK, CBQ);
                }
                for (int i = 0; i < moves.Length; i += 4)
                {
                    ulong WPt = Moves.makeMove(WP, moves.Substring(i, 4), 'P'), WNt = Moves.makeMove(WN, moves.Substring(i, 4), 'N'),
                          WBt = Moves.makeMove(WB, moves.Substring(i, 4), 'B'), WRt = Moves.makeMove(WR, moves.Substring(i, 4), 'R'),
                          WQt = Moves.makeMove(WQ, moves.Substring(i, 4), 'Q'), WKt = Moves.makeMove(WK, moves.Substring(i, 4), 'K'),
                          BPt = Moves.makeMove(BP, moves.Substring(i, 4), 'p'), BNt = Moves.makeMove(BN, moves.Substring(i, 4), 'n'),
                          BBt = Moves.makeMove(BB, moves.Substring(i, 4), 'b'), BRt = Moves.makeMove(BR, moves.Substring(i, 4), 'r'),
                          BQt = Moves.makeMove(BQ, moves.Substring(i, 4), 'q'), BKt = Moves.makeMove(BK, moves.Substring(i, 4), 'k'),
                          EPt = Moves.makeMoveEP(WP | BP, moves.Substring(i, 4));
                    WRt = Moves.makeMoveCastle(WRt, WK | BK, moves.Substring(i, 4), 'R');
                    BRt = Moves.makeMoveCastle(BRt, WK | BK, moves.Substring(i, 4), 'r');
                    bool CWKt = CWK, CWQt = CWQ, CBKt = CBK, CBQt = CBQ;
                    if (char.IsDigit(moves[i + 3]))
                    {//'regular' move
                        int start = (int)(char.GetNumericValue(moves[i]) * 8) + (int)(char.GetNumericValue(moves[i + 1]));

                        /*if (((1ul<<start)&(WP|BP))!=0) {
                         *  if (Math.abs(moves[i)-moves[i+2))==2) {
                         *      EPt=Moves.FileMasks8[moves[i+1)-'0'];
                         *  }
                         * }
                         * else */
                        if (((1ul << start) & WK) != 0)
                        {
                            CWKt = false; CWQt = false;
                        }
                        else if (((1ul << start) & BK) != 0)
                        {
                            CBKt = false; CBQt = false;
                        }
                        else if (((1ul << start) & WR & (1ul << 63)) != 0)
                        {
                            CWKt = false;
                        }
                        else if (((1ul << start) & WR & (1ul << 56)) != 0)
                        {
                            CWQt = false;
                        }
                        else if (((1ul << start) & BR & (1ul << 7)) != 0)
                        {
                            CBKt = false;
                        }
                        else if (((1ul << start) & BR & 1ul) != 0)
                        {
                            CBQt = false;
                        }
                    }
                    if (((WKt & Moves.unSafeForWhite(WPt, WNt, WBt, WRt, WQt, WKt, BPt, BNt, BBt, BRt, BQt, BKt)) == 0 && WhiteToMove) ||
                        ((BKt & Moves.unSafeForBlack(WPt, WNt, WBt, WRt, WQt, WKt, BPt, BNt, BBt, BRt, BQt, BKt)) == 0 && !WhiteToMove))
                    {
                        if (depth + 1 == perftMaxDepth)
                        {
                            perftMoveCounter++;
                        }
                        perft(WPt, WNt, WBt, WRt, WQt, WKt, BPt, BNt, BBt, BRt, BQt, BKt, EPt, CWKt, CWQt, CBKt, CBQt, !WhiteToMove, depth + 1);
                    }
                }
            }
        }