7.5 KiB
Game Design Document: “Labyrinth Command”
1. Concept Paragraph
“Labyrinth Command” is a deterministic, turn-based two-player tactical maze exploration game. Two rival explorers are trapped inside a grid-shaped labyrinth and must reach the Central Beacon at the maze’s heart before their opponent. Each turn, players issue one command from a fixed grammar of movement and interaction tokens (e.g., [Move:North], [Scan], [Wait]). The maze layout, beacon position, and obstacles are generated deterministically from a single seed, ensuring reproducibility. The game is not related to any economic, negotiation, or resource-trading example—its theme focuses purely on spatial logic and exploration within a confined environment.
2. Roles and Win Condition
Roles
- Explorer A and Explorer B are rival adventurers in identical labyrinth conditions.
- Both start at distinct, opposite corners of the maze.
Objectives
- Reach the Central Beacon Cell (B) before the opponent.
- A secondary scoring system tracks proximity to the Beacon at game end if neither player reaches it within the turn limit.
Win Rule
- A player wins immediately if they enter the Beacon cell first.
- If both reach simultaneously on the same turn: Draw.
- If turn limit expires with no beacon reached: player closer (Manhattan distance) to the Beacon wins.
- If both are equally distant: Draw.
3. Turn Structure and Determinism
- The game proceeds in alternating turns, starting with Explorer A.
- Each turn = one player action followed by environment update and opponent observation.
- Turn limit: 20 turns per player (40 total).
- Maze generation and beacon placement use a seed value set at
reset, guaranteeing fully deterministic structure and outcomes for identical seeds. - All elements of randomness (e.g., obstacle positions) derive from this same seed.
4. Action Grammar (Machine-Parseable)
Allowed Action Tokens (case-sensitive):
| Token Pattern | Meaning |
|---|---|
[Move:Direction] |
Move one cell in a cardinal direction (North, South, East, West) if not blocked. |
[Scan] |
Reveal contents of adjacent cells to update the player’s visible map. |
[Wait] |
Skip the move, useful for strategic timing. |
Formal Patterns (Regex-style):
^\\[Move:(North|South|East|West)\\]$^\\[Scan\\]$^\\[Wait\\]$
Examples
| Action | Validity | Explanation |
|---|---|---|
[Move:North] |
✅ Valid | Matches move pattern |
[Scan] |
✅ Valid | Matches scan pattern |
[Wait] |
✅ Valid | Matches wait pattern |
[Move:Northeast] |
❌ Invalid | Direction not allowed |
[move:North] |
❌ Invalid | Case-sensitive mismatch |
[Attack] |
❌ Invalid | Unsupported token |
5. Game State Schema
{
"seed": 18457,
"turn_index": 6,
"max_turns": 40,
"maze_width": 7,
"maze_height": 7,
"beacon_position": [3, 3],
"cells_blocked": [[0,1],[2,2],[4,5]],
"player_states": {
"A": {
"position": [0,0],
"visible_map": [["?", "X", "?", "?"],["?", ".", ".", "?"],["?", "?", ".", "?"]],
"visited_cells": [[0,0],[1,0]],
"last_action": "[Move:South]"
},
"B": {
"position": [6,6],
"visible_map": [["?", ".", "?"],[".", ".", "?"],["?", "?", "?"]],
"visited_cells": [[6,6]],
"last_action": "[Scan]"
}
},
"transcript": [
{"player":"A", "action":"[Move:South]"},
{"player":"B", "action":"[Scan]"}
],
"winner": null,
"terminated": false
}
6. Initialization Rules
- Maze layout generated through seeded deterministic algorithm (
seedprovided or auto-generated). - Both players placed:
- Explorer A → top-left corner
[0,0] - Explorer B → bottom-right corner
[width-1,height-1]
- Explorer A → top-left corner
- Beacon placed at center
(width//2, height//2). visible_mapinitialized with limited visibility: only 3×3 region around player marked or unknown.- At
reset, each player receives:- Maze dimensions
- Starting coordinates
- Number of turns and win condition summary
7. Validation and Error Handling
Invalid Move Detection Rules
- Action not matching one of the defined regex patterns →
Invalid token format - Action would move explorer outside maze bounds →
Move out of bounds - Action would move explorer into blocked cell →
Cell blocked - Any attempt made after terminal state →
Game already finished
System calls set_invalid_move(player, reason) upon detection.
8. Terminal Conditions and Scoring
Terminal Triggers
- Player enters the Beacon cell → Win for that player.
- Both reach Beacon simultaneously → Draw.
- Turn limit reached → Compare distance to Beacon.
- Smaller Manhattan distance → Win.
- Equal → Draw.
Scoring Computation
- Winner gets
1, loser0, draw0.5. - Stored in
winnerkey as"A","B", or"Draw".
9. Player Prompt Specification
Prompt Content Outline
- Game title and theme summary
- Player’s identity (Explorer A or B)
- Current turn number and limits
- Player’s current position, visible map grid, and last known opponent action
- List of allowable command formats
- Reminder to place final command inside
\boxed{{}} - Examples of valid vs invalid formatting
Prompt Example
You are Explorer A navigating the labyrinth. Your goal is to reach the Central Beacon before your rival.
You can issue ONE command per turn using the following grammar:
[Move:North] | [Move:South] | [Move:East] | [Move:West] | [Scan] | [Wait]
Remember:
- Moving into blocked walls or out of bounds is invalid.
- The beacon lies at the labyrinth’s center.
- You must wrap your command inside \\boxed{{}}.
Example valid response:
I want to go north to advance toward the beacon.
\boxed{{[Move:North]}}
Example invalid response:
Let’s head northeast. ← invalid direction keyword
Now it is your turn. Choose your next command carefully.
Put your final answer within \\boxed{{}} at the end of your response.
Helper: _extract_answer_content(self, action: str) -> str
Extracts the content enclosed by \boxed{{...}} for validation and execution.
10. API Mapping Plan
reset()
- Generate deterministic maze grid based on seed.
- Initialize all fields of
game_stateper schema. - Return initial observation for each player, including map visibility and rules summary.
step(player_action)
- Use
_extract_answer_contentto unwrap the boxed token. - Validate with grammar and state constraints.
- If invalid → call
set_invalid_move. - If valid → mutate player position/visibility, append to
transcript. - Perform terminal condition checks after each move; update
winnerandterminatedappropriately. - Return resulting state observation and game status.
_generate_player_prompt(player_id)
- Construct text prompt per section 9.
- Include available moves, last opponent move, remaining turns, and map details.
- Append "Put your final answer within \boxed{{}} at the end of your response."
11. Copy-Check Against the Example
- The Labyrinth Command game has an exploration and spatial logic theme, not negotiation, trade, or economy-related.
- All entities—maze, beacon, blocked cells, and explorers—are original constructs.
- Action tokens
[Move:…],[Scan],[Wait], and state keys (beacon_position,cells_blocked,visible_map) are unique to this design. - No resource exchanges, offers, or bargaining are present.
End of Design Document – “Labyrinth Command”