works on #40 Reviewed-on: #44 Co-authored-by: Josh <josh@joshuaschuett.com> Co-committed-by: Josh <josh@joshuaschuett.com>
Chess Engine in C
Build a clean, fast chess engine in C that starts from a FEN string and produces fully legal moves, verified via PERFT for correctness and speed.
🤖 My Bot on Lichess
- 👉 joshsbot on Lichess https://lichess.org/@/joshsbot
- 🎮 Live games https://lichess.org/@/joshsbot/playing
- 👉 Browse all Lichess bots https://lichess.org/player/bots
Approach
- Correctness-first engine:
FEN → board → legal movegen → PERFT
FEN (Forsyth–Edwards Notation)
FEN is a single line string that describes a chess position. Format:
<pieces> <side> <castling> <en-passant> <halfmove> <fullmove>
- pieces: 8 ranks (8→1) separated by
/; letters for pieces (PNBRQK/pnbrqk), digits for empty squares. - side:
w(White) orb(Black) to move. - castling: any of
KQkqor-if none. - en-passant: target square after a two-step pawn move, or
-. - halfmove: moves since last pawn move/capture (50-move rule).
- fullmove: move number (starts at 1, increments after Black’s move).
Example (starting position)
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
- pieces: starting layout
- side:
w(White to move) - castling:
KQkq(both sides can castle both ways) - en-passant:
- - halfmove:
0 - fullmove:
1
Perft Testing A Chess Engine
Perft (“performance test”) walks the move tree without move evaluation and counts nodes at certain depths in the tree. It’s a standard way to verify an engine's move generation + make/unmake (or make-on-copy) are correct. It's important to understand that the node counts have been generated and verified by the chess programming community, meaning that these counts are a reliable reference point for a chess engine to match against.
What perft checks
- Legality filtering: no moves that leave your own king in check.
- Special rules: castling path/rights, en passant (incl. pinned-EP edge case), promotions.
- State integrity: side-to-move flips; occupancy stays consistent.
Start-position reference counts
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
- d1 = 20
- d2 = 400
- d3 = 8,902
- d4 = 197,281
- d5 = 4,865,609
- d6 = 119,060,324
Other Positions
The chess programming wiki provides several other starting positions to test. They can be found here.
PERFT Results & test positions: https://www.chessprogramming.org/Perft_Results
Future Work
-
Incorporate algorithms and evaluation methods for chess positions to enable an AI player.
-
Build an API to facilitate chess games with the AI player over the web.
- Starting with a commandline client.
- Later building a web based client.
Chess Engine Programming & Information
- Chess Programming Wiki (CPW): https://www.chessprogramming.org/
- PERFT (definition & methodology): https://www.chessprogramming.org/Perft
- PERFT Results & test positions: https://www.chessprogramming.org/Perft_Results
- FEN reference: https://www.chessprogramming.org/Forsyth-Edwards_Notation
- Bitboards https://www.chessprogramming.org/Bitboards