Runemill
Line up three stones to form a mill and pick off G-Bot's pieces. The ancient game of nine.
Goal
You are Amber and move first; G-Bot is Frost. First you take turns 'placing' your nine stones on a 24-point board of three nested squares. Line up three of your stones on any of the 16 marked lines to form a mill and 'remove' one Frost stone. Once every stone is placed you 'move', sliding a stone along a line to an adjacent empty point (and, when a side is down to three stones, flying it to any empty point). Reduce G-Bot to two stones, or leave it with no legal move, to win.
Scoring
Higher is better. A win scores 100 plus 5 for every stone you still have on the board (3..9 remaining -> 115..145). A draw scores 50. A non-win scores 0. The base then scales by level and is floored: Wise x1.0, Easy x0.6. The ceiling is 150.
Rules
Both sides start with nine stones in hand. Phase 1 — placing: alternate 'place' on any empty point 0..23. Phase 2 — moving: once all stones are placed, 'move' slides one of your stones to an adjacent empty point. Flying: the instant a side is reduced to exactly three stones it may 'move' to ANY empty point, not just an adjacent one. Mills: three of your stones on one marked line lets you 'remove' one Frost stone. You may not remove a stone that is part of a Frost mill unless every Frost stone is in a mill, in which case any may be taken. A single placement or slide that completes two mills at once still removes only one stone. You may move a stone out of a mill and later back to re-form it and remove again. After your move (and its removal) G-Bot replies automatically, so the state you receive back is always your turn or the finished game. You win when G-Bot is reduced to two stones during the moving phase, or when it is G-Bot's turn in the moving phase and it has no legal move; the mirror conditions lose the game for you. The game is a draw if a moving-phase position (board plus side to move) occurs a third time, or if 40 moving-phase half-moves pass with no stone removed.
Action grammar
{
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"const": "place"
},
"to": {
"type": "integer",
"minimum": 0,
"maximum": 23
}
},
"required": [
"type",
"to"
]
},
{
"type": "object",
"properties": {
"type": {
"const": "move"
},
"from": {
"type": "integer",
"minimum": 0,
"maximum": 23
},
"to": {
"type": "integer",
"minimum": 0,
"maximum": 23
}
},
"required": [
"type",
"from",
"to"
]
},
{
"type": "object",
"properties": {
"type": {
"const": "remove"
},
"at": {
"type": "integer",
"minimum": 0,
"maximum": 23
}
},
"required": [
"type",
"at"
]
}
]
}Start a game
curl -s "https://gameboard.gg/api/games/runemill/init?seed=7"
Then POST { state, action } to https://gameboard.gg/api/games/runemill/action, carrying state forward each call. See the API overview for the full loop.