Buckets:

|
download
raw
3.74 kB
# Chess Environment
A chess reinforcement learning environment for OpenEnv, powered by the [moonfish](https://github.com/luccabb/moonfish) chess engine.
## Features
- **Full chess rules** via python-chess library
- **Configurable opponent**: moonfish engine, random moves, or self-play
- **Position evaluation**: Uses moonfish's PSQT-based evaluation
- **Standard OpenEnv interface**: reset(), step(), state
## Quick Start
### Using Docker
```bash
# Build the image
docker build -t chess-env:latest -f envs/chess_env/server/Dockerfile .
# Run the server
docker run -p 8000:8000 chess-env:latest
```
### Using the Client
The client is **async by default**:
```python
import asyncio
from chess_env import ChessEnv, ChessAction
async def main():
async with ChessEnv(base_url="http://localhost:8000") as env:
# Reset for a new game
result = await env.reset()
print(f"Starting position: {result.observation.fen}")
print(f"Legal moves: {result.observation.legal_moves}")
# Make a move
result = await env.step(ChessAction(move="e2e4"))
print(f"Reward: {result.reward}, Done: {result.done}")
# Play until game ends
while not result.done:
move = result.observation.legal_moves[0]
result = await env.step(ChessAction(move=move))
print(f"Game result: {result.observation.result}")
asyncio.run(main())
```
For **synchronous usage**, use the `.sync()` wrapper:
```python
from chess_env import ChessEnv, ChessAction
with ChessEnv(base_url="http://localhost:8000").sync() as env:
result = env.reset()
result = env.step(ChessAction(move="e2e4"))
print(f"Reward: {result.reward}")
```
## Observation Space
| Field | Type | Description |
|-------|------|-------------|
| `fen` | str | Board position in FEN notation |
| `legal_moves` | List[str] | Legal moves in UCI format |
| `is_check` | bool | Whether current player is in check |
| `done` | bool | Whether game has ended |
| `reward` | float | Reward for last action |
| `result` | str | Game result ("1-0", "0-1", "1/2-1/2") |
## Action Space
| Field | Type | Description |
|-------|------|-------------|
| `move` | str | UCI format move (e.g., "e2e4", "e7e8q") |
## Rewards
| Outcome | Reward |
|---------|--------|
| Win | +1.0 |
| Loss | -1.0 |
| Draw | 0.0 |
| Illegal move | -0.1 |
## Configuration
The environment supports these configuration options:
| Parameter | Default | Description |
|-----------|---------|-------------|
| `opponent` | "moonfish" | Opponent type: "moonfish", "random", or None |
| `opponent_depth` | 2 | Search depth for moonfish opponent |
| `max_moves` | 500 | Maximum half-moves before draw |
| `agent_color` | None | Agent color: "white", "black", or None (alternate each episode) |
| `gamma` | 0.99 | Discount factor for temporal credit assignment |
## Temporal Discounting
For RL training, the environment computes temporally discounted rewards at episode end. This helps with credit assignment in long games where only the final outcome is known.
When an episode ends, the terminal observation's `metadata` includes:
- `discounted_rewards`: List of discounted rewards for each agent move
- `gamma`: The discount factor used
The formula is `r_t = γ^(T-1-t) × R_final` where:
- `T` = total agent moves
- `t` = move index (0-indexed)
- `R_final` = terminal reward (+1, -1, or 0)
Example for a 5-move win with γ=0.99:
```
Move 0: 0.99^4 × 1.0 = 0.961
Move 1: 0.99^3 × 1.0 = 0.970
Move 2: 0.99^2 × 1.0 = 0.980
Move 3: 0.99^1 × 1.0 = 0.990
Move 4: 0.99^0 × 1.0 = 1.000
```
## Links
- [moonfish GitHub](https://github.com/luccabb/moonfish)
- [Play online](https://huggingface.co/spaces/luccabb/moonfish_chess)

Xet Storage Details

Size:
3.74 kB
·
Xet hash:
5a5bd560750623c655c7e9409e3cfe8b306476576e35fc6ba5aa21e0ebaab138

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.