示例#1
0
    // 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);
                }
            }
        }
    }
示例#2
0
    // 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}");
            }
        }
    }
示例#3
0
    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("");
    }