Asher Pfeifer · How Catan Is Won

Project summary · October 2026

The nine chapters

How the Catan simulation was built and what each experiment found, in the order it happened

How to read this document

This project builds an economic model of the board game Catan from simulated games. It started as a rules-exact engine with six rule-based bots, then grew a playable hidden-information version and two rounds of strategy research.

Each chapter covers one change to the approach, the strategy or the tooling, in the order it happened. Every chapter links its own spreadsheet with the same tabs, so you can compare chapters side by side:

TabWhat it holds
Bot weightsThe ~35 weights of every bot that played in that chapter
Win ratesWin rate per bot (with 95% confidence interval), by seat where measured
Game statsGame length, victory points, builds, trades and other per-game figures
Chapter extrasResults specific to that chapter (prices, scenario tables, validation)

All numbers come from the project's own data in the project data folder. A 95% confidence interval (CI) is given wherever a difference matters. A gap is only treated as real when its CI excludes zero.

1Initial setup: engine, simulation and bots

The project began as a rules-exact engine for base Catan, played by six styles of one rule-based bot. Across 100,000 simulated games, balanced won most often: 32.5% against a 25% fair share.

Workbook: ch1_initial_setup.xlsx

The rules engine

Simulation style

The bots

All six styles are the same bot with different weights. It scores each possible build (city, settlement, expansion, Longest Road, dev card) in victory-point terms and discounts it by how many turns away it is. Every build, trade, discard and card play compares that score before and after. About 34 weights set the style:

StylePlan in one lineDistinctive weights
balancedDefault: no strong biasall defaults
ore_wheat_cityCities firstore 1.6, wheat 1.5, city priority 1.5
expansionRoads and settlements, Longest Roadwood/brick 1.6, settlement 1.5, road 1.3
dev_armyDev cards and Largest Armydev priority 1.8, army 1.3, knight eagerness 0.8
port_traderPorts and heavy tradingspecific port 3.5, generic port 2.5, trades at zero margin
hoarderBarely tradesaccept greed 0.2, embargoes anyone at 7 VP

In the dataset each game draws its four seats from these styles. Every weight gets random noise (jitter 0.15), so the data covers a continuum of play styles. An evolutionary tuner was also built. It only had a 3-generation pipeline test (32.5% on 200 validation games), not a full run.

Baseline dataset: 100,000 games

2Live play with hidden information

The game became playable in a browser against three bots of your choice. Nobody, bot or human, can see another player's cards any more. Replaying 20,000 baseline games this way changed no style's win rate by more than 1 point, so chapter 1's results hold under real-game information.

Workbook: ch2_hidden_information.xlsx

What changed

Results: the same 20,000 games, with and without hidden hands

StylePerfect informationHidden handsChange (95% CI ±)
balanced32.3%31.9%−0.5 pts (±1.1)
dev army28.5%28.6%0.0 pts (±1.1)
ore/wheat city25.8%26.6%+0.8 pts (±1.1)
hoarder24.7%25.0%+0.3 pts (±1.0)
expansion20.0%19.8%−0.2 pts (±1.0)
port trader18.5%18.1%−0.4 pts (±0.9)

3Reactive strategy, stage 1: pick a style before setup

Choosing a style before placement, from the board and the seat, did not beat simply playing balanced. On fresh boards the reactive bot gained +0.4 points (95% CI −0.7 to +1.4), and with hidden hands it lost −1.0 points (−3.0 to +0.8).

Workbook: ch3_reactive_stage1.xlsx

What changed

Results

MeasureReactiveBalancedDifference (95% CI)
Held-out scenarios from the lab35.9%35.7%+0.1 pts (−0.5 to +0.8)
Fresh boards, perfect information35.9%35.5%+0.4 pts (−0.7 to +1.4)
Fresh boards, hidden hands34.7%35.7%−1.0 pts (−3.0 to +0.8)

What it pointed to

The scenario edge is real but not where we looked:

That finding set up chapter 4.

4Reactive strategy, stage 2: re-plan after setup

Placing like balanced and then switching to port trader's trading style beats balanced: +2.0 points on fresh boards (95% CI +1.3 to +2.7), and +1.5 with hidden hands (+0.2 to +2.8). It is the first bot to clearly beat balanced.

Workbook: ch4_reactive_stage2.xlsx

What changed

Results

After the same balanced setup, continue asWin rateEdge over balanced (95% CI)
port trader36.7%+1.3 pts (±0.8)
balanced35.4%—
expansion30.7%−4.6 pts
dev army28.4%−7.0 pts
ore/wheat city27.7%−7.6 pts
hoarder26.9%−8.4 pts
Validation on fresh boardsRe-plan botBalancedDifference (95% CI)
Perfect information (24,000 paired games)37.2%35.2%+2.0 pts (+1.3 to +2.7)
Hidden hands (8,000 paired games)37.6%36.1%+1.5 pts (+0.2 to +2.8)

