78 lines
3.1 KiB
Markdown
78 lines
3.1 KiB
Markdown
# 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/all
|
||
👉 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) or `b` (Black) to move.
|
||
- **castling**: any of `KQkq` or `-` 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> |