Files
chess/README.md
Josh e068ca499c
All checks were successful
Build & Push Package / package-and-push (push) Successful in 9s
Python tests (make) / test (push) Successful in 12s
add-lichess-bot-links-to-readme (#38)
Reviewed-on: #38
Co-authored-by: Josh <josh@joshuaschuett.com>
Co-committed-by: Josh <josh@joshuaschuett.com>
2025-08-29 18:04:51 +00:00

3.1 KiB
Raw Permalink Blame History

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

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