Revisiting Chess Programming

November 2, 2025

LearningChessComputer Science

Before starting Uni, I tried coding a chess-engine to ready my programming skills. Now, in my last semester, I want to revisit the challenge. There I can reflect upon skills gained in software engineering and algorithm design. This time, I'm programming the engine in CPP instead of java.

Here is an overview of the components of a chess-engine:

Component
Purpose
Move-generationGenerate legal moves for a position. Rules like en-passant and castling are to be considered. Move-generation can be done very efficiently using Bitboards.
SearchSearch the game-tree. Optimization and parralelisation are major challenges
EvaluationEvaluating a position. Both material value and strategy and tactics are considered. Here, neural networks can be used effectively
DatabasesProbing opening and endgame databases during the game
InterfacesInteracting with other chess programs using standard protocols like UCI

In my implementation, I used the surge as a library for move-generation and Fathom for probing of the Syzygy tablebases (endgame-databases). In the following post I want to cover interesting details of my chess-engine. The (wip) engine is published on GitHub under the name Wombat.

This is me in September 2026. A full discussion of the implementation seems pointless to me. Last year, I implemented a basic chess-engine, but ran into various issues, and stopped after achieving an erroneus but passable result, which I did not benchmark. This is the Architecture so far:

The main components are eval.cpp and search.cpp. Move-generation and the memory-representation of positions are delegated to surge. There are the following helper components:

Component
Description
EndgameDBA frontend to Fathom. It can read end-game tables if one downloads them.
OpeningDBA custom opening database query tool. The database is also custom, generated from a data-set of grand-master games
SearchThreadPoolHelps a custom implementation of parallel pv-search. (more on that see below) This was erroneus in retrospect.
TranspositionTableStores previous evaluated positions, the score can be reused while searching

Right now i gave the implementation to Claude Code with the new Opus 5.5 Model with the main purpose of fixing my search. The (single!) prompt was basically this:

001Fix and improve this engine with the goal of reaching elo 1800

The fixed engine was benchmarked against stockfish:

Stockfish Elo
Result (W-L-D)
1800200-0-0
2400110-7-3
300013-41-26

Next, I implemented / vibe-coded an NNUE (efficiently updatable neural network) with no improvement in elo, but a 25% speed-up (see below). The Rest of the Blog-Post will be a write-up on search algorithms and the NNUE-architecture. Feel free to try, although anyone except top chess players will probably have no chance: Link.

To be continued.

Principle Variation Search

Parallelization

NNUE