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; }
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)); }
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; } } }
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); } }
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); } }
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); }
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++; }
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); }
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; }
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); }
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); }
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++; }
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++]; } }
//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); }
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++; }
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++]; } }
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); }