Initial commit from Openverse UI
This commit is contained in:
215
environment.md
Normal file
215
environment.md
Normal file
@@ -0,0 +1,215 @@
|
||||
# **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**
|
||||
1. A player *wins immediately* if they enter the Beacon cell first.
|
||||
2. If both reach simultaneously on the same turn: **Draw**.
|
||||
3. If turn limit expires with no beacon reached: player closer (Manhattan distance) to the Beacon **wins**.
|
||||
4. 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):**
|
||||
1. `^\\[Move:(North|South|East|West)\\]$`
|
||||
2. `^\\[Scan\\]$`
|
||||
3. `^\\[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
|
||||
|
||||
```json
|
||||
{
|
||||
"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 (`seed` provided or auto-generated).
|
||||
- Both players placed:
|
||||
- Explorer A → top-left corner `[0,0]`
|
||||
- Explorer B → bottom-right corner `[width-1,height-1]`
|
||||
- Beacon placed at center `(width//2, height//2)`.
|
||||
- `visible_map` initialized 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**
|
||||
1. Player enters the Beacon cell → Win for that player.
|
||||
2. Both reach Beacon simultaneously → Draw.
|
||||
3. Turn limit reached → Compare distance to Beacon.
|
||||
- Smaller Manhattan distance → Win.
|
||||
- Equal → Draw.
|
||||
|
||||
**Scoring Computation**
|
||||
- Winner gets `1`, loser `0`, draw `0.5`.
|
||||
- Stored in `winner` key 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_state` per schema.
|
||||
- Return initial observation for each player, including map visibility and rules summary.
|
||||
|
||||
**step(player_action)**
|
||||
- Use `_extract_answer_content` to 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 `winner` and `terminated` appropriately.
|
||||
- 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”**
|
||||
Reference in New Issue
Block a user