Posts

More on User Feedback at the Android Market

I can now read the last few comments that are posted at the Android Market for each application. For chess and reversi, feedback is mostly constructive. I was very shocked, however, to read the comments posted for checkers. People freely post four-letter words and do not shy away from personal insults. Why? Because the application uses the official straight checkers rule where jumps are mandatory? Perhaps, but adding an option to make captures optional did not seem to help. Because graphics are not advanced? True, but I wrote the game for fun and give it away for free! Because the application plays too strong (or too weak)? I assumed people like a challenge (and, conversely, I still have ideas for improving the strength of the checkers engine). Ironically, I implemented checkers by popular demand after I released chess and reversi in the hope people would enjoy the application. But now I am starting to regret this somewhat after reading too many ill-mannered comments and emails....

Chess for Android Update

Image
Version 1.2 of Chess for Android at the Android Market has several improvements. The first is the much requested "undo" feature, where up to eight plies (half-moves) can be taken back to correct mistakes in the input (or mere blunders, as for black in the screenshot below!). The second is a "free play" option, where the phone can be used as a "magnetic chessboard" to study games, or play a game up to a position for further play with the chess engine (this option, like the different levels of play, can be found under the "Menu" button). Furthermore, move highlighting has been modified with a black border, which looks slightly better along files and ranks. Finally, a few rules were added to evaluation function of the chess engine.

Reversi for Android Update

Image
Version 1.2 of Reversi for Android at the Android Market now highlights the new and flipped white stones after each computer move with a red border, as shown below. Hopefully this will make it more clear what was played last.

User Feedback at the Android Market

Perhaps a surprise to some, but I don't actually have the G1 Android phone myself yet. Instead, I developed the three game applications on the Android emulator . This unfortunately also implies that I cannot read the comments that were posted at the Android Market, I only can see the average rating. As such, I just get a sense of user feedback from emails I receive. These emails can be divided into roughly three categories. The first, and luckily largest category consists of nice emails in which people say they enjoy the game(s) and give constructive feedback and suggestions for improvements. I hope to implement some of the requested features, but please keep in mind that this is "spare time" development. The second, smaller category consists of emails where people claim the program is "cheating". So far those claims invariably resulted from a lack of understanding the proper rules (castling or en-passant in chess, forward jumps only for uncrowned pieces in chec

Optional Captures

Image
To my great surprise, quite a few users complained that captures should not be mandatory in the just released Checkers for Android, even though the official straight checkers rules clearly state that jumps are forced (something that in my opinion adds to the beauty of the game). Nevertheless, since this seems a popular feature request, I just posted an update at the Android Market in which the user can chose between mandatory or optional captures prior to the game. The latter option does not follow the so-called "huffing" rule, where the piece that should have performed the capture is forfeited. Instead, the game simply continues, which may lead to some interesting draw situations.

Checkers for Android

Image
The number of downloads of Chess and Reversi for Android exceeded all my expectations, and I received a lot of nice feedback. The most popular request was for a checkers application. So I gave it a try and implemented Checkers for Android which, like Reversi and Chess for Android, is available for free at the Android Market . Some screen shots are shown below. Since captures in checkers can consist of several jumps, I tried a new input mechanism where touching a square shows all valid moves that involve that square. By clicking on those squares (making orange colors red) eventually a move is uniquely defined. Also, the last played move is highlighted on the board (a feature requested for Chess and Reversi as well). The checkers engine plays at various levels (including random).

Chess and Reversi for Android

Image
If you have a G1 Android phone, you can try out two games that I developed. They are available for free at the Android Market . Chess for Android is a simple standalone chess application, consisting of a chess engine (derived from BikJump) together with a GUI (thanks to Joseph Wain for designing the chess graphics). The application accepts moves through the keyboard or touch screen. Once a source square has been determined, all valid destination squares are shown in green. The engine plays at various levels (including random or against itself). Reversi for Android supports keyboard and touchscreen input, and displays all valid moves through labeled "ghost" stones. This engine also plays at various levels (including random).

UCI option: Processors

My attempts to get consensus on standardizing an option to define the number of processors for an UCI engine on talkchess failed miserably, so I simply picked "Processors". The output of the prototype Deep BikJump on the "uci" command is shown below. id name BikJump v2.1P (64-bit) id author Aart J.C. Bik option name Hash type spin default 32 min 1 max 65536 option name NalimovPath type string default option name NalimovCache type spin default 8 min 1 max 2048 option name Ponder type check default true option name Processors type spin default 1 min 1 max 4 uciok I completed the threading toolkit for Linux and MacOS using pthreads and for Windows using the Windows threads. The latter was slightly more elaborate as I found out that CONDITION_VARIABLE (a synchronization primitive) is only supported on Vista, but not XP. Since I want to keep BikJump as portable as possible, I had to rewrite the Windows version using the slightly less elegant, but more widely supported

"Deep" BikJump

The 32-bit version of BikJump v2.01 (after a minor bug fix) received a first rating of 2103 RUEL . Since this was tested on a Pentium IV processor (not good for bitscans), I am looking forward to get results back for the 64-bit version running on a Core 2 Duo or Quad platform. In the meanwhile, I have started work on Deep BikJump, featuring multi-threading to perform the search in parallel (commonly referred to as SMP support). Upcoming versions will be designated with the suffix P (e.g. v2.1P) to denote this new parallel support. Because I want to continue support for all major platform (Windows, Linux, and MacOS), I am working on a small threading toolkit that provides the right abstraction for keeping the major part of the chess engine unaware of details on Windows threads and pthreads.

BikJump v2.0 released

Besides switching to a home-brewed bitboard representation, other parts of BikJump underwent refactoring as well. Some modifications turned out to modify strength negatively. I already wrote about null moves below. Furthermore, because the new bitboard move generator generates legal captures much faster than all legal moves, the quiescence search originally had been modified to look at captures only. After including checks again in the first few nodes, some bad tactical errors were avoided. Similarly, late move reduction had become too optimistic, and needed some adjustment towards the scheme used by the older BikJump. The "perft" nodes-per-second performance (which everybody measures differently; I simply traverse the complete tree with the same move generator that is used in search, including some bookkeeping) is about 13000KNs on a 2.66GHz Core 2 Duo. The nodes-per-second of the actual search in the first Nunn position is now about 1070KNs (64-bit) and 790KNs (32-bit)