Many different standards exist for simplified human and machine readable notation of games. Chess is a common example with notations such as Portable Game Notation (PGN) or Forsyth–Edwards Notation (FEN). While useful for chess, these notations have difficulties being applied to other games. Currently no single standard exists that can be applied to any game hence the introduction of Quibbble Game Notation (QGN) as a potential solution to this problem.
QGN is structured into two distinct sections, tags and actions.
Tags are key value pairs used to describe the initial game state as well as to store additional meta data about the game.
[key "value"]
[key "carcassonne"]
There are two tags necessary for any game, Game and Teams.
key
: the name of the game represented. Ex:[key "Carcassonne"]
teams
: the list of teams playing the game. Ex:[teams "a, b"]
Actions are an ordered list of actions teams take to create the current game state. Actions require the team, the action done, and any additional details needed to perform the action.
{team index}{action character}&{action detail 1}.{action detail 2}...
0a&1.2 // team at index 0 of list in Teams Tag does action a with details 1 and 2
1b // team at index 1 of list in Teams Tag does action b
[key "carcassonne"]
[teams "a, b"]
[seed "123"]
[completed "false"]
[date "10-31-2021"]
0c 0a&1.2 0b&1.2.k.b 1c 1c 1c 1a&0.1 1b&0.1.m {you can add
comments like so} 0a&2.2 0b&2.2.t.l
This package provides both a method of creating as well as parsing QGN text.
notation := &Snapshot{
Tags: map[string]string{"key": "carcassonne", "teams": "a, b", "seed": "123"}
Actions: []Action{
{
Index: 0,
Action: 'a',
Details: []string{"1", "2"}
},
{
Index: 1,
Action: 'c',
},
}
}
raw := qgn.String()
raw := "[key \"carcassonne\"][teams \"a, b\"][seed \"123\"]0c 0a&1.2"
notation, err := Parse(raw)