Optimal Play in Caverna: A Formal Proof of Weak Dominance

2 Scoring System

The end-game scoring function converts a player state into an integer score. This chapter formalizes the scoring rules and proves key properties that constrain the score range of any strategy.

2.1 Scoring components

Definition 2.1 Animal scoring
✓

Each farm animal (sheep, wild boar, cattle) scores \(1\) point per animal. For each of the three farm animal types not represented at all, the player loses \(2\) points. Dogs score \(0\) directly but enable sheep capacity.

Definition 2.2 Crop scoring
✓
#

Grain scores \(\lfloor (n+1)/2 \rfloor \) for \(n\) grain. Vegetables score \(1\) per vegetable.

Definition 2.3 Infrastructure scoring
✓

Small pastures score \(2\) each, large pastures \(4\) each. Ore mines score \(3\), ruby mines score \(4\). Each dwarf scores \(1\). Gold scores \(1\) per gold. Rubies score \(1\) per ruby.

Definition 2.4 Penalties
✓

Each begging marker costs \(3\) points. Each unused board space costs \(1\) point.

Definition 2.5 Total score
✓

The total score is the sum of all positive scoring components minus all penalties, plus furnishing bonus points.

2.2 Score bounds

Theorem 2.6 Missing animal penalty bound
✓
#

For any animal counts \(a\), \(\text{penaltyMissingAnimals}(a) \le 8\). (At most 4 types missing at 2 points each.)

Proof ▶

By case analysis on which animal types are present.

Theorem 2.7 No penalty with all types
✓

If a player has at least one of each farm animal type, \(\text{penaltyMissingAnimals}(a) = 0\).

Proof ▶

Each type is present, so no \(-2\) penalty applies.

Theorem 2.8 Begging is harsh
✓

For \(n {\gt} 0\), \(\text{penaltyBegging}(n) \ge 3\). In fact \(\text{penaltyBegging}(n) = 3n\) (linear).

Proof ▶

Direct from the definition \(\text{penaltyBegging}(n) = 3n\).

Theorem 2.9 Grain score monotonicity
✓
#

If \(a \le b\) then \(\text{scoreGrain}(a) \le \text{scoreGrain}(b)\).

Proof ▶

The function \(\lfloor (n+1)/2 \rfloor \) is non-decreasing.

Theorem 2.10 Worst-case unused spaces
✓

\(\text{penaltyUnusedSpaces}(24) = 24\).

Proof ▶

By computation.

Theorem 2.11 Ruby mine beats ore mine
✓
#

\(\text{scoreMines}(0,1) {\gt} \text{scoreMines}(1,0)\), i.e., a single ruby mine scores strictly more than a single ore mine.

Proof ▶

\(\text{scoreMines}(0,1) = 4 {\gt} 3 = \text{scoreMines}(1,0)\).

2.3 Global score range

We define several reference points:

  • \(\text{theoreticalMinScore} = -28\) (max penalties, zero positive).

  • \(\text{doNothingScore} = -55\) (skip all actions for 12 rounds).

  • \(\text{theoreticalMaxSum} = 202\) (sum of maxed individual categories).

  • \(\text{practicalCeiling} = 140\) (attainable upper bound).

  • \(\text{practicalFloor} = 60\) (competent-play lower bound).

Theorem 2.13 Theoretical minimum score
✓
#

\(\text{theoreticalMinScore} = -28\).

Proof ▶

By computation.

\(\text{doNothingScore} = -55 {\lt} 0\).

Proof ▶

Direct computation: 12 rounds of harvests with no food produces \(\text{doNothingBeggingMarkers} = 9\) begging markers (\(-27\) points), plus \(-24\) unused spaces, plus \(-4\) missing animal types.

Theorem 2.15 Ceiling below theoretical max
✓

\(\text{practicalCeiling} {\lt} \text{theoreticalMaxSum}\), i.e., \(140 {\lt} 202\).

Proof ▶

By computation.

Theorem 2.16 Scoring range
✓
#

\(\text{practicalCeiling} - \text{doNothingScore} = 195\).

Proof ▶

\(140 - (-55) = 195\).