Exemplo n.º 1
0
        public static void Perft(int depth, ref boardStruct brett)
        {
            Debug.Assert(board.CheckBoard(ref brett));

            if (depth == 0)
            {
                leafNodes++;
                return;
            }

            movelist list = new movelist();

            movegen.GenerateAllMoves(ref list, ref brett);

            int MoveNum = 0;

            for (MoveNum = 0; MoveNum < list.anzahlZüge; ++MoveNum)
            {
                if (!makemove.MakeMove(list.zugliste[MoveNum].Zug, ref brett))
                {
                    continue;
                }
                Perft(depth - 1, ref brett);
                makemove.TakeMove(ref brett);
            }

            return;
        }
Exemplo n.º 2
0
        public static void PerftTest(int depth, ref movelist list, ref boardStruct brett)
        {
            Debug.Assert(board.CheckBoard(ref brett));

            Console.Write("\nStarting Test To Depth:" + depth + "\n");
            leafNodes = 0;
            Stopwatch timer = new Stopwatch();

            timer.Start();
            movegen.GenerateAllMoves(ref list, ref brett);

            int move;
            int MoveNum = 0;

            for (MoveNum = 0; MoveNum < list.anzahlZüge; ++MoveNum)
            {
                move = list.zugliste[MoveNum].Zug;
                if (!makemove.MakeMove(move, ref brett))
                {
                    continue;
                }
                long newnodes = leafNodes;
                Perft(depth - 1, ref brett);
                makemove.TakeMove(ref brett);
                long oldnodes = leafNodes - newnodes;
                Console.Write(String.Format("move {0} : {1} : {2}\n", MoveNum + 1, io.PrMove(move), oldnodes));
            }

            timer.Stop();
            Console.Write(String.Format("\nTest Complete : {0} nodes visited in {1}ms\n", leafNodes, timer.ElapsedMilliseconds));
        }
Exemplo n.º 3
0
        static void Main(string[] args)
        {
            Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(2);
            Process.GetCurrentProcess().PriorityClass     = ProcessPriorityClass.High;
            Thread.CurrentThread.Priority = ThreadPriority.Highest;


            boardStruct brett = new boardStruct();
            movelist    list  = new movelist();
            suchInfo    info  = new suchInfo();

            init.AllInit(ref brett);

            bool loop = true;

            while (loop)
            {
                loop = false;
                Console.Write("\nGeben sie \"uci\" für den uci modus und \"vwa\" für den Konsolen modus ein: ");
                string input = Console.ReadLine();
                if (input.Length > 2 && string.Equals(input.Substring(0, 3), "uci", StringComparison.CurrentCultureIgnoreCase))
                {
                    uci.Uci_Loop(ref brett, ref info);
                }
                if (input.Length > 2 && string.Equals(input.Substring(0, 3), "vwa", StringComparison.CurrentCultureIgnoreCase))
                {
                    Console.Clear();
                    xboard.Console_Loop(ref brett, ref info);
                }
                else
                {
                    loop = true;
                }
            }
        }
Exemplo n.º 4
0
 static void AddBlackPawnMove(int from, int to, ref movelist list, ref boardStruct brett)
 {
     if (defs.RanksBrd[from] == (int)defs.Zeilen.ZEILE_2)
     {
         AddQuietMove(makros.ZugGenerieren(from, to, (int)defs.Figuren.LEER, (int)defs.Figuren.sD, 0), ref list, ref brett);
         AddQuietMove(makros.ZugGenerieren(from, to, (int)defs.Figuren.LEER, (int)defs.Figuren.sT, 0), ref list, ref brett);
         AddQuietMove(makros.ZugGenerieren(from, to, (int)defs.Figuren.LEER, (int)defs.Figuren.sL, 0), ref list, ref brett);
         AddQuietMove(makros.ZugGenerieren(from, to, (int)defs.Figuren.LEER, (int)defs.Figuren.sP, 0), ref list, ref brett);
     }
     else
     {
         AddQuietMove(makros.ZugGenerieren(from, to, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, 0), ref list, ref brett);
     }
 }
