When you build a chess engine, you stand on the shoulders of giants. Piece values were tuned decades ago. King safety, pawn structure, mobility, Stockfish has canonical implementations of all of them. You can crack open any modern engine and read a decades,long conversation about what makes a chess position good.
When you build an engine for a game you invented six months ago, none of that exists.
I've been building Larss, a 1v1 tetromino placement game that feels like Block Blast but plays like chess. Two players alternate placing pieces on a shared 11×11 to 14×14 board, filling rows, columns, and diagonals to clear cells and score. Matches take 5-10 minutes and are ~99% skill, the same piece sequence goes to both players, so wins emerge from position, not luck.
Then came the engine. Rust, iterative deepening, alpha-beta pruning, the search side was familiar territory. The hard part was the evaluation function: given a position, how good is it? This is a story about the multi-layer perceptron I built to answer that question, why I couldn't just use NNUE, and what I learned when a much simpler model beat it.
The problem: no priors, no theory, no dataset






