# 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. ## 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**: 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:** ## 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):** - **PERFT (definition & methodology):** - **PERFT Results & test positions:** - **FEN reference:** - **Bitboards**