Exemplo n.º 5
0
 static void AddWhitePawnCapMove(int from, int to, int cap, ref movelist list, ref boardStruct brett)
 {
     if (defs.RanksBrd[from] == (int)defs.Zeilen.ZEILE_7)
     {
         AddCaptureMove(makros.ZugGenerieren(from, to, cap, (int)defs.Figuren.wD, 0), ref list, ref brett);
         AddCaptureMove(makros.ZugGenerieren(from, to, cap, (int)defs.Figuren.wT, 0), ref list, ref brett);
         AddCaptureMove(makros.ZugGenerieren(from, to, cap, (int)defs.Figuren.wL, 0), ref list, ref brett);
         AddCaptureMove(makros.ZugGenerieren(from, to, cap, (int)defs.Figuren.wP, 0), ref list, ref brett);
     }
     else
     {
         AddCaptureMove(makros.ZugGenerieren(from, to, cap, (int)defs.Figuren.LEER, 0), ref list, ref brett);
     }
 }
Exemplo n.º 6
0
Arquivo: io.cs Projeto: alang321/VWA
        public static string PrintMoveList(movelist list)
        {
            string ret   = "";
            int    index = 0;
            int    score = 0;
            int    move  = 0;

            ret += "\nZugListe:\n";

            for (index = 0; index < list.anzahlZüge; ++index)
            {
                move  = list.zugliste[index].Zug;
                score = list.zugliste[index].Wertung;

                ret += String.Format("Zug:{0} > {1} (Wertung:{2})\n", index + 1, PrMove(move), score);
            }
            ret += String.Format("Zug Liste Züge insgesamt: {0} \n\n", list.anzahlZüge);
            return(ret);
        }
Exemplo n.º 7
0
        static void AddQuietMove(int zug, ref movelist list, ref boardStruct brett)
        {
            list.zugliste[list.anzahlZüge].Zug = zug;

            if (brett.searchKillers[0, brett.ply] == zug)
            {
                list.zugliste[list.anzahlZüge].Wertung = 900000;
            }
            else if (brett.searchKillers[1, brett.ply] == zug)
            {
                list.zugliste[list.anzahlZüge].Wertung = 800000;
            }
            else
            {
                list.zugliste[list.anzahlZüge].Wertung = brett.searchHistory[brett.figuren[makros.FromSq(zug)], makros.ToSq(zug)];
            }

            list.anzahlZüge++;
        }
Exemplo n.º 8
0
        public static bool MoveExists(ref boardStruct brett, int move)
        {
            movelist list = new movelist();

            GenerateAllMoves(ref list, ref brett);

            int MoveNum = 0;

            for (MoveNum = 0; MoveNum < list.anzahlZüge; ++MoveNum)
            {
                if (!makemove.MakeMove(list.zugliste[MoveNum].Zug, ref brett))
                {
                    continue;
                }
                makemove.TakeMove(ref brett);
                if (list.zugliste[MoveNum].Zug == move)
                {
                    return(true);
                }
            }
            return(false);
        }
Exemplo n.º 9
0
        static void PickNextMove(int moveNum, ref movelist list)
        {
            zug temp      = new zug();
            int index     = 0;
            int bestScore = 0;
            int bestNum   = moveNum;

            for (index = moveNum; index < list.anzahlZüge; ++index)
            {
                if (list.zugliste[index].Wertung > bestScore)
                {
                    bestScore = list.zugliste[index].Wertung;
                    bestNum   = index;
                }
            }

            Debug.Assert(moveNum >= 0 && moveNum < list.anzahlZüge);
            Debug.Assert(bestNum >= 0 && bestNum < list.anzahlZüge);
            Debug.Assert(bestNum >= moveNum);

            temp = list.zugliste[moveNum];
            list.zugliste[moveNum] = list.zugliste[bestNum];
            list.zugliste[bestNum] = temp;
        }
Exemplo n.º 10
0
        public static int Quiescence(int alpha, int beta, ref boardStruct brett, ref suchInfo info)
        {
            Debug.Assert(board.CheckBoard(ref brett));
            Debug.Assert(beta > alpha);

            if ((info.nodes & 2047) == 0)
            {
                CheckUp(ref info);
            }

            info.nodes++;

            if (IsRepetition(ref brett) || brett.fiftyMove >= 100)
            {
                return(0);
            }

            if (brett.ply > defs.MAXTIEFE - 1)
            {
                return(evaluate.EvalPosition(ref brett));
            }

            int Score = evaluate.EvalPosition(ref brett);

            Debug.Assert(Score > -defs.INFINITE && Score < defs.INFINITE);

            if (Score >= beta)
            {
                return(beta);
            }

            if (Score > alpha)
            {
                alpha = Score;
            }

            movelist list = new movelist();

            movegen.GenerateAllCaps(ref list, ref brett);

            int MoveNum = 0;
            int Legal   = 0;

            Score = -defs.INFINITE;

            for (MoveNum = 0; MoveNum < list.anzahlZüge; ++MoveNum)
            {
                PickNextMove(MoveNum, ref list);

                if (!makemove.MakeMove(list.zugliste[MoveNum].Zug, ref brett))
                {
                    continue;
                }

                Legal++;
                Score = -Quiescence(-beta, -alpha, ref brett, ref info);
                makemove.TakeMove(ref brett);

                if (info.stopped)
                {
                    return(0);
                }

                if (Score > alpha)
                {
                    if (Score >= beta)
                    {
                        if (Legal == 1)
                        {
                            info.fhf++;
                        }
                        info.fh++;
                        return(beta);
                    }
                    alpha = Score;
                }
            }
            return(alpha);
        }
