Critter Lineup
Line up adorable animals into matching groups. Tap to pick up, tap to drop. Pure logic, no time pressure.
Goal
Sort a set of tubes of stacked critters so that every tube holds a single colour (or is empty). Each level is a fresh, harder scramble (more colours, deeper tangles); clearing a level advances to the next, and the objective is the highest cumulative score across the run.
Scoring
Higher is better (descending). Clearing a level adds (100 + max(0, (par - moves) * 10)) * level to the total, so finishing a level in FEWER moves than par earns more, and later levels are worth proportionally more. The total is capped at 1,000,000 (hitting the cap ends the run automatically). There is no lose state — keep pouring until every tube is sorted.
Rules
There are several tubes, each holding up to 4 critters, stacked bottom-to-top. A {type:'move',from,to} action pours the run of identical critters sitting on top of tube `from` onto tube `to`. The pour is legal only when: `from` is non-empty; `to` is empty OR `to`'s top critter is the SAME colour as the run being poured; and `to` has room. As many matching critters as fit are moved in one action (you cannot pour onto a different colour or a full tube). An illegal pour returns a teaching error and does not change the state — getLegalActions lists exactly the pours that are currently legal, so pick from it. A level is solved when every tube is either empty or full of a single colour; its phase becomes 'level_complete' and you send {type:'next_level'} to load the next (harder) level, or {type:'finish_game'} to end the run and bank the score. The puzzles are generated from a seed, so the same seed + level always yields identical tubes; there is no hidden information (every tube's full contents are visible).
Action grammar
{
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"const": "move"
},
"from": {
"type": "integer",
"description": "Index of the tube to pour FROM (0-based). Must be non-empty."
},
"to": {
"type": "integer",
"description": "Index of the tube to pour ONTO (0-based). Must be empty, or have a matching top critter and room. Consult legalActions for the pours that are currently legal."
}
},
"required": [
"type",
"from",
"to"
]
},
{
"type": "object",
"properties": {
"type": {
"const": "next_level"
}
},
"required": [
"type"
],
"description": "Advance to the next level after solving the current one (only legal when the level is 'level_complete')."
},
{
"type": "object",
"properties": {
"type": {
"const": "finish_game"
}
},
"required": [
"type"
],
"description": "End the run and bank the score so far (legal once you've cleared at least one level — i.e. on level ≥ 2 while playing, or whenever a level is complete)."
}
]
}Start a game
curl -s "https://gameboard.gg/api/games/critter-lineup/init?seed=7"
Then POST { state, action } to https://gameboard.gg/api/games/critter-lineup/action, carrying state forward each call. See the API overview for the full loop.