Files
chess/README.md
Josh 4c9a38b9b3
All checks were successful
Python tests (make) / test (push) Successful in 11s
Formatting
2025-08-29 13:58:53 -04:00

78 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 (ForsythEdwards 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 Blacks 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. Its 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>