One of my interests has been developing a chess game with a decent AI. I decided to try to build a chess game as my first project in learning the programming language Haskell.

I have gone through three iterations of a chess engine so far. The first chess engine contained a hodge-podge combination of different move considerations, and it chose the final move based on a preference of available moves. This engine doesn't look into the future at all, it simply looks at the moves available, and what pieces it can take and what pieces can be taken. Pretty easy to beat. The code for it can be found here.

The second engine is more sophisticated and provided a much better opponent. It uses a branching tree to look at and weigh games leading off of each move available to the computer. I kept up some documentation about it, describing how it worked and how I got it to work on a cluster of obselete desktops running FreeBSD. The documentation is available here.

The third, and current, iteration of the chess engine builds on the successful elements of the second chess engine, but increases performance, allowing the engine to search further than the last and present more of a challenge. The biggest improvements are constructive discovery of the valid moves for pieces, which seems to have increased performance by around eight times, and an implemenation of the alpha-beta pruning algorithm, which allows many branches in the game tree to be ignored, saving considerable computation time. The code for it can be found here.


The game contains a variety of interesting features that were fun to implement and add to the accessibility of the game for beginners:

Drag and drop
The game is played by using HTML 5 drag and drop. Click and hold on a piece, move it to another square, and let go of the mouse button. This registers your move.
Valid move highlighting
Hovering the mouse over a piece highlights in yellow the valid squares that that piece can move to.
AI move data
Some basic data for each move the AI had available to it is displayed. The algebraic notation of each move is hoverable, showing the move on the board. The computed evaluation of the move is shown, as well as the number of boards evaluated and the number of branches skipped by the alpha-beta algorithm.
Play for me
You can have the computer choose what it believes is the best move for you. This also allows you to watch the computer play itself.
Analyze my play
You can use the AI to evaluate the move that you picked and suggest other moves that it believes are better.

Current Engine

Play now!