EDIT (April 24th 2023): I created another notation, which I think it better. Its description is a bit more formal, but it's just as usable, by both humans and computers.
As far as I'm aware, at the time of writing (August 2022) the only prior work on an open and public notation for Settlers is SGN: Settlers-Game-Notation by dnmfarrell.
HSGN is not meant to compete with SGN. The goal of HSGN differs from the goal of SGN. SGN is a notation for computers. HSGN however, is designed as a notation that humans can easily read and write.
I developed this notation to annotate live games with pen and paper, for post-game review.
The land hex coordinates have letters as follows:
i h g
j q p f
k r s o e
l m n d
a b c
The sea hex coordinates are written with a z.
Examples:
- The sea hex that only touches a is called za.
- The sea hex that touches both a and b is called zab.
Crossroads are identified by the three hex coordinates that the crossroad touches. If it can be inferred what sea tile is meant, it may be abbreviated with just z.
Examples:
- The crossroad that touches l, m and r is called lmr.
- The crossroad that touches zab, a, and b is called zabab, or abbreviated zab.
- The crossroad that touches k, zkj, and j is called kzkjj, or abbreviated kzj.
- The crossroad that touches zk, k and zkj is called zkkzkj, or abbreviated: zkzkj.
- The crossroad that touches zkl, zk and l is called zklzkl, or abbreviated: zklzk.
Edges are identified by the two hexes that the edge touches.
Example: The edge that touches m and n is called mn.
Resource | Code |
---|---|
Brick | B |
Grain | G |
Lumber | L |
Ore | O |
Wool | W |
A combination of multiple resources is notated like a chemical formula. The number 1 is optional.
Examples:
- 1 lumber is notated as L1, or just L.
- 2 grain is notated as G2.
- 2 brick, 3 ore, and 5 wool is notated as B2O3W5.
If a hex type yields a certain resource, then the hex type is notated with the same notation as that resource. Otherwise, the hex type gets its own letter.
Hex | Resource | Code |
---|---|---|
Forest | Lumber | L |
Pastures | Wool | W |
Fields | Grain | G |
Hills | Brick | B |
Mountains | Ore | O |
Desert | - | D |
Sea | - | Z |
Players are notated with a p followed by a number.
The bank is kind of a special player, called b.
Examples:
- b is the bank.
- p1 is the first player.
- p2 is the second player.
If it's easier to use letters for the players, for example, in notating a game between Alice, Bob, and Charlie, you may use two characters instead. So Alice could be al, Bob could be bo, and Charlie could be ch.
Rolling is notated with just the number that was rolled (the sum of the two dice).
Examples:
- 3+5 was rolled: 8.
- 7 was rolled: 7.
Moving the robber is notated as MRx, where x is the notation for the new location of the robber.
Examples:
- Move the robber to hex coordinate b: MRb.
- Move the robber to hex coordinate f: MRf.
Discarding cards (when 7 is rolled) is notated as Dx(y), where x is the notation for the player discarding, and y is the formula notation for the cards that are discarded.
Examples:
- Player one discards two ore and one wool: Dp1(O2W)
Stealing a card from another player is notated as Sx (S for steal), where x is the notation of the player whom a card is stolen from.
Examples:
- Steal a card from player one: Sp1.
- Steal a card from player two: Sp2.
Building a village is notated as BVx, where x is the notation of the crossroad which the village is built on.
Examples:
- Build a village on mns: BVmns.
- Build a village on fgz: BVfgz.
Building a city is notated as BCx, where x is the notation of the crossroad which the city is built on.
Building a road is notated as BRx, where x is the notation of the edge which the road is built on.
Buying a development card is notated as BD.
Playing a knight is notated with PK.
Playing a Year of Plenty card is notated with PY(x), where x is the formula notation for the two free resources the player gets.
Playing a Monopoly card is notated with PM(x), where x is the resource notation that is claimed.
Playing a Road card is notated with PR(x, y), where x is the first road location, and y is the second road location.
Trading with another player is notated as Tx(y, z), where x is the player that is traded with, y is the formula for what the current player gives, and z is the formula for what the other player gives in return.
Examples:
- Trade one wool and one brick for two ore with player two: Tp2(WB, O2).
- Trade four ore for one brick with the bank: Tb(O4, B).
A turn is notated as a sequence of actions, separated by comma's. A turn notation always ends with a period. A turn's notation optionally includes what player's turn it is, in the front, like p1:.
Examples:
-
It's player one's turn. They roll two fours and then end their turn.
p1: 8.
-
It's player three's turn. They roll a four and a two, and then trade with player two. Player three gives player two one lumber and one ore. Player two gives two wool in return:
p3: 6, T2(LO, W2).
-
It's player one's turn. They roll 4. Then it's player two's turn. They roll 6. Then it's player three's turn. They roll 8.
4.p2: 6.8.
#!/usr/bin/env python3
import math
import re
import random
boards = [
"""
A l k
b m r j
c n s q i
d o p h
e f g
""",
"""
c b A
d n m l
e o s r k
f p q j
g h i
""",
"""
e d c
f o n b
g p s m A
h q r l
i j k
""",
"""
g f e
h p o d
i q s n c
j r m b
k l A
""",
"""
i h g
j q p f
k r s o e
l m n d
A b c
""",
"""
k j i
l r q h
A m s p g
b n o f
c d e
""",
]
stages = [
list("blm"),
list("ck"),
list("bclkm"),
list("nrnr"),
list("bclkmnr"),
list("djsdjs"),
list("bclkmnrdjs"),
list("oqoq"),
list("bclkmnrdjsoq"),
list("eiei"),
list("bclkmnrdjsoqei"),
list("pgpg"),
list("bclkmnrdjsoqeipg"),
list("fhfh"),
list("bcdefghijklmnopqrs"),
list("cgeik"),
list("nopqrm"),
list("bcdefghijkl"),
list("mspg"),
list("bnof"),
list("lrqh"),
list("kji"),
list("cde"),
]
print("\033c\033[3J", end="")
for idx, stage in enumerate(stages):
repetition = 3
remaining = [x for x in stage] * repetition
while remaining:
percentage = math.floor(
(1.0 - len(remaining) / (repetition * len(stage))) * 100
)
print(f"level {idx}")
print("[" + "=" * (percentage - 1) + "." * (99 - percentage) + "]")
answer = random.choice(remaining)
board = random.choice(boards)
question_board = "".join(
["." if x in stage else x for x in board.replace(answer, "?")]
)
print(question_board)
tries = 0
while True:
given = input("?: ")
tries += 1
if given == answer:
print("\033c\033[3J", end="")
break
else:
print(f"Incorrect. The correct answer is {answer}.")
if tries == 1:
remaining.remove(answer)
else:
remaining.append(answer)