Missed Opportunity in the Endgame

I’ve been playing chess against my engine recently, using a beautiful 23″ wooden board by Drueke, with my notebook PC off to the side.  I set the time control to 25 min + 10 sec / move and give myself an extra 5 minutes per game (more time than MadChess) to make the moves on the board and the PC.  I figure that’s fair- it averages to 5 seconds per move over 60 moves.

Since MadChess plays chess as well as an international master (slightly below a grand master), and I am nowhere near that strong, I handicapped it to play at 1300 Elo.  This is made possible by the UCI_LimitStrength algorithm I implemented in the engine.

25 + 10 is an enjoyable pace. It’s slow enough to think through each move, yet fast enough to complete a game in an hour.  After 48 moves (and numerous missed opportunities as post-game analysis revealed), I reach the following position.  Playing the black pieces, thinking I needed to move my king up the board to support my passed pawn, I played Kc5, a blunder.  Can you find the correct move for black?

Of course! I overlooked the move, thinking it lost material. It does, but only temporarily. The pawn will queen.

I am a better chess programmer than player.  I need to play more games and write less code.  I must say though, what a strange feeling is produced by playing a game against an artificial intelligence I have created, purposefully handicapping it to get an even game, then unleashing its full potential after the game is concluded so it may identify all the moments I erred.  A bit magical and eerie all at once.

The full game, with MadChess’ post-game analysis (at 10 seconds per move), is available by clicking the share icon in the diagram above (the rightmost icon).

Banks 63rd Amateur Series Division 6

MadChess 2.1 participated in Graham Banks’ 63rd amateur tournament in division 6.

                                  1    2    3    4    5    6    7    8    9    0    1    2    
1   CyberPagno 3.0 64-bit         **** 111½ 0½½½ 000½ ½11½ ½010 0011 ½101 1½01 1011 1110 1111  27.0/44
2   Maverick 1.5 64-bit           000½ **** 0½10 ½1½1 1100 ½½½1 00½1 1110 ½11½ ½0½½ 11½1 ½111  25.5/44
3   Dorky 4.5 64-bit              1½½½ 1½01 **** ½110 ½½½½ 0½00 1110 00½1 11½½ 0½½1 1111 ½½½0  25.0/44  539.50
4   ECE-X2                        111½ ½0½0 ½001 **** 0101 011½ 101½ ½01½ 1½½0 11½1 0½10 1½½1  25.0/44  536.25
5   Bagatur 1.4d 64-bit           ½00½ 0011 ½½½½ 1010 **** 1011 010½ ½00½ 0½11 1111 101½ 1011  24.5/44
6   Lozza 1.17 64-bit             ½101 ½½½0 1½11 100½ 0100 **** 0½½½ ½10½ ½1½½ ½010 0111 01½1  23.0/44  498.00
7   Betsabe II 1.66               1100 11½0 0001 010½ 101½ 1½½½ **** ½1½0 10½0 011½ ½0½1 11½½  23.0/44  494.75
8   MadChess 2.1 64-bit           ½010 0001 11½0 ½10½ ½11½ ½01½ ½0½1 **** ½½½0 ½½10 01½1 1½00  21.5/44
9   Nemeton 1.5                   0½10 ½00½ 00½½ 0½½1 1½00 ½0½½ 01½1 ½½½1 **** 1½1½ 1010 11½0  21.0/44
10  TJchess 1.3 64-bit            0100 ½1½½ 1½½0 00½0 0000 ½101 100½ ½½01 0½0½ **** 0½0½ ½011  16.5/44
11  Bumblebee 1.0.36898e1 64-bit  0001 00½0 0000 1½01 010½ 1000 ½1½0 10½0 0101 1½1½ **** ½0½0  16.0/44  347.75
12  Shallow r694 64-bit           0000 ½000 ½½½1 0½½0 0100 10½0 00½½ 0½11 00½1 ½100 ½1½1 ****  16.0/44  340.25

Games

MadChess 2.1 Released

I have released version 2.1 of my chess engine. I built this version of MadChess using .NET Core, Microsoft’s new cross-OS development platform. I have provided source code and binaries for Windows on the Downloads page.

I do not have access to a Linux or Mac machine. If you are feeling adventurous and would like to build Linux or Mac binaries, please refer to Getting Started with .NET Core on Windows / Linux / MacOS for instructions on how to build .NET Core applications.

I have configured the MadChess project to build a self-contained application. All binaries required to run MadChess are included in the ZIP file. Unlike previous versions of MadChess, no prerequisite .NET framework must be installed prior to running the engine.

MadChess 2.1 is about 60 or 70 Elo stronger than version 2.0. It includes the following improvements, some impacting playing strength, some more focused on code quality.

  • Converted cached position from a class to a ulong primitive with bitwise operations.
  • Tuned evaluation using the technique described by Peter Österlund.
  • Include static exchange score when determining move futility.
  • Update history heuristic value of previously played quiet moves that failed to produce a cutoff.
  • Extract principal variation from a triangular array (rather than from hash table).
  • Simplified time management.

Banks 62nd Amateur Series Division 7

MadChess 2.0 participated in Graham Banks’ 62nd amateur tournament in division 7.

                                  1    2    3    4    5    6    7    8    9    0    1    2    