The lesson: a style's result is mostly decided by where it settles, and much less by how it plays afterwards.

5Reactive strategy, stage 3: hybrid tuning

Placing like balanced and then playing with evolved weights wins about 45% of games against the usual field. That is +9.6 points over balanced with hidden hands (95% CI +8.3 to +10.8) and +9.2 with perfect information (+7.9 to +10.6), several times chapter 4's gain.

Workbook: ch5_hybrid_tuning.xlsx

What changed

Results

Validation on fresh boardsBalancedStage 2 (balanced → port trader)TunedTuned − balanced (95% CI)Tuned − stage 2 (95% CI)
Perfect information (24,000 games)35.6%36.9%44.8%+9.2 pts (+7.9 to +10.6)+7.9 pts (+6.6 to +9.4)
Hidden hands (24,000 games)35.5%35.6%45.1%+9.6 pts (+8.3 to +10.8)+9.4 pts (+8.1 to +10.8)

What the tuner changed

It kept port trader's eager trading and made it an eager builder: every build priority roughly doubled, and it stopped valuing cards held in hand.

WeightPort traderTunedWhat it means
City priority1.001.99Values building a city twice as much
Settlement priority1.001.91Same for settlements
Road priority0.801.58Same for expanding by road
Dev card priority0.801.50Buys development cards more readily
Production weight1.001.75Credits a build more for its future income
Horizon20 turns9 turnsCounts income over a shorter future
Patience (tau)3.02.0Discounts builds it can't afford soon more steeply
Card value0.030.00Cards in hand are worth nothing in themselves
Diversity weight0.51.4Prefers new spots that add resources it lacks
Bank/port trade minimum gain−0.01+0.06Trades with the bank only for a real gain
Monopoly minimum4 cards7 cardsSaves Monopoly for a big haul
Longest Road drive0.500.20Chases Longest Road less
2:1 port weight3.52.0Values new 2:1 ports less

Player trading stayed at port trader's settings or got slightly more generous (it still tries a trade every turn and counters 99% of the time).

One caveat: the tuned bot was trained and tested against the six presets. It has not yet been tested against copies of itself, so part of its edge may come from exploiting how the presets play. Chapter 6 tests this.

6Robustness test: the tuned bot against other fields

The tuned bot's edge is not an exploit of the presets. Against copies of itself it still beats balanced by +8.0 points (95% CI +6.8 to +9.2), and it gains 8–10 points in every field tested.

Workbook: ch6_tuned_robustness.xlsx

What changed

Results

Opponent field (hidden hands)BalancedStage 2TunedTuned − balanced (95% CI)Tuned − stage 2 (95% CI)
Six presets (chapter 5)35.5%35.6%45.1%+9.6 pts (+8.3 to +10.8)+9.4 pts (+8.1 to +10.8)
All tuned (self-play)19.0%20.4%26.9%+8.0 pts (+6.8 to +9.2)+6.6 pts (+5.4 to +7.8)
All balanced28.0%29.3%38.2%+10.2 pts (+8.8 to +11.6)+8.9 pts (+7.6 to +10.2)
Half tuned, half presets25.7%27.4%34.1%+8.5 pts (+7.2 to +9.7)+6.8 pts (+5.5 to +8.1)

7MCTS bot

Adding search on top of the tuned bot has not beaten it yet. The best version ties it with hidden hands (43.3% each, difference +0.0 points, 95% CI −4.7 to +4.8). The first version lost 6.5 points because its simulations assumed every opponent plays like the tuned bot.

Workbook: ch7_mcts_bot.xlsx

What changed

Results

Run (hidden hands unless noted)Search settingsTunedMCTSMCTS − tuned (95% CI)
Version 1, perfect information (600 pairs)opponents modelled as tuned; 8-turn rollouts, 48 per decision43.2%39.0%−4.2 pts (−8.8 to +0.7)
Version 1 (600 pairs)same42.3%35.8%−6.5 pts (−11.5 to −1.8)
Version 2 (600 pairs)opponents drawn from the six presets; 16-turn rollouts, 96 per decision43.3%43.3%+0.0 pts (−4.7 to +4.8)

8MCTS override guards

Requiring an override to be statistically significant turned the MCTS bot from a tie into the best bot so far: it beats tuned by 11.8 points (CI +7.3 to +16.5) with hidden hands.

Workbook: ch8_mcts_guards.xlsx

What changed

Results

