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\).