Exemplo n.º 11
0
        static bool checkresult(ref boardStruct brett)
        {
            Debug.Assert(board.CheckBoard(ref brett));

            if (brett.fiftyMove > 100)
            {
                Console.WriteLine("1/2-1/2 {fifty move rule (claimed by Vwa)}\n"); return(true);
            }

            if (ThreeFoldRep(ref brett) >= 2)
            {
                Console.WriteLine("1/2-1/2 {3-fold repetition (claimed by Vwa)}\n"); return(true);
            }

            if (DrawMaterial(ref brett))
            {
                Console.WriteLine("1/2-1/2 {insufficient material (claimed by Vwa)}\n"); return(true);
            }

            movelist list = new movelist();

            movegen.GenerateAllMoves(ref list, ref brett);

            int MoveNum = 0;
            int found   = 0;

            for (MoveNum = 0; MoveNum < list.anzahlZüge; ++MoveNum)
            {
                if (!makemove.MakeMove(list.zugliste[MoveNum].Zug, ref brett))
                {
                    continue;
                }
                found++;
                makemove.TakeMove(ref brett);
                break;
            }

            if (found != 0)
            {
                return(false);
            }

            bool InCheck = attack.SqAttacked(brett.KönigSq[brett.seite], brett.seite ^ 1, ref brett);

            if (InCheck)
            {
                if (brett.seite == (int)defs.Farben.WEISS)
                {
                    Console.WriteLine("0-1 {black mates (claimed by Vwa)}\n"); return(true);
                }
                else
                {
                    Console.WriteLine("0-1 {white mates (claimed by Vwa)}\n"); return(true);
                }
            }
            else
            {
                Console.WriteLine("\n1/2-1/2 {stalemate (claimed by Vwa)}\n"); return(true);
            }
            return(false);
        }
Exemplo n.º 12
0
 static void AddEnPassantMove(int zug, ref movelist list, ref boardStruct brett)
 {
     list.zugliste[list.anzahlZüge].Zug     = zug;
     list.zugliste[list.anzahlZüge].Wertung = 105 + 1000000;
     list.anzahlZüge++;
 }
