Slow Chess Blitz by Jonathan Kreuzer
Mainpage (with download) | Using Slow Chess | Playing Style | Programming Details | Program History | 3DKingdoms.com
General Version History Overview:
Slow Chess 1.0: This first version of Slow Chess I created years ago, I don't have an exact date, but I do remember that my computer at the time was a Pentium 2 200Mhz, so it was a long time ago. It initially took less than a week to make, and did, in fact, run at extremely slow speeds. The movement code was quickly created and unoptimized, there was no quiescence search (and no extensions), and because of its slow speed it was only allowed to search up to 5 ply ahead. As you can imagine, its play was pretty awful. I remember feeling some pride when once upon reaching a won game against me in playing a test game, it managed to queen a couple pawns and deliver a mate instead of moving pieces around. I made a few slight improvements, but spent very little time on it.
Version 2.0: This one took much longer than a week to create, and was much faster (rendering the name non-sensical.) It searches over 1.5 million NPS on my AMD 1.4 Ghz. It also had a windows GUI instead of an ASCII one, and many search enhancements, including iterative deepening for move in # of secs support, and a transposition table. I believe this one was the first one understand the extra rules of chess (en passant, draw by rep, stalemate, no castling through check.) Its evaluation however consisted almost only material (It also liked advancing pawns that weren't in front of its king.)
Version 2.5: Finally added Quiescence search that checks all reasonable moves that lead to a change in material (captures & pawn promotions.) The evaluation was also improved in many areas, including adding some king safety, pawn structure, and very basic engame knowledge. I would like to thank John Gruska, who made many evaluation suggestions for versions 2.0 to 2.5. He also ran Versions 2.3 to 2.5 on the ICC where they played against human players with encouraging results. (It had special net code to telnet the ICC. The games were 2 0, 5 0, and 15 0 though, and often decided on time or tactical oversights in time pressure.)
Version 2.78: Somewhere before this version, I added the TCP/IP internet play. I had a lot of fun playing some friends over the internet using Slow Chess, I don't play much chess anymore though. I corrected lots of search problems and hash problems. Previous versions had no extensions, this one had check, one reply to check, pawn push, and recapture extensions. The check extensions allowed it to see some attacks instantly that took 10 or more seconds before. Also new was an opening book generated from grandmaster games. This is the first version that supported winboard, so I could autoplay some games against other winboard engines (mainly Crafty and GnuChess 4 at first, although I exanded my winboard engine library greatly later. Before this winboard version I'd just play a couple manual games against Gromit 1 and Chessterfield. )
Version 2.89b averages 800,000 to 1,350,000 nodes per second on my AMD 1.4 Ghz. Search Speed isn't that meaningful, so I expect Slow Chess's search speed to continue to drop from the 1.5 to 2.5 million nps it once was. I redid the GUI graphics and made, and fixed/improved many of the GUI options. I'll probably add some more graphical improvements like piece dragging and another piece set sometime. Improved knowledge in general, expecially the endgame knowledge. It still plays some endgames very poorly, but can sometimes plays a good endgame now. I added more extensions.
Some things I learned about making chess programs:
Results will vary: This is of course obvious, but I'm still often surprised. For instance lets say in a test program A goes 15 games against program B without a win, all losses or draws. Then in the next 10 games program A has all wins or draws, and it's program B that has no wins. This happened to me testing A. Slow Chess against B. Crafty in bullet games on my computer. There are lots of online winboard tournaments divided into leagues, and programs in the same league in one tournament may be 2 or even 3 entire leagues apart in another. There are many explanations for this, like strength at a certain time control, or against certain programs, or with ponder on/off, but I believe the strongest factor is just luck. So if you want to create a killer program, beware, sometimes it will seem like your program can only win, then just as quickly like all it does is lose, back and forth =)
It's Addicting: I never set out to create a chess program as strong as this one. I didn't really care about playing strength, it was just fun to see it play moves that looked intelligent, beat me, or anounce a mate in 9 instantly. I don't think anyone expects to make a strong chess program when they first start, if they did, they'd be very disappointed for the first [insert time period here] of development when their program is routinely crushed. Making the GUI was also a learning experience, as was adding the 'net-play, if I was still working on it I'd ask for more user feedback on those two areas. It seems playing strength is what many users are primarily interested in, it's hard not to caught up a bit in improving play and following your programs performance in tournaments. I find just experimenting with search/eval the most interesting although I did start to consider playing strength with every change I made. I never really tested changes, or even versions, for +/- elo in games though. I'm surprised Slow Chess plays as strong as it sometimes does.
Bitboards: I thought that all the strongest programs needed to be bitboard based, which simply isn't true. At one time I created an ASCII bitboard chess engine (it could generate moves, and had a simple search), but instead of finishing it, I chose to continue on my previous non-bitboard program that was further along. I'm still unsure if bitboards would help or not, I think, (especially now with 64-bit computers on the market) I would gain from using them, however anything that can be done with bitboards can be done without, and there are other areas (more accurate eval & better search) which are much more important than internal representation.
Brute Force/Search Depth: I had assumed that chess programs searched most lines, no matter how interesting or just plain bad, to the same or near the same depth. Most strong chess program are in fact highly selective.Slow Chess on an 8-ply search might search some lines only 4-ply deep and some 32-ply deep. The definitions of the terms I used here are very vague however. (Selective is a relative term, a human is of course far more selective in searching a chess position than any program. Some people might say Slow Chess is "classic brute force" or "not a selective searcher".) Many casual users put far too much emphasis on search depth, because between extensions, pruning, and quiescence search (which includes different types of moves in different programs), reported search depth isn't really that meaningful.