Bot (600 pairs each, hidden hands)GuardsWin rate− tuned (95% CI)− version 2 (95% CI)
Tuned—43.3%——
Version 2 (chapter 7)none43.3%+0.0 pts (−4.7 to +4.8)—
Skip trade steps148.2%+4.8 pts (+0.2 to +9.3)+4.8 pts (+0.2 to +9.5)
Significance test255.2%+11.8 pts (+7.3 to +16.5)+11.8 pts (+7.5 to +16.7)
Both1 + 250.0%+6.7 pts (+2.5 to +10.8)+6.7 pts (+2.0 to +11.7)

9What makes tuned beat balanced

Tuned's edge is built in the early and mid game from a few habits: building roads instead of ending the turn, proposing more player trades, and holding monopoly cards for a bigger payoff. Two are general rules that pay every time: build the road rather than end the turn, and propose a trade rather than end the turn. The others depend on the moment. Only monopoly can be predicted, by a 7-card threshold.

Workbook: ch9_decision_attribution.xlsx

What changed

Results

Balanced would … → tuned does …Times per gameEdge (pts per game)Value each timeTuned's move betterLinked tuned weight
End the turn → build a road1.3+3.3+2.687%road priority ×2.0
End the turn → propose a trade8.6+2.9+0.357%offers trades slightly in the partner's favour; counters ×2
Trade with the bank → propose a trade2.4+2.0+0.859%same
Play monopoly → end the turn0.7+1.9+2.565%plays monopoly only for ≥7 cards, not ≥4
Propose a trade → build a road1.0+1.3+1.357%road priority ×2.0
End the turn → trade with the bank0.9+1.2+1.359%—

General rule or the moment? (richer features)

About half of tuned's edge comes from two general rules and half from decisions whose value depends on the moment. Among the moment-dependent ones, only the monopoly choice can be predicted, by how many cards it would take.

Replaying the 600 games added 77 features per decision: hand by resource, what the hand affords, expansion room, the road and army races, the robber, and what each move does (whether a trade completes a build, whether a road opens settlement room, the cards a monopoly would take). Every replayed move matched the stored one.

Kind (balanced → tuned)Edge (pts per game)TypeFeatures explain
End the turn → build a road+3.3General: +2.6 every time—
End the turn → propose a trade+2.9General: small (+0.3) but every time—
Trade with the bank → propose a trade+2.0Situational0%
Play monopoly → hold it+1.9Situational10%
Propose a trade → build a road+1.3Situational0%
End the turn → trade with the bank+1.2Situational0%
Choose a different trade partner−0.4Situational3%

Next: the same analysis on the MCTS significance-test bot against tuned, to see whether the search finds the moments the habits miss. Then parameter ablations (tuned with one weight set back to balanced) to confirm which weights cause each habit.

Across all chapters

Eight changes and about 987,000 simulated games later, the best bot places like balanced and then plays with evolved weights. It beats balanced by about 9 points with or without hidden hands, and by 8 points against copies of itself. An MCTS search on top of it, which overrides the tuned move only when the gain is significant, beats it by another 12 points. Borrowing port trader's play (chapter 4) gained 1–2 points, and reacting to the board before placement did not help.

ChapterWhat changedGames simulatedHeadline result
1 Initial setupEngine, six bot styles, perfect-information dataset100,000Balanced wins 32.5% (fair share 25%)
2 Hidden informationBrowser play; bots count cards instead of seeing hands20,000No style moves more than 1 pt
3 Reactive, stage 1Pick a style before setup from board and seat256,000+0.4 pts, not significant
4 Reactive, stage 2Balanced placement, re-plan after setup208,000+2.0 pts (CI +1.3 to +2.7)
5 Reactive, stage 3Balanced placement, evolved play weights304,000+9.6 pts hidden hands (CI +8.3 to +10.8)
6 Robustness testTuned bot against self-play, balanced and mixed fields72,000+8.0 pts in self-play (CI +6.8 to +9.2)
7 MCTS botRoot search with rollouts and a learned value model, on top of the tuned bot24,200 (+ search rollouts)Ties tuned: +0.0 pts (CI −4.7 to +4.8)
8 MCTS override guardsOverride only on a significant gain; optionally skip trade steps2,400 (+ search rollouts)+11.8 pts vs tuned (CI +7.3 to +16.5)
9 Decision attributionAnalysis: which decisions make tuned beat balanced600 (+ 1.5M rollouts)Edge built early; only the road habit is a general rule

Win rates inside chapters 3 to 5 run higher than in chapters 1 and 2: the tested bot plays exact weights against jittered opponents. So compare bots within a chapter, not across chapters.

Next step: run the chapter 9 attribution on the MCTS significance-test bot against tuned, and run parameter ablations to confirm which weights cause each habit.

Every chapter keeps a spreadsheet with the same tabs (bot weights, win rates, game stats, chapter extras). The workbooks are not online yet; ask for them by name.