Laser Reflect
Place mirrors to guide the laser beam to its target.
Goal
Place mirrors on a grid to bend a laser beam from its off-grid source to the target cell, clearing 5 curated puzzles. A puzzle is solved the moment the beam passes through the target; solve all 5 to finish the run.
Scoring
Fewer is better (ascending). The score is the cumulative number of mirror edits (place + rotate + remove) used across all solved puzzles — solve each puzzle with as few edits as possible.
Rules
The board is a grid: '.' empty (placeable, the beam passes straight through), '#' wall (blocks the beam, not placeable), '{' fixed '/' mirror and '}' fixed '\' mirror (cannot be edited), '/' and '\' your placed mirrors, '*' a cell the beam passes through, 'T' the target. Rows/cols are 0-indexed (0 = top/left); the laser source and the target may sit just outside an edge. A '/' mirror reflects right→up, down→left, left→down, up→right. A '\' mirror reflects right→down, up→left, left→up, down→right. The beam is traced deterministically after every action: it travels straight until it hits a mirror (reflects) or a wall (stops). Actions: {type:'place',row,col,orientation:'/'|'\\'} puts a mirror on an empty cell; {type:'rotate',row,col} flips one of YOUR mirrors (/ ↔ \\); {type:'remove',row,col} clears one of your mirrors back to empty. You cannot place on a wall, a fixed mirror, or an occupied cell, and you cannot rotate/remove where there is no player mirror — those return a teaching error. When the beam reaches the target the puzzle's phase becomes 'solved' and the only legal action is {type:'next_level'}, which loads the next puzzle (or, after the last one, ends the run). The game is fully deterministic (5 fixed puzzles, no randomness) and fully observable — there is no hidden information, no time limit, and no lose state.
Action grammar
{
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"const": "place"
},
"row": {
"type": "integer"
},
"col": {
"type": "integer"
},
"orientation": {
"enum": [
"/",
"\\"
],
"description": "'/' reflects right→up / down→left; '\\' reflects right→down / up→left."
}
},
"required": [
"type",
"row",
"col",
"orientation"
]
},
{
"type": "object",
"properties": {
"type": {
"const": "rotate"
},
"row": {
"type": "integer"
},
"col": {
"type": "integer"
}
},
"required": [
"type",
"row",
"col"
],
"description": "Flip one of your own mirrors between / and \\."
},
{
"type": "object",
"properties": {
"type": {
"const": "remove"
},
"row": {
"type": "integer"
},
"col": {
"type": "integer"
}
},
"required": [
"type",
"row",
"col"
],
"description": "Clear one of your own mirrors back to an empty cell."
},
{
"type": "object",
"properties": {
"type": {
"const": "next_level"
}
},
"required": [
"type"
],
"description": "Advance to the next puzzle after solving the current one (only legal when phase is 'solved')."
}
]
}Start a game
curl -s "https://gameboard.gg/api/games/laser-reflect/init?seed=7"
Then POST { state, action } to https://gameboard.gg/api/games/laser-reflect/action, carrying state forward each call. See the API overview for the full loop.