website/.stversions/lab-notes/Chess~20251223-132129.md
2026-01-04 14:04:14 -05:00

72 lines
1.9 KiB
Markdown
Executable file

---
title: Plans for a chess/taikyoku shogi/what have you engine
date: 2025-02-18
---
```js
board: Array,
currentPlayer: 'white' | 'black',
moveHistory: Array,
enPassantTarget: {x, y} | null, // Updates each turn
halfMoveClock: number, // For 50-move rule
capturedPieces: Array
}
```
**3. Move Validation System**
Separate move generation into layers:
**Layer 1: Basic Move Patterns**
```
getPseudoLegalMoves(piece, position)
- Returns all squares the piece could move to
- Ignores check/pin considerations
- Each piece type has its own logic
```
**Layer 2: Board-Aware Filtering**
```
getLegalMoves(piece, position, gameState)
- Filters pseudoLegal moves
- Checks if king would be in check after move
- Handles special moves (castling, en passant)
```
## Handling Special Cases
**En Passant**
- After any pawn moves 2 squares forward, set `enPassantTarget` to the square it passed through
- Clear it at the start of the next turn
- When validating pawn captures, check if target matches enPassantTarget
**Castling**
- Track `hasMoved` flag on kings and rooks
- Check: king/rook haven't moved, squares between are empty, king doesn't pass through/end in check
- For arbitrary boards: castle king 2 squares toward rook, place rook on opposite side
**Pawn Promotion**
- Detect when pawn reaches opposite end (rank 0 or rank N-1)
- Pause game, show promotion UI
- Replace pawn with chosen piece
## Key Functions
```
isSquareAttacked(x, y, byColor, gameState)
- Critical for check detection
- Generate all opponent moves, see if any target this square
isKingInCheck(color, gameState)
- Find king position
- Use isSquareAttacked
makeMove(from, to, gameState)
- Validate move is legal
- Update board
- Handle captures
- Update en passant state
- Toggle current player
- Add to move history (for undo)
getGameStatus()
- Returns: 'playing', 'check', 'checkmate', 'stalemate', 'draw'