Exemplo n.º 13
0
        public static void GenerateAllMoves(ref movelist list, ref boardStruct brett)
        {
            Debug.Assert(board.CheckBoard(ref brett));
            list.anzahlZüge = 0;

            int pce = (int)defs.Figuren.LEER;
            int side = brett.seite;
            int sq = 0; int t_sq = 0;
            int pceNum   = 0;
            int dir      = 0;
            int index    = 0;
            int pceIndex = 0;

            if (side == (int)defs.Farben.WEISS)
            {
                for (pceNum = 0; pceNum < brett.pceNum[(int)defs.Figuren.wB]; ++pceNum)
                {
                    sq = brett.fListe[(int)defs.Figuren.wB, pceNum];
                    Debug.Assert(validate.SqOnBoard(sq));

                    if (brett.figuren[sq + 10] == (int)defs.Figuren.LEER)
                    {
                        AddWhitePawnMove(sq, sq + 10, ref list, ref brett);
                        if (defs.RanksBrd[sq] == (int)defs.Zeilen.ZEILE_2 && brett.figuren[sq + 20] == (int)defs.Figuren.LEER)
                        {
                            AddQuietMove(makros.ZugGenerieren(sq, (sq + 20), (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagPS), ref list, ref brett);
                        }
                    }

                    if (validate.SqOnBoard(sq + 9) && data.PieceCol[brett.figuren[sq + 9]] == (int)defs.Farben.SCHWARZ)
                    {
                        AddWhitePawnCapMove(sq, sq + 9, brett.figuren[sq + 9], ref list, ref brett);
                    }
                    if (validate.SqOnBoard(sq + 11) && data.PieceCol[brett.figuren[sq + 11]] == (int)defs.Farben.SCHWARZ)
                    {
                        AddWhitePawnCapMove(sq, sq + 11, brett.figuren[sq + 11], ref list, ref brett);
                    }

                    if (brett.enPas != (int)defs.Felder.NO_SQ)
                    {
                        if (sq + 9 == brett.enPas)
                        {
                            AddEnPassantMove(makros.ZugGenerieren(sq, sq + 9, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagEP), ref list, ref brett);
                        }
                        if (sq + 11 == brett.enPas)
                        {
                            AddEnPassantMove(makros.ZugGenerieren(sq, sq + 11, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagEP), ref list, ref brett);
                        }
                    }
                }

                if ((brett.rochadePerm & (int)defs.Rochade.WKRC) != 0)
                {
                    if (brett.figuren[(int)defs.Felder.F1] == (int)defs.Figuren.LEER && brett.figuren[(int)defs.Felder.G1] == (int)defs.Figuren.LEER)
                    {
                        if (!attack.SqAttacked((int)defs.Felder.E1, (int)defs.Farben.SCHWARZ, ref brett) && !attack.SqAttacked((int)defs.Felder.F1, (int)defs.Farben.SCHWARZ, ref brett))
                        {
                            AddQuietMove(makros.ZugGenerieren((int)defs.Felder.E1, (int)defs.Felder.G1, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagCA), ref list, ref brett);
                        }
                    }
                }

                if ((brett.rochadePerm & (int)defs.Rochade.WDRC) != 0)
                {
                    if (brett.figuren[(int)defs.Felder.D1] == (int)defs.Figuren.LEER && brett.figuren[(int)defs.Felder.C1] == (int)defs.Figuren.LEER && brett.figuren[(int)defs.Felder.B1] == (int)defs.Figuren.LEER)
                    {
                        if (!attack.SqAttacked((int)defs.Felder.E1, (int)defs.Farben.SCHWARZ, ref brett) && !attack.SqAttacked((int)defs.Felder.D1, (int)defs.Farben.SCHWARZ, ref brett))
                        {
                            AddQuietMove(makros.ZugGenerieren((int)defs.Felder.E1, (int)defs.Felder.C1, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagCA), ref list, ref brett);
                        }
                    }
                }
            }
            else
            {
                for (pceNum = 0; pceNum < brett.pceNum[(int)defs.Figuren.sB]; ++pceNum)
                {
                    sq = brett.fListe[(int)defs.Figuren.sB, pceNum];
                    Debug.Assert(validate.SqOnBoard(sq));

                    if (brett.figuren[sq - 10] == (int)defs.Figuren.LEER)
                    {
                        AddBlackPawnMove(sq, sq - 10, ref list, ref brett);
                        if (defs.RanksBrd[sq] == (int)defs.Zeilen.ZEILE_7 && brett.figuren[sq - 20] == (int)defs.Figuren.LEER)
                        {
                            AddQuietMove(makros.ZugGenerieren(sq, (sq - 20), (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagPS), ref list, ref brett);
                        }
                    }

                    if (validate.SqOnBoard(sq - 9) && data.PieceCol[brett.figuren[sq - 9]] == (int)defs.Farben.WEISS)
                    {
                        AddBlackPawnCapMove(sq, sq - 9, brett.figuren[sq - 9], ref list, ref brett);
                    }

                    if (validate.SqOnBoard(sq - 11) && data.PieceCol[brett.figuren[sq - 11]] == (int)defs.Farben.WEISS)
                    {
                        AddBlackPawnCapMove(sq, sq - 11, brett.figuren[sq - 11], ref list, ref brett);
                    }
                    if (brett.enPas != (int)defs.Felder.NO_SQ)
                    {
                        if (sq - 9 == brett.enPas)
                        {
                            AddEnPassantMove(makros.ZugGenerieren(sq, sq - 9, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagEP), ref list, ref brett);
                        }
                        if (sq - 11 == brett.enPas)
                        {
                            AddEnPassantMove(makros.ZugGenerieren(sq, sq - 11, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagEP), ref list, ref brett);
                        }
                    }
                }

                // castling
                if ((brett.rochadePerm & (int)defs.Rochade.SKRC) != 0)
                {
                    if (brett.figuren[(int)defs.Felder.F8] == (int)defs.Figuren.LEER && brett.figuren[(int)defs.Felder.G8] == (int)defs.Figuren.LEER)
                    {
                        if (!attack.SqAttacked((int)defs.Felder.E8, (int)defs.Farben.WEISS, ref brett) && !attack.SqAttacked((int)defs.Felder.F8, (int)defs.Farben.WEISS, ref brett))
                        {
                            AddQuietMove(makros.ZugGenerieren((int)defs.Felder.E8, (int)defs.Felder.G8, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagCA), ref list, ref brett);
                        }
                    }
                }

                if ((brett.rochadePerm & (int)defs.Rochade.SDRC) != 0)
                {
                    if (brett.figuren[(int)defs.Felder.D8] == (int)defs.Figuren.LEER && brett.figuren[(int)defs.Felder.C8] == (int)defs.Figuren.LEER && brett.figuren[(int)defs.Felder.B8] == (int)defs.Figuren.LEER)
                    {
                        if (!attack.SqAttacked((int)defs.Felder.E8, (int)defs.Farben.WEISS, ref brett) && !attack.SqAttacked((int)defs.Felder.D8, (int)defs.Farben.WEISS, ref brett))
                        {
                            AddQuietMove(makros.ZugGenerieren((int)defs.Felder.E8, (int)defs.Felder.C8, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagCA), ref list, ref brett);
                        }
                    }
                }
            }

            /* Loop for slide pieces */
            pceIndex = LoopSlideIndex[side];
            pce      = LoopSlidePce[pceIndex++];
            while (pce != 0)
            {
                Debug.Assert(validate.PieceValid(pce));

                for (pceNum = 0; pceNum < brett.pceNum[pce]; ++pceNum)
                {
                    sq = brett.fListe[pce, pceNum];
                    Debug.Assert(validate.SqOnBoard(sq));

                    for (index = 0; index < NumDir[pce]; ++index)
                    {
                        dir  = PceDir[pce][index];
                        t_sq = sq + dir;

                        while (validate.SqOnBoard(t_sq))
                        {
                            // (int)defs.Farben.SCHWARZ ^ 1 == (int)defs.Farben.WEISS       (int)defs.Farben.WEISS ^ 1 == (int)defs.Farben.SCHWARZ
                            if (brett.figuren[t_sq] != (int)defs.Figuren.LEER)
                            {
                                if (data.PieceCol[brett.figuren[t_sq]] == (side ^ 1))
                                {
                                    AddCaptureMove(makros.ZugGenerieren(sq, t_sq, brett.figuren[t_sq], (int)defs.Figuren.LEER, 0), ref list, ref brett);
                                }
                                break;
                            }
                            AddQuietMove(makros.ZugGenerieren(sq, t_sq, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, 0), ref list, ref brett);
                            t_sq += dir;
                        }
                    }
                }
                pce = LoopSlidePce[pceIndex++];
            }

            /* Loop for non slide */
            pceIndex = LoopNonSlideIndex[side];
            pce      = LoopNonSlidePce[pceIndex++];

            while (pce != 0)
            {
                Debug.Assert(validate.PieceValid(pce));

                for (pceNum = 0; pceNum < brett.pceNum[pce]; ++pceNum)
                {
                    sq = brett.fListe[pce, pceNum];
                    Debug.Assert(validate.SqOnBoard(sq));

                    for (index = 0; index < NumDir[pce]; ++index)
                    {
                        dir  = PceDir[pce][index];
                        t_sq = sq + dir;

                        if (!validate.SqOnBoard(t_sq))
                        {
                            continue;
                        }

                        // BLACK ^ 1 == WHITE       WHITE ^ 1 == BLACK
                        if (brett.figuren[t_sq] != (int)defs.Figuren.LEER)
                        {
                            if (data.PieceCol[brett.figuren[t_sq]] == (side ^ 1))
                            {
                                AddCaptureMove(makros.ZugGenerieren(sq, t_sq, brett.figuren[t_sq], (int)defs.Figuren.LEER, 0), ref list, ref brett);
                            }
                            continue;
                        }
                        AddQuietMove(makros.ZugGenerieren(sq, t_sq, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, 0), ref list, ref brett);
                    }
                }

                pce = LoopNonSlidePce[pceIndex++];
            }
        }
Exemplo n.º 14
0
Arquivo: io.cs Projeto: alang321/VWA
        //zum züge eingeben von Zügen aus der Konsole
        public static int ParseMove(string moveInput, ref boardStruct brett)
        {
            Debug.Assert(board.CheckBoard(ref brett));

            //damit kein out of range ist wenn der string zu kurz für zurücknehmen ist
            if (moveInput.Length < 4)
            {
                return(defs.NOMOVE);
            }

            // index eines buchstaben (c ist die character variable) = (int)c % 32;

            if (Convert.ToInt32(moveInput[1].ToString()) > 8 || Convert.ToInt32(moveInput[1].ToString()) < 1)
            {
                return(defs.NOMOVE);
            }
            if (Convert.ToInt32(moveInput[3].ToString()) > 8 || Convert.ToInt32(moveInput[3].ToString()) < 1)
            {
                return(defs.NOMOVE);
            }
            if (((int)moveInput[0] % 32) > 8 || ((int)moveInput[0] % 32) < 1)
            {
                return(defs.NOMOVE);
            }
            if (((int)moveInput[2] % 32) > 8 || ((int)moveInput[2] % 32) < 1)
            {
                return(defs.NOMOVE);
            }

            int from = makros.SZ2SQ(((int)moveInput[0] % 32) - 1, moveInput[1] - '1');
            int to   = makros.SZ2SQ(((int)moveInput[2] % 32) - 1, moveInput[3] - '1');

            Debug.Assert(validate.SqOnBoard(from) && validate.SqOnBoard(to));

            movelist list = new movelist();

            movegen.GenerateAllMoves(ref list, ref brett);
            int MoveNum = 0;
            int Move    = 0;
            int PromPce = (int)defs.Figuren.LEER;

            for (MoveNum = 0; MoveNum < list.anzahlZüge; ++MoveNum)
            {
                Move = list.zugliste[MoveNum].Zug;
                if (makros.FromSq(Move) == from && makros.ToSq(Move) == to)
                {
                    PromPce = makros.Promoted(Move);
                    if (PromPce != (int)defs.Figuren.LEER)
                    {
                        if (moveInput.Length == 4 || moveInput[4] == ' ')
                        {
                            continue;
                        }
                        else if (data.PieceRookQueen[PromPce] && !data.PieceBishopQueen[PromPce] && moveInput[4] == 'r')
                        {
                            return(Move);
                        }
                        else if (!data.PieceRookQueen[PromPce] && data.PieceBishopQueen[PromPce] && moveInput[4] == 'b')
                        {
                            return(Move);
                        }
                        else if (data.PieceRookQueen[PromPce] && data.PieceBishopQueen[PromPce] && moveInput[4] == 'q')
                        {
                            return(Move);
                        }
                        else if (data.PieceKnight[PromPce] && moveInput[4] == 'n')
                        {
                            return(Move);
                        }
                        continue;
                    }
                    return(Move);
                }
            }

            return(defs.NOMOVE);
        }
Exemplo n.º 15
0
 static void AddCaptureMove(int zug, ref movelist list, ref boardStruct brett)
 {
     list.zugliste[list.anzahlZüge].Zug     = zug;
     list.zugliste[list.anzahlZüge].Wertung = MvvLvaScores[makros.Captured(zug), brett.figuren[makros.FromSq(zug)]] + 1000000;
     list.anzahlZüge++;
 }
Exemplo n.º 16
0
        public static void GenerateAllCaps(ref movelist list, ref boardStruct brett)
        {
            Debug.Assert(board.CheckBoard(ref brett));
            list.anzahlZüge = 0;

            int pce = (int)defs.Figuren.LEER;
            int side = brett.seite;
            int sq = 0; int t_sq = 0;
            int pceNum   = 0;
            int dir      = 0;
            int index    = 0;
            int pceIndex = 0;

            if (side == (int)defs.Farben.WEISS)
            {
                for (pceNum = 0; pceNum < brett.pceNum[(int)defs.Figuren.wB]; ++pceNum)
                {
                    sq = brett.fListe[(int)defs.Figuren.wB, pceNum];
                    Debug.Assert(validate.SqOnBoard(sq));

                    if (validate.SqOnBoard(sq + 9) && data.PieceCol[brett.figuren[sq + 9]] == (int)defs.Farben.SCHWARZ)
                    {
                        AddWhitePawnCapMove(sq, sq + 9, brett.figuren[sq + 9], ref list, ref brett);
                    }
                    if (validate.SqOnBoard(sq + 11) && data.PieceCol[brett.figuren[sq + 11]] == (int)defs.Farben.SCHWARZ)
                    {
                        AddWhitePawnCapMove(sq, sq + 11, brett.figuren[sq + 11], ref list, ref brett);
                    }

                    if (brett.enPas != (int)defs.Felder.NO_SQ)
                    {
                        if (sq + 9 == brett.enPas)
                        {
                            AddEnPassantMove(makros.ZugGenerieren(sq, sq + 9, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagEP), ref list, ref brett);
                        }
                        if (sq + 11 == brett.enPas)
                        {
                            AddEnPassantMove(makros.ZugGenerieren(sq, sq + 11, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagEP), ref list, ref brett);
                        }
                    }
                }
            }
            else
            {
                for (pceNum = 0; pceNum < brett.pceNum[(int)defs.Figuren.sB]; ++pceNum)
                {
                    sq = brett.fListe[(int)defs.Figuren.sB, pceNum];
                    Debug.Assert(validate.SqOnBoard(sq));

                    if (validate.SqOnBoard(sq - 9) && data.PieceCol[brett.figuren[sq - 9]] == (int)defs.Farben.WEISS)
                    {
                        AddBlackPawnCapMove(sq, sq - 9, brett.figuren[sq - 9], ref list, ref brett);
                    }

                    if (validate.SqOnBoard(sq - 11) && data.PieceCol[brett.figuren[sq - 11]] == (int)defs.Farben.WEISS)
                    {
                        AddBlackPawnCapMove(sq, sq - 11, brett.figuren[sq - 11], ref list, ref brett);
                    }
                    if (brett.enPas != (int)defs.Felder.NO_SQ)
                    {
                        if (sq - 9 == brett.enPas)
                        {
                            AddEnPassantMove(makros.ZugGenerieren(sq, sq - 9, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagEP), ref list, ref brett);
                        }
                        if (sq - 11 == brett.enPas)
                        {
                            AddEnPassantMove(makros.ZugGenerieren(sq, sq - 11, (int)defs.Figuren.LEER, (int)defs.Figuren.LEER, defs.MFlagEP), ref list, ref brett);
                        }
                    }
                }
            }

            /* Loop for slide pieces */
            pceIndex = LoopSlideIndex[side];
            pce      = LoopSlidePce[pceIndex++];
            while (pce != 0)
            {
                Debug.Assert(validate.PieceValid(pce));

                for (pceNum = 0; pceNum < brett.pceNum[pce]; ++pceNum)
                {
                    sq = brett.fListe[pce, pceNum];
                    Debug.Assert(validate.SqOnBoard(sq));

                    for (index = 0; index < NumDir[pce]; ++index)
                    {
                        dir  = PceDir[pce][index];
                        t_sq = sq + dir;

                        while (validate.SqOnBoard(t_sq))
                        {
                            // (int)defs.Farben.SCHWARZ ^ 1 == (int)defs.Farben.WEISS       (int)defs.Farben.WEISS ^ 1 == (int)defs.Farben.SCHWARZ
                            if (brett.figuren[t_sq] != (int)defs.Figuren.LEER)
                            {
                                if (data.PieceCol[brett.figuren[t_sq]] == (side ^ 1))
                                {
                                    AddCaptureMove(makros.ZugGenerieren(sq, t_sq, brett.figuren[t_sq], (int)defs.Figuren.LEER, 0), ref list, ref brett);
                                }
                                break;
                            }
                            t_sq += dir;
                        }
                    }
                }
                pce = LoopSlidePce[pceIndex++];
            }

            /* Loop for non slide */
            pceIndex = LoopNonSlideIndex[side];
            pce      = LoopNonSlidePce[pceIndex++];

            while (pce != 0)
            {
                Debug.Assert(validate.PieceValid(pce));

                for (pceNum = 0; pceNum < brett.pceNum[pce]; ++pceNum)
                {
                    sq = brett.fListe[pce, pceNum];
                    Debug.Assert(validate.SqOnBoard(sq));

                    for (index = 0; index < NumDir[pce]; ++index)
                    {
                        dir  = PceDir[pce][index];
                        t_sq = sq + dir;

                        if (!validate.SqOnBoard(t_sq))
                        {
                            continue;
                        }

                        // BLACK ^ 1 == WHITE       WHITE ^ 1 == BLACK
                        if (brett.figuren[t_sq] != (int)defs.Figuren.LEER)
                        {
                            if (data.PieceCol[brett.figuren[t_sq]] == (side ^ 1))
                            {
                                AddCaptureMove(makros.ZugGenerieren(sq, t_sq, brett.figuren[t_sq], (int)defs.Figuren.LEER, 0), ref list, ref brett);
                            }
                            continue;
                        }
                    }
                }

                pce = LoopNonSlidePce[pceIndex++];
            }
        }
Exemplo n.º 17
0
        public static int AlphaBeta(int alpha, int beta, int depth, ref boardStruct brett, ref suchInfo info, bool DoNull)
        {
            Debug.Assert(board.CheckBoard(ref brett));
            Debug.Assert(alpha < beta);
            Debug.Assert(depth >= 0);

            if (depth <= 0)
            {
                return(Quiescence(alpha, beta, ref brett, ref info));
                //return evaluate.EvalPosition(ref brett);
            }

            if ((info.nodes % 2047) == 0)
            {
                CheckUp(ref info);
            }

            info.nodes++;

            if ((IsRepetition(ref brett) || brett.fiftyMove >= 100) && brett.ply != 0)
            {
                return(0);
            }

            if (brett.ply > defs.MAXTIEFE - 1)
            {
                return(evaluate.EvalPosition(ref brett));
            }

            bool inSchach = attack.SqAttacked(brett.KönigSq[brett.seite], brett.seite ^ 1, ref brett);

            //wenn könig in schach ist gleich tiefer weil das sonst unnötig ist weil eh in schach
            if (inSchach)
            {
                depth++;
            }

            int Score  = -defs.INFINITE;
            int PvMove = defs.NOMOVE;

            if (PvTable.ProbeHashEntry(ref PvMove, ref Score, alpha, beta, depth, ref brett))
            {
                brett.PvTable.cut++;
                return(Score);
            }

            if (DoNull && !inSchach && brett.ply > 0 && (brett.bigPce[brett.seite] > 0) && depth >= 4)
            {
                makemove.MakeNullMove(ref brett);
                Score = -AlphaBeta(-beta, -beta + 1, depth - 4, ref brett, ref info, false);
                makemove.TakeNullMove(ref brett);
                if (info.stopped)
                {
                    return(0);
                }

                if (Score >= beta && Math.Abs(Score) < defs.ISMATE)
                {
                    info.nullCut++;
                    return(beta);
                }
            }


            movelist list = new movelist();

            movegen.GenerateAllMoves(ref list, ref brett);

            int MoveNum  = 0;
            int Legal    = 0;
            int OldAlpha = alpha;
            int BestMove = defs.NOMOVE;

            Score = -defs.INFINITE;

            int BestScore = -defs.INFINITE;

            //checkt ob man in der best möglichewn line ist dann sucht es diesesen zug zuerst
            if (PvMove != defs.NOMOVE)
            {
                for (MoveNum = 0; MoveNum < list.anzahlZüge; ++MoveNum)
                {
                    if (list.zugliste[MoveNum].Zug == PvMove)
                    {
                        list.zugliste[MoveNum].Wertung = 2000000;
                        break;
                    }
                }
            }

            for (MoveNum = 0; MoveNum < list.anzahlZüge; ++MoveNum)
            {
                PickNextMove(MoveNum, ref list);

                if (!makemove.MakeMove(list.zugliste[MoveNum].Zug, ref brett))
                {
                    continue;
                }

                Legal++;
                Score = -AlphaBeta(-beta, -alpha, depth - 1, ref brett, ref info, true);
                makemove.TakeMove(ref brett);

                if (info.stopped)
                {
                    return(0);
                }

                if (Score > BestScore)
                {
                    BestScore = Score;
                    BestMove  = list.zugliste[MoveNum].Zug;
                    if (Score > alpha)
                    {
                        if (Score >= beta)
                        {
                            if (Legal == 1)
                            {
                                info.fhf++;
                            }
                            info.fh++;

                            if (!makros.MoveFlagCapture(list.zugliste[MoveNum].Zug))
                            {
                                brett.searchKillers[1, brett.ply] = brett.searchKillers[0, brett.ply];
                                brett.searchKillers[0, brett.ply] = list.zugliste[MoveNum].Zug;
                            }

                            PvTable.StoreHashEntry(BestMove, beta, (int)defs.HASH.HFBETA, depth, ref brett);

                            return(beta);
                        }
                        alpha = Score;

                        if (!makros.MoveFlagCapture(list.zugliste[MoveNum].Zug))
                        {
                            brett.searchHistory[brett.figuren[makros.FromSq(BestMove)], makros.ToSq(BestMove)] += depth;
                        }
                    }
                }
            }

            if (Legal == 0)
            {
                if (inSchach)
                {
                    return(-defs.MATE + brett.ply);
                }
                else
                {
                    return(0);
                }
            }

            if (alpha != OldAlpha)
            {
                PvTable.StoreHashEntry(BestMove, BestScore, (int)defs.HASH.HFEXACT, depth, ref brett);
            }
            else
            {
                PvTable.StoreHashEntry(BestMove, alpha, (int)defs.HASH.HFALPHA, depth, ref brett);
            }

            return(alpha);
        }