1   Shallow r694 64-bit           **** 1110 1111 ½110 ½½10 1011 ½½11 1½½1 ½1½½ 1111 1½11 1111  34.5/44
2   Waxman 2016                   0001 **** 0010 ½0½1 0011 0½½1 1011 1111 1111 101½ ½111 ½1½0  27.0/44
3   Jazz 840 64-bit               0000 1101 **** ½0½1 ½½10 1010 0½1½ ½½½0 ½½11 ½½11 11½1 11½1  25.5/44
4   Ares 1.005.2 64-bit           ½001 ½1½0 ½1½0 **** 0½10 1011 010½ 101½ ½½½1 10½1 ½101 1½11  25.0/44
5   MadChess 2.0 64-bit           ½½01 1100 ½½01 1½01 **** 0100 0110 ½½10 1011 0½01 1110 111½  24.5/44
6   Jumbo 0.4.17 64-bit           0100 1½½0 0101 0100 1011 **** 1110 0001 ½0½1 0101 1111 11½½  24.0/44  481.00
7   Gibbon 2.69a 64-bit           ½½00 0100 1½0½ 101½ 1001 0001 **** 1½11 ½1½0 1110 ½½11 1½½1  24.0/44  478.50
8   Schooner 1.5 64-bit           0½½0 0000 ½½½1 010½ ½½01 1110 0½00 **** 1½0½ 1½11 11½1 ½½½1  22.0/44
9   Fischerle 0.9.70 SE 64-bit    ½0½½ 0000 ½½00 ½½½0 0100 ½1½0 ½0½1 0½1½ **** ½111 1½½½ 1½0½  19.0/44
10  Absolute Zero 2.4.7.2 64-bit  0000 010½ ½½00 01½0 1½10 1010 0001 0½00 ½000 **** ½½11 ½101  16.0/44
11  RamJet 0.13                   0½00 ½000 00½0 ½010 0001 0000 ½½00 00½0 0½½½ ½½00 **** ½111  11.5/44
12  Tunguska 1.0 64-bit           0000 ½0½1 00½0 0½00 000½ 00½½ 0½½0 ½½½0 0½1½ ½010 ½000 ****  11.0/44

Games

Banks 61st Amateur Series Division 6

MadChess 2.0 participated in Graham Banks’ 61st amateur tournament in division 6.

                                  1    2    3    4    5    6    7    8    9    0    1    2    3    4    
1   CmcChess 2.6 64-bit           **** ½½1½ 1½0½ ½100 010½ 0110 ½110 ½11½ ½1½1 101½ 1½1½ 11½1 0111 ½010  31.5/52
2   TJchess 1.3 64-bit            ½½0½ **** ½½11 ½½00 1½01 ½½0½ ½011 0111 ½½01 111½ 001½ 1½10 1101 11½1  31.0/52
3   Orion 0.3.0 64-bit            0½1½ ½½00 **** ½0½½ ½½½½ 1½½½ 1100 1½01 ½101 0½10 0110 1½11 1111 ½½1½  29.5/52
4   Waxman 2015                   ½011 ½½11 ½1½½ **** 0100 1100 1½½1 ½00½ 10½1 01½0 ½½½1 ½½0½ ½½½1 ½111  29.0/52
5   Ares 1.005.2 64-bit           101½ 0½10 ½½½½ 1011 **** 0001 11½½ 011½ 10½½ 1½1½ 10½0 ½00½ ½11½ 1½10  28.5/52  733.00
6   Schooner 1.5 64-bit           1001 ½½1½ 0½½½ 0011 1110 **** 0000 0110 0010 ½½½1 11½½ ½½11 11½1 ½1½½  28.5/52  708.50
7   Myrddin 0.87 64-bit           ½001 ½100 0011 0½½0 00½½ 1111 **** ½001 011½ 101½ 1101 1011 0½01 0111  28.0/52
8   Shallow r694 64-bit           ½00½ 1000 0½10 ½11½ 100½ 1001 ½110 **** ½½00 0101 010½ 1111 0½11 1111  27.5/52
9   MadChess 2.0 64-bit           ½0½0 ½½10 ½010 01½0 01½½ 1101 100½ ½½11 **** ½½1½ 111½ 0100 ½½½½ 1½01  27.0/52
10  Nemeton 1.41                  010½ 000½ 1½01 10½1 0½0½ ½½½0 010½ 1010 ½½0½ **** 101½ 0½1½ 010½ 1111  24.5/52
11  Jazz 840 64-bit               0½0½ 110½ 1001 ½½½0 01½1 00½½ 0010 101½ 000½ 010½ **** ½½01 ½½½½ ½01½  22.0/52
12  Fischerle 0.9.70 SE 64-bit    00½0 0½01 0½00 ½½1½ ½11½ ½½00 0100 0000 1011 1½0½ ½½10 **** 1½½½ 001½  21.0/52
13  Gibbon 2.69a 64-bit           1000 0010 0000 ½½½0 ½00½ 00½0 1½10 1½00 ½½½½ 101½ ½½½½ 0½½½ **** 0100  18.0/52  468.75
14  Absolute Zero 2.4.7.2 64-bit  ½101 00½0 ½½0½ ½000 0½01 ½0½½ 1000 0000 0½10 0000 ½10½ 110½ 1011 ****  18.0/52  457.50

Games