// run interactive game public void Interactive() { State state = new State(); var quit = false; // moves executed in game while (!quit) { state.Reset(); machineWhite = machineBlack = false; var inGame = true; while (inGame && !quit) { Draw(state, debugContinuousScroll, debugShowFen); var moves = MoveGen.GenMoves(state); if (debugShowMoves) { Console.WriteLine(MoveGen.MoveListToText(moves)); } if (state.halfMoveClock >= 50) // 50 move rule { moves.Clear(); } var gameOver = !moves.Any(); if (gameOver) { // check result var result = CheckEnd(state); Console.WriteLine($"Result: {result}"); } // get move to do Move move = null; int score; if (!gameOver && state.MoveColor == State.White && machineWhite) { (move, score) = computerMover.GenMove(state, -1, maxMs); } else if (!gameOver && state.MoveColor == State.Black && machineBlack) { (move, score) = computerMover.GenMove(state, -1, maxMs); } else { move = HumanInput(ref state, moves, ref quit, ref inGame); } if (move != null) { state.DoMove(move); } } } }
// 400k+ chess puzzles https://www.yacpdb.org/#static/home // some test positions - todo - finish public static void Test2(ref State state) { foreach (var fen in testFEN) { if (State.TryParseFEN(fen, out state)) { var m = MoveGen.GenMoves(state); Chess.Draw(state); System.Console.WriteLine(MoveGen.MoveListToText(m)); return; } else { System.Console.WriteLine($"Error with FEN {fen}"); } } }
static string TestRandomGames(State state) { // run random game, check FEN var r = new Random(1234); // make repeatable for (int game = 0; game < 100; ++game) { state.Reset(); for (int moveCount = 1; moveCount < 300; ++moveCount) { var moves1 = MoveGen.GenMoves(state); if (!moves1.Any()) { break; } // check can do/undo all var fs = state.ToFEN(); foreach (var m in moves1) { state.DoMove(m); state.UndoMove(); var fe = state.ToFEN(); if (fe != fs) { return($"FEN mismatch trying move {m} \n{fs} != \n{fe}"); } } var move = moves1[r.Next(moves1.Count)]; System.Console.WriteLine($"{(moveCount + 1) / 2}: {move:5}"); // move do/undo checks var f1 = state.ToFEN(); state.DoMove(move); var f2 = state.ToFEN(); System.Console.WriteLine(f2); state.UndoMove(); var f3 = state.ToFEN(); state.DoMove(move); var f4 = state.ToFEN(); if (f1 != f3) { return($"FEN mismatch move {moveCount} : {move} \n{f1} != \n{f3}"); } if (f2 != f4) { return($"FEN mismatch move {moveCount} : {move} \n{f2} != \n{f4}"); } #if true // test FEN parsing State s2; if (!State.TryParseFEN(f1, out s2)) { return($"FEN parse failed {f1}"); } var f5 = s2.ToFEN(); if (f1 != f5) { return($"FEN parse mismatch \n{f1} != \n{f5}"); } var moves2 = MoveGen.GenMoves(s2); var mt1 = MoveGen.MoveListToText(moves1); var mt2 = MoveGen.MoveListToText(moves2); if (mt1 != mt2) { return($"Move compare failed \n{mt1} != \n{mt2}\n{f1}==\n{f5}"); } #endif if (move.checkmate) { Chess.Draw(state); } } } return(""); }