How the 0–100 Board Score Is Calculated

Every board shown with Balanced resources on is the highest-scoring of 30 candidates. This page gives the four penalties with their exact weights and the selection loop, then rebuilds one board’s score from the numbers the tool prints.

The score in one formula

Every board starts at 100 and loses points for four measurable defects. The result is clamped to 0–100 and rounded to a whole number. The function is analyze() in src/app.js:

score = round( clamp( 100 − 18×red − 4×same − 150×dev − 0.6×spread, 0, 100 ) )

TermWhat is countedWeightOn a default board
redAdjacent hex pairs where both numbers are 6 or 8−18 per pair0 while the no-adjacent-6/8 rule holds
sameAdjacent hex pairs of the same terrain, desert excluded−4 per pair0–9 pairs on 3–4 players (14 on 5–6) while the resource rule holds: one same-resource neighbour per hex
devThe largest gap between a resource’s share of the board’s pips and its share of the non-desert hexes−150 × dev; one percentage point costs 1.5Usually ≤7 percentage points (≤10.5 points): the rule rejects more skew, up to the retry cap below
spreadPips at the best intersection minus pips at the sixth-best marked intersection−0.6 per pipBoard-dependent; 4 pips in the worked example

One touching 6/8 pair costs as much as 4.5 same-resource pairs, so adjacent red numbers are the defect the formula punishes hardest. The label next to the score comes from the same script: 85–100 Excellent, 70–84 Good, 55–69 Fair, under 55 Unbalanced.

Measured over 4,000 generated 3-4 player boards: median 75, 90th percentile 82, and 85+ about one board in twenty. The label is a band, not a percentile — most rule-compliant boards land in the 70s, and a board only reaches Excellent when every rule holds and the six start spots are close together.

Worked example: the best of 30 candidates for seed method-demo

Generated hex board, seed method-demo3-4 players, seed method-demo: score 86/100, 0 touching 6/8 pairs, 2 same-resource pairs, largest pip skew 2.30 percentage points, start spread 4 pips. The six best starting intersections are numbered 1-6.2:1 Ore harbor2:1⛰️3:1 harbor3:12:1 Wood harbor2:1🌲2:1 Wheat harbor2:1🌾2:1 Brick harbor2:1🧱2:1 Sheep harbor2:1🐑3:1 harbor3:13:1 harbor3:13:1 harbor3:1Ore 12, 1 pips⛰️12•Wheat 2, 1 pips🌾2•Ore 6, 5 pips⛰️6•••••Sheep 11, 2 pips🐑11••Wood 4, 3 pips🌲4•••Sheep 3, 2 pips🐑3••Wheat 5, 4 pips🌾5••••Brick 9, 4 pips🧱9••••Wood 8, 5 pips🌲8•••••Brick 10, 3 pips🧱10•••Wood 11, 2 pips🌲11••Ore 10, 3 pips⛰️10•••Brick 5, 4 pips🧱5••••Sheep 4, 3 pips🐑4•••Desert, no number token🏜️Wheat 9, 4 pips🌾9••••Wheat 8, 5 pips🌾8•••••Wood 3, 2 pips🌲3••Sheep 6, 5 pips🐑6•••••♟Best start 1: 13 pips, 2 resources1Best start 2: 12 pips, 3 resources2Best start 3: 11 pips, 3 resources3Best start 4: 11 pips, 3 resources4Best start 5: 10 pips, 2 resources5Best start 6: 9 pips, 3 resources6hexboardgen.com · seed method-demo
Seed method-demo · 3-4 players · rules 1101 · score 86/100 (Excellent) · open this board
Generated 2026-11-01 by src/app.js; board drawn by build.py.

Rules code 1101 = no adjacent 6 & 8 on, no same numbers touching on, no 2 & 12 touching off, balanced resources on. The link in the caption reloads this exact board.

Under the score, the tool prints the inputs it used — this is that line on this board:

Red 6/8 touching: 0 · same-resource pairs: 2 · max pip skew: 2.3% · best start spots: 13, 12, 11, 11, 10, 9 pips

