Sapphire Chess
Sapphire Chess is a command line-based chess game with an algebraic notation input system, complete chess rules, a beautiful interface and a functional AI. It provides three game modes: Human vs. Human, Human vs. AI, and AI vs. AI.
Please, visit https://medium.com/@lucas.sorribes/nostromo-my-ruby-chess-journey-part-i-7ef544b547a5 for a very detailed account of how I wrote this game.
Supported Rubies: 3.1, 3.0, 2.7.
The game has not been tested on older versions, but it might still work.
Playing within the VS Code terminal is highly recommended because it renders the icons better.
Current Features
- A beautiful board with easy-to-distinguish colors for white and black pieces.
- Fully functional AI
- Three levels of difficulty.
- Three game modes: human vs. computer, human vs. human.
- Full chess movement rules implementation, including castling and en passant, for both the human and the computer player.
- Accepts algebraic notation for movements, with human input validation.
- Material score display.
- Player's last move display.
Easy Setup (run containerized version; with Docker)
Simply, build the image (it's very lightweight) with:
docker build -t sapphire-chess .
And run it with:
docker run -it sapphire-chess
Setup
Install with:
gem install 'saphhire-chess'
And execute from the command prompt with:
sapphire-chess
Currently, the icons are only loaded properly from within VS Code terminals, so, for the moment, I highly recommend executing this command from there.
You can also create a new .rb
file with this content and execute it:
require 'sapphire-chess'
Engine.new.play
Difficulty Mode
The difficulty mode is based on how many turns the computer can think ahead (the depth of the tree generated by AI#minimax
, max. 3), the aggressiveness of the pieces, and the enemy's carelessness.
My recommendation is to play the game on the hard mode, as this was the original intention when I designed it. I introduced the other difficulties based on the suggestions from those who weren't able to beat the machine. However, the hard mode, due to the current Minimax implementation, is a little slow; I'm working on ways to improve the performance of this method.
Screenshot
The AI
The AI is based on a Minimax algorithm with Alpha-Beta pruning. This algorithm generates possible outcomes (children) for a provisional move: Each branch represents the enemy's possible move in the next turn as an answer to the provisional move; (i.e.: if current player is white [the maximizing player], it generates every possible movement for the next player, black [the minimizing player], who will choose the best possible move, and so on.
The best (relative to each player) possible outcome for each move will determine what move is chosen) The Alpha-Beta 'prunes' the tree: it makes the search more efficient, removing unnecessary branches, resulting in a faster process.
Lucas Sorribes, released under the MIT license.