Files
chess/doc/stockfish.md

85 lines
2.2 KiB
Markdown

# Stockfish Integration
## UCI Protocol Implementation
### Connection Management
Engine process started via `exec.Command("stockfish")` with bidirectional pipes. Initialization sequence:
1. Send `uci` → await `uciok`
2. Send `isready` → await `readyok`
3. Engine ready for commands
### Commands Used
#### Position Setting
```
position fen <fen_string> [moves <move1> <move2> ...]
```
Sets board state for validation or search.
#### Move Search
```
go movetime <milliseconds>
```
Calculates best move with time constraint. Returns:
- `info depth X score cp Y pv ...` (evaluation info)
- `bestmove <move>` (final result)
#### Board State Query
```
d
```
Debug command returning board visualization and FEN. Used for move validation.
#### Configuration
```
setoption name Skill Level value <0-20>
```
Sets engine strength for computer players.
### Response Parsing
#### Search Results
```go
type SearchResult struct {
BestMove string // UCI format move
Score int // Centipawns or mate distance
Depth int // Search depth reached
IsMate bool // Checkmate detected
MateIn int // Moves to mate
}
```
Parse `info` lines for evaluation data, `bestmove` for move selection.
#### FEN Extraction
Parse `d` output for line starting with `Fen: ` to get canonical position.
### Application Usage
#### Synchronous Validation (Processor)
Single mutex-protected engine instance validates moves:
1. Set position with current FEN
2. Attempt move
3. Get new FEN via `d` command
4. Compare FENs to determine legality
#### Asynchronous Calculation (EngineQueue)
Worker pool with dedicated engines per worker:
1. Receive task with FEN and time limit
2. Configure skill level
3. Search for best move
4. Return result via callback
### Error Handling
- Timeout protection (2x search time + 1s buffer)
- Process lifecycle management with graceful shutdown
- Fallback to force kill if quit fails
- "(none)" bestmove indicates no legal moves (checkmate/stalemate)
### Performance Considerations
- Reuse engine instances across multiple games
- `ucinewgame` between games for cache clearing
- Separate engines for validation vs calculation to avoid contention
- Fixed worker pool prevents resource exhaustion