🌲 Wood: 12 pips🐑 Sheep: 12 pips🌾 Wheat: 14 pips🧱 Brick: 11 pips⛰️ Ore: 9 pips
TermValue on this boardPoints
red0 touching 6/8 pairs0
same2 same-resource pairs−8
dev2.30 percentage points: brick holds 11 of the 58 pips (19.0%) against a 16.7% hex share. The tool prints 2.3%.−3.45
spread13 pips at the best start, 9 at the sixth−2.4
Score100 − 8 − 3.45 − 2.4 = 86.1586

The six marked intersections, in the order the tool numbers them. No two of them share more than one hex — that is how the list is chosen.

MarkIntersectionPipsDifferent resources
1Brick 9 · Wood 8 · Brick 5132
2Brick 5 · Sheep 4 · Wheat 8123
3Ore 6 · Sheep 3 · Wheat 5113
4Wood 8 · Brick 10 · Sheep 4113
5Sheep 11 · Wood 4 · Wood 8102
6Wheat 5 · Wood 11 · Ore 1093

How the 30 candidates are generated and picked

  1. A click makes 30 boards. The page takes the base seed (typed, or six random characters) and generates candidate 0 from it, candidate 1 from seed#1, and so on up to seed#29.
  2. Each candidate must pass your rules. Terrain is shuffled and rejected when a hex touches more than one hex of its own terrain (with Balanced resources on). Number tokens are shuffled onto the 18 or 28 number hexes and rejected when two 6/8 touch, when equal numbers touch, when two 2/12 touch (each only if that rule is on), or when any resource’s pip share is more than 7 percentage points from its hex share (with Balanced resources on). The loops give up after 5,000 terrain and 20,000 number attempts and keep the last layout, so a seed that cannot satisfy a rule can slip through.
  3. Every surviving candidate is scored with the four-term formula.
  4. The highest score wins. The comparison is strict, so a tie keeps the earlier candidate: on this seed #23 and #28 both score 85, and neither is the winner because #4 scores 86.

The rule switches are part of the random seed (seed + "|" + player count + "|" + rule settings), so changing one rule reshuffles all 30 candidates instead of filtering the same set. The candidate count is conditional too: with Balanced resources off, the page generates a single board and this loop never runs, which is why unchecking that rule can drop the score sharply.

The share URL stores only the base seed, the player count and the four switches. Opening it regenerates the board: with Balanced resources on, all 30 candidates are rerun and the same winner comes back; the 29 other boards are not kept.

All 30 scores for this seed, in generation order. The highlighted cell is the winner; #23 and #28 tie at 85 behind it.

#0#1#2#3#4#5#6#7#8#9
67777876868177717468
#10#11#12#13#14#15#16#17#18#19
82718280757981746878
#20#21#22#23#24#25#26#27#28#29
74757985767582758570

Lowest 67 · median 76 · highest 86. Candidate #0 — the board a single-shot generator would have shown — scored 67. On this seed the selection step is worth 19 points, and the candidate you see is not the first one that passed the rules.

What the score does not measure

The other half of reading a board is in how the per-resource pip totals work; the odds behind the pips are on the dice probability chart, and the rule list is on balanced board rules.

Questions

Why did the same seed give me a different board after I changed a rule?

The four rule switches are part of the string that seeds the random generator: seed, player count and the rule settings. Turning one off produces a different sequence for every one of the 30 candidates, not a filtered copy of the previous 30.

What does the tool print besides the score?

The line under the score carries the inputs for all four penalties: red 6/8 pairs, same-resource pairs, the largest pip skew to one decimal, and the six best start values (the first minus the sixth is the spread). The score is those inputs put through the formula, rounded.

Can a board score 100?

The score is rounded, so 100 needs the four penalties to total 0.5 or less. A fair share is rarely a whole number of pips (4/18 of 58 is 12.89), so some rounding skew almost always remains; 85 and up is the practical top band.

Is 30 candidates a tuned number?

No. The count is fixed in the script: 30 when Balanced resources is on, 1 when it is off. It is the number of boards one click generates, not a measured optimum.

Next step → See how resource pips work

Updated 2026-11-01 · about & methodology

More tools & guides

Don’t own the game yet?

HexBoardGen works with the base game and the 5-6 player extension. Check prices on Amazon.

Get new board modes first

One email when we add a new generator mode or guide. No spam.