For the last month or so, in the evenings and on the weekends, I’ve been writing a new version of MadChess. For this 3.0 version, I’m writing code using bitboards instead of the mailbox board representation I used in MadChess 1.x and 2.x. I considered using C++ and even went as far as purchasing Bjarne Stroustrup’s The C++ Programming Language book and reading the first four chapters. But in the end I decided to stick with C#, the programming language with which I’m most familiar, for a few reasons.
- Microsoft has been adding high-performance features to C# in recent editions, such as ref locals and ref returns.
- Microsoft has embraced the open source movement with its .NET Core development platform.
- C# is fast enough.
Perhaps I’ll consider using C++ for version 4 of MadChess.
OK, back to version 3: At program startup, I pre-calculate moves for sliding pieces using magic hashing. I found paulwal222’s answer to the Sliding Move Generation Using Magic Bitboard topic on Stack Overflow a very clear explanation of the technique. See my code below.
I’ve reached the first important milestone: legal move generation. I’m happy with the performance of my C# bitboard code. On my PC, MadChess 3.0 Beta generates legal moves at a rate of 41 million per second from the starting position (4.7x faster than MadChess 2.2). This includes generating pseudo-legal moves with the minimal requirements of From Square, To Square, and Pawn Promotion Piece, plus other metadata that eventually will be used by the search function; finding pinned pieces; and testing move legality (does move expose own king to check) for pinned pieces.
I’ve successfully passed my suite of test positions– the same positions I used to verify correct legal move generation in MadChess 1.x and 2.x. MadChess 3.0 Beta completes the test suite 4.2x faster than MadChess 2.2.
PS C:\Users\Erik\Documents\Visual Studio 2019\Projects\MadChess\Engine\bin\Publish> .\MadChess.Engine.exe testpositions "C:\Users\Erik\Documents\Chess\Tests\TestPositions.txt" Number Position Depth Expected Moves Correct Pct ====== =========================================================================== ===== =========== =========== ======= ===== 1 rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 1 20 20 True 100.0 2 rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 2 400 400 True 100.0 3 rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 3 8,902 8,902 True 100.0 4 rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 4 197,281 197,281 True 100.0 5 rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 5 4,865,609 4,865,609 True 100.0 6 rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 6 119,060,324 119,060,324 True 100.0 7 8/8/1k6/8/2pP4/8/5BK1/8 b - d3 0 1 6 824,064 824,064 True 100.0 8 8/8/1k6/2b5/2pP4/8/5K2/8 b - d3 0 1 6 1,440,467 1,440,467 True 100.0 9 8/5k2/8/2Pp4/2B5/1K6/8/8 w - d6 0 1 6 1,440,467 1,440,467 True 100.0 10 5k2/8/8/8/8/8/8/4K2R w K - 0 1 6 661,072 661,072 True 100.0 11 4k2r/8/8/8/8/8/8/5K2 b k - 0 1 6 661,072 661,072 True 100.0 12 3k4/8/8/8/8/8/8/R3K3 w Q - 0 1 6 803,711 803,711 True 100.0 13 r3k3/8/8/8/8/8/8/3K4 b q - 0 1 6 803,711 803,711 True 100.0 14 r3k2r/1b4bq/8/8/8/8/7B/R3K2R w KQkq - 0 1 4 1,274,206 1,274,206 True 100.0 15 r3k2r/7b/8/8/8/8/1B4BQ/R3K2R b KQkq - 0 1 4 1,274,206 1,274,206 True 100.0 16 r3k2r/8/3Q4/8/8/5q2/8/R3K2R b KQkq - 0 1 4 1,720,476 1,720,476 True 100.0 17 r3k2r/8/5Q2/8/8/3q4/8/R3K2R w KQkq - 0 1 4 1,720,476 1,720,476 True 100.0 18 2K2r2/4P3/8/8/8/8/8/3k4 w - - 0 1 6 3,821,001 3,821,001 True 100.0 19 3K4/8/8/8/8/8/4p3/2k2R2 b - - 0 1 6 3,821,001 3,821,001 True 100.0 20 8/8/1P2K3/8/2n5/1q6/8/5k2 b - - 0 1 5 1,004,658 1,004,658 True 100.0 21 5K2/8/1Q6/2N5/8/1p2k3/8/8 w - - 0 1 5 1,004,658 1,004,658 True 100.0 22 4k3/1P6/8/8/8/8/K7/8 w - - 0 1 6 217,342 217,342 True 100.0 23 8/k7/8/8/8/8/1p6/4K3 b - - 0 1 6 217,342 217,342 True 100.0 24 8/P1k5/K7/8/8/8/8/8 w - - 0 1 6 92,683 92,683 True 100.0 25 8/8/8/8/8/k7/p1K5/8 b - - 0 1 6 92,683 92,683 True 100.0 26 K1k5/8/P7/8/8/8/8/8 w - - 0 1 6 2,217 2,217 True 100.0 27 8/8/8/8/8/p7/8/k1K5 b - - 0 1 6 2,217 2,217 True 100.0 28 8/k1P5/8/1K6/8/8/8/8 w - - 0 1 7 567,584 567,584 True 100.0 29 8/8/8/8/1k6/8/K1p5/8 b - - 0 1 7 567,584 567,584 True 100.0 30 8/8/2k5/5q2/5n2/8/5K2/8 b - - 0 1 4 23,527 23,527 True 100.0 31 8/5k2/8/5N2/5Q2/2K5/8/8 w - - 0 1 4 23,527 23,527 True 100.0 32 r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1 5 193,690,690 193,690,690 True 100.0 33 8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1 6 11,030,083 11,030,083 True 100.0 34 r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1 5 15,833,292 15,833,292 True 100.0 35 rnbqkb1r/pp1p1ppp/2p5/4P3/2B5/8/PPP1NnPP/RNBQK2R w KQkq - 0 1 3 53,392 53,392 True 100.0 36 r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 1 5 164,075,551 164,075,551 True 100.0 37 8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1 7 178,633,661 178,633,661 True 100.0 38 r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1 6 706,045,033 706,045,033 True 100.0 39 rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8 5 89,941,194 89,941,194 True 100.0 40 1k6/1b6/8/8/7R/8/8/4K2R b K - 0 1 5 1,063,513 1,063,513 True 100.0 41 3k4/3p4/8/K1P4r/8/8/8/8 b - - 0 1 6 1,134,888 1,134,888 True 100.0 42 8/8/4k3/8/2p5/8/B2P2K1/8 w - - 0 1 6 1,015,133 1,015,133 True 100.0 Counted 1,846,360,249 nodes (31,154,555 nodes per second).
Hello,
Glad to hear that a new marchesa is coming.
Will Madchess be available for android users?
I don’t have any experience with Android. However, I see the .NET Core Runtime Identifier Catalog page lists “android” and “android.21”. So it appears Microsoft does support compiling .NET Core code for Android. When I have a working MadChess 3.0 engine (that can play a game) I’ll compile it for Android and you can test it.