Restructured project from nested workspace pattern to flat single-repo layout. This eliminates redundant nesting and consolidates all project files under version control. ## Migration Summary **Before:** ``` alex/ (workspace, not versioned) ├── chess-game/ (git repo) │ ├── js/, css/, tests/ │ └── index.html └── docs/ (planning, not versioned) ``` **After:** ``` alex/ (git repo, everything versioned) ├── js/, css/, tests/ ├── index.html ├── docs/ (project documentation) ├── planning/ (historical planning docs) ├── .gitea/ (CI/CD) └── CLAUDE.md (configuration) ``` ## Changes Made ### Structure Consolidation - Moved all chess-game/ contents to root level - Removed redundant chess-game/ subdirectory - Flattened directory structure (eliminated one nesting level) ### Documentation Organization - Moved chess-game/docs/ → docs/ (project documentation) - Moved alex/docs/ → planning/ (historical planning documents) - Added CLAUDE.md (workspace configuration) - Added IMPLEMENTATION_PROMPT.md (original project prompt) ### Version Control Improvements - All project files now under version control - Planning documents preserved in planning/ folder - Merged .gitignore files (workspace + project) - Added .claude/ agent configurations ### File Updates - Updated .gitignore to include both workspace and project excludes - Moved README.md to root level - All import paths remain functional (relative paths unchanged) ## Benefits ✅ **Simpler Structure** - One level of nesting removed ✅ **Complete Versioning** - All documentation now in git ✅ **Standard Layout** - Matches open-source project conventions ✅ **Easier Navigation** - Direct access to all project files ✅ **CI/CD Compatible** - All workflows still functional ## Technical Validation - ✅ Node.js environment verified - ✅ Dependencies installed successfully - ✅ Dev server starts and responds - ✅ All core files present and accessible - ✅ Git repository functional ## Files Preserved **Implementation Files:** - js/ (3,517 lines of code) - css/ (4 stylesheets) - tests/ (87 test cases) - index.html - package.json **CI/CD Pipeline:** - .gitea/workflows/ci.yml - .gitea/workflows/release.yml **Documentation:** - docs/ (12+ documentation files) - planning/ (historical planning materials) - README.md **Configuration:** - jest.config.js, babel.config.cjs, playwright.config.js - .gitignore (merged) - CLAUDE.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1060 lines
30 KiB
Markdown
1060 lines
30 KiB
Markdown
# HTML5 Chess Game Implementation Research
|
|
**Research Date:** November 22, 2025
|
|
**Researcher:** Research Agent
|
|
**Task ID:** task-1763844528218-ev98do22w
|
|
|
|
---
|
|
|
|
## Executive Summary
|
|
|
|
This research analyzes modern HTML5 chess game implementations, focusing on architecture patterns, technology stacks, and best practices for 2025. Key findings recommend a **DOM-based approach with chess.js** for simplicity and maintainability, while **canvas rendering** remains viable for performance-critical scenarios.
|
|
|
|
### Critical Recommendations:
|
|
1. **Technology Stack:** HTML5 + chess.js + chessboard.js/react-chessboard
|
|
2. **Architecture Pattern:** Model-View-Controller (MVC) with event-driven design
|
|
3. **AI Engine:** Minimax with Alpha-Beta pruning or Stockfish.js integration
|
|
4. **State Management:** localStorage for persistence, FEN/PGN for notation
|
|
5. **Mobile Support:** Touch event polyfills + tap-to-move functionality
|
|
|
|
---
|
|
|
|
## 1. Architecture Patterns Analysis
|
|
|
|
### 1.1 Model-View-Controller (MVC)
|
|
**Recommended Pattern for Chess Games**
|
|
|
|
**Model (Game Logic):**
|
|
- Chess rule engine (move validation, check/checkmate detection)
|
|
- Game state management (board position, move history)
|
|
- AI opponent logic
|
|
- PGN/FEN parsing and generation
|
|
|
|
**View (UI Rendering):**
|
|
- Board visualization (DOM or Canvas)
|
|
- Piece rendering and animations
|
|
- Move highlighting and indicators
|
|
- User interaction handlers
|
|
|
|
**Controller (Coordination):**
|
|
- Event routing between model and view
|
|
- User input processing (mouse, touch, keyboard)
|
|
- Game flow control (turn management, timers)
|
|
- API communication (for multiplayer)
|
|
|
|
**Implementation Pattern:**
|
|
```javascript
|
|
// Model: Game state and rules
|
|
class ChessGame {
|
|
constructor() {
|
|
this.chess = new Chess(); // chess.js instance
|
|
this.moveHistory = [];
|
|
}
|
|
|
|
makeMove(from, to) {
|
|
const move = this.chess.move({ from, to });
|
|
if (move) this.moveHistory.push(move);
|
|
return move;
|
|
}
|
|
|
|
isGameOver() {
|
|
return this.chess.isGameOver();
|
|
}
|
|
}
|
|
|
|
// View: Board rendering
|
|
class ChessBoard {
|
|
constructor(elementId) {
|
|
this.board = Chessboard(elementId, config);
|
|
}
|
|
|
|
updatePosition(fen) {
|
|
this.board.position(fen);
|
|
}
|
|
|
|
highlightSquares(squares) {
|
|
// Visual feedback
|
|
}
|
|
}
|
|
|
|
// Controller: Coordination
|
|
class GameController {
|
|
constructor() {
|
|
this.game = new ChessGame();
|
|
this.board = new ChessBoard('chessboard');
|
|
}
|
|
|
|
onPieceDrop(source, target) {
|
|
const move = this.game.makeMove(source, target);
|
|
if (move) {
|
|
this.board.updatePosition(this.game.chess.fen());
|
|
this.checkGameState();
|
|
}
|
|
return move !== null;
|
|
}
|
|
}
|
|
```
|
|
|
|
### 1.2 Design Patterns for Chess
|
|
|
|
**Strategy Pattern (Piece Movement):**
|
|
```javascript
|
|
// Each piece type implements MovementStrategy
|
|
class PawnMovement {
|
|
getValidMoves(position, board) {
|
|
// Pawn-specific move logic
|
|
}
|
|
}
|
|
|
|
class KnightMovement {
|
|
getValidMoves(position, board) {
|
|
// Knight-specific move logic
|
|
}
|
|
}
|
|
```
|
|
|
|
**Command Pattern (Move History):**
|
|
```javascript
|
|
class MoveCommand {
|
|
constructor(from, to, piece) {
|
|
this.from = from;
|
|
this.to = to;
|
|
this.piece = piece;
|
|
}
|
|
|
|
execute(game) {
|
|
return game.move({ from: this.from, to: this.to });
|
|
}
|
|
|
|
undo(game) {
|
|
game.undo();
|
|
}
|
|
}
|
|
```
|
|
|
|
**Chain of Responsibility (Move Validation):**
|
|
```javascript
|
|
class MoveValidator {
|
|
constructor(next = null) {
|
|
this.next = next;
|
|
}
|
|
|
|
validate(move) {
|
|
if (!this.isValid(move)) return false;
|
|
return this.next ? this.next.validate(move) : true;
|
|
}
|
|
}
|
|
|
|
// Chained validators: EnPassant -> Castling -> Regular
|
|
```
|
|
|
|
### 1.3 Event-Driven Game Loop
|
|
|
|
**Recommended Approach:**
|
|
```javascript
|
|
class GameLoop {
|
|
constructor() {
|
|
this.subscribers = {};
|
|
}
|
|
|
|
on(event, callback) {
|
|
if (!this.subscribers[event]) {
|
|
this.subscribers[event] = [];
|
|
}
|
|
this.subscribers[event].push(callback);
|
|
}
|
|
|
|
emit(event, data) {
|
|
if (this.subscribers[event]) {
|
|
this.subscribers[event].forEach(cb => cb(data));
|
|
}
|
|
}
|
|
}
|
|
|
|
// Usage
|
|
gameLoop.on('move', (move) => {
|
|
updateBoard(move);
|
|
checkGameState();
|
|
saveToLocalStorage();
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
## 2. Chess Game Requirements
|
|
|
|
### 2.1 Standard Chess Rules Implementation
|
|
|
|
**Core Rules:**
|
|
- Piece movement validation (6 piece types, each with unique rules)
|
|
- Turn-based gameplay (white moves first)
|
|
- Check and checkmate detection
|
|
- Stalemate and draw conditions (50-move rule, threefold repetition)
|
|
- Pawn promotion
|
|
|
|
**Special Moves:**
|
|
- Castling (kingside and queenside)
|
|
- En passant capture
|
|
- Pawn promotion to any piece type
|
|
|
|
**Game State Detection:**
|
|
- Check (king under attack)
|
|
- Checkmate (king in check with no legal moves)
|
|
- Stalemate (no legal moves but not in check)
|
|
- Insufficient material
|
|
- Threefold repetition
|
|
- 50-move rule
|
|
|
|
### 2.2 Chess Notation Formats
|
|
|
|
**FEN (Forsyth-Edwards Notation):**
|
|
- Represents current board position
|
|
- Format: `rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1`
|
|
- Components: piece placement, active color, castling rights, en passant, halfmove clock, fullmove number
|
|
- **Use Case:** Save/load game state, share positions
|
|
|
|
**PGN (Portable Game Notation):**
|
|
- Records complete game with move history
|
|
- Standard format for chess databases
|
|
- Includes metadata (players, event, date, result)
|
|
- **Use Case:** Game replay, analysis, export
|
|
|
|
**Library Support:**
|
|
- **chess.js:** Full FEN and PGN support
|
|
- **@mliebelt/pgn-parser:** Advanced PGN parsing
|
|
- **cm-pgn:** Parse and create PGN files
|
|
|
|
### 2.3 AI Opponent Strategies
|
|
|
|
**Minimax Algorithm:**
|
|
```javascript
|
|
function minimax(position, depth, maximizingPlayer) {
|
|
if (depth === 0 || position.isGameOver()) {
|
|
return evaluatePosition(position);
|
|
}
|
|
|
|
if (maximizingPlayer) {
|
|
let maxEval = -Infinity;
|
|
for (let move of position.legalMoves()) {
|
|
position.makeMove(move);
|
|
const eval = minimax(position, depth - 1, false);
|
|
position.undoMove();
|
|
maxEval = Math.max(maxEval, eval);
|
|
}
|
|
return maxEval;
|
|
} else {
|
|
let minEval = Infinity;
|
|
for (let move of position.legalMoves()) {
|
|
position.makeMove(move);
|
|
const eval = minimax(position, depth - 1, true);
|
|
position.undoMove();
|
|
minEval = Math.min(minEval, eval);
|
|
}
|
|
return minEval;
|
|
}
|
|
}
|
|
```
|
|
|
|
**Alpha-Beta Pruning (Optimized Minimax):**
|
|
```javascript
|
|
function alphaBeta(position, depth, alpha, beta, maximizingPlayer) {
|
|
if (depth === 0 || position.isGameOver()) {
|
|
return evaluatePosition(position);
|
|
}
|
|
|
|
if (maximizingPlayer) {
|
|
let maxEval = -Infinity;
|
|
for (let move of position.legalMoves()) {
|
|
position.makeMove(move);
|
|
const eval = alphaBeta(position, depth - 1, alpha, beta, false);
|
|
position.undoMove();
|
|
maxEval = Math.max(maxEval, eval);
|
|
alpha = Math.max(alpha, eval);
|
|
if (beta <= alpha) break; // Beta cutoff
|
|
}
|
|
return maxEval;
|
|
} else {
|
|
let minEval = Infinity;
|
|
for (let move of position.legalMoves()) {
|
|
position.makeMove(move);
|
|
const eval = alphaBeta(position, depth - 1, alpha, beta, true);
|
|
position.undoMove();
|
|
minEval = Math.min(minEval, eval);
|
|
beta = Math.min(beta, eval);
|
|
if (beta <= alpha) break; // Alpha cutoff
|
|
}
|
|
return minEval;
|
|
}
|
|
}
|
|
```
|
|
|
|
**Advanced Optimizations:**
|
|
- **Transposition Tables:** Cache evaluated positions
|
|
- **Null Move Pruning:** Skip evaluation in certain scenarios
|
|
- **Late Move Reductions:** Reduce search depth for unlikely moves
|
|
- **Move Ordering:** Evaluate promising moves first
|
|
- **Quiescence Search:** Extend search for capture sequences
|
|
|
|
**Alternative: Stockfish.js Integration:**
|
|
- Stockfish compiled to WebAssembly
|
|
- Professional-strength chess engine
|
|
- Used by Lichess and Chess.com
|
|
- **Benefit:** World-class AI without custom implementation
|
|
|
|
### 2.4 Multiplayer Options
|
|
|
|
**Local Multiplayer:**
|
|
- Hot-seat mode (pass device between players)
|
|
- Simple implementation, no networking required
|
|
- Best for initial MVP
|
|
|
|
**Online Multiplayer:**
|
|
- **WebSockets:** Real-time bidirectional communication
|
|
- **Socket.IO:** Popular WebSocket library
|
|
- **Architecture:**
|
|
```javascript
|
|
// Client-side
|
|
socket.emit('makeMove', { from: 'e2', to: 'e4' });
|
|
socket.on('opponentMove', (move) => {
|
|
game.makeMove(move.from, move.to);
|
|
});
|
|
|
|
// Server-side
|
|
io.on('connection', (socket) => {
|
|
socket.on('makeMove', (move) => {
|
|
// Validate move
|
|
// Broadcast to opponent
|
|
socket.to(gameRoom).emit('opponentMove', move);
|
|
});
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
## 3. HTML5 Technologies Analysis
|
|
|
|
### 3.1 Canvas vs DOM Rendering
|
|
|
|
**Performance Comparison:**
|
|
|
|
| Aspect | Canvas | DOM |
|
|
|--------|--------|-----|
|
|
| **Rendering Speed** | Faster for 1000+ objects | Efficient for <100 objects |
|
|
| **Chess Board Suitability** | Overkill (64 squares, 32 pieces) | Ideal for chess |
|
|
| **Animation Control** | Pixel-perfect, manual | CSS transitions (easier) |
|
|
| **Event Handling** | Manual hit detection | Native click/touch events |
|
|
| **Accessibility** | Requires ARIA implementation | Native screen reader support |
|
|
| **Browser Optimization** | Hardware-accelerated | Hardware-accelerated |
|
|
|
|
**Recommendation for Chess:**
|
|
**Use DOM-based rendering** because:
|
|
- Chess boards have only 64 squares + 32 pieces (well within DOM limits)
|
|
- Easier event handling (click piece, drag-drop)
|
|
- Better accessibility out-of-the-box
|
|
- CSS animations for smooth piece movement
|
|
- Simpler development and debugging
|
|
|
|
**When to Consider Canvas:**
|
|
- Advanced visual effects (particle systems, complex animations)
|
|
- 3D chess boards with WebGL
|
|
- Performance-critical scenarios (not typical for chess)
|
|
|
|
### 3.2 DOM-Based Implementation
|
|
|
|
**Recommended Libraries:**
|
|
|
|
**chessboard.js:**
|
|
- Lightweight, jQuery-based (can be used standalone)
|
|
- Drag-and-drop support
|
|
- Piece movement animations
|
|
- Configurable themes
|
|
- **Limitation:** No built-in game rules (pair with chess.js)
|
|
|
|
**react-chessboard:**
|
|
- Modern React component
|
|
- TypeScript support
|
|
- Customizable styling
|
|
- Touch-friendly
|
|
- **Best for:** React-based projects
|
|
|
|
**Implementation Example:**
|
|
```html
|
|
<div id="chessboard" style="width: 400px"></div>
|
|
|
|
<script>
|
|
const config = {
|
|
draggable: true,
|
|
position: 'start',
|
|
onDrop: handleMove,
|
|
onSnapEnd: updateBoard
|
|
};
|
|
|
|
const board = Chessboard('chessboard', config);
|
|
const game = new Chess();
|
|
|
|
function handleMove(source, target) {
|
|
const move = game.move({
|
|
from: source,
|
|
to: target,
|
|
promotion: 'q' // Always promote to queen for simplicity
|
|
});
|
|
|
|
if (move === null) return 'snapback';
|
|
|
|
updateStatus();
|
|
}
|
|
</script>
|
|
```
|
|
|
|
### 3.3 Touch and Mouse Event Handling
|
|
|
|
**Challenges:**
|
|
- HTML5 drag-and-drop API is mouse-based (poor mobile support)
|
|
- Most mobile browsers don't implement drag events
|
|
- Touch events require different handling
|
|
|
|
**Solutions:**
|
|
|
|
**1. Touch Event Polyfills:**
|
|
```javascript
|
|
// DragDropTouch polyfill
|
|
import { DragDropTouch } from 'drag-drop-touch-js/dragdroptouch';
|
|
|
|
// Automatically translates touch events to drag-drop
|
|
```
|
|
|
|
**2. Tap-to-Move Alternative:**
|
|
```javascript
|
|
let selectedSquare = null;
|
|
|
|
board.addEventListener('click', (e) => {
|
|
const square = getSquareFromCoordinates(e.clientX, e.clientY);
|
|
|
|
if (!selectedSquare) {
|
|
// First tap: select piece
|
|
if (hasPiece(square)) {
|
|
selectedSquare = square;
|
|
highlightSquare(square);
|
|
}
|
|
} else {
|
|
// Second tap: move piece
|
|
makeMove(selectedSquare, square);
|
|
selectedSquare = null;
|
|
clearHighlights();
|
|
}
|
|
});
|
|
```
|
|
|
|
**3. Unified Event Handling:**
|
|
```javascript
|
|
function getPointerEvent(e) {
|
|
return e.touches ? e.touches[0] : e;
|
|
}
|
|
|
|
element.addEventListener('mousedown', handleStart);
|
|
element.addEventListener('touchstart', handleStart);
|
|
|
|
function handleStart(e) {
|
|
const pointer = getPointerEvent(e);
|
|
// Unified handling for mouse and touch
|
|
}
|
|
```
|
|
|
|
**Recommendation:**
|
|
- **Implement both drag-drop AND tap-to-move**
|
|
- Use DragDropTouch polyfill for mobile drag support
|
|
- Mobile-first design (most internet traffic is mobile)
|
|
|
|
### 3.4 CSS Animations for Piece Movement
|
|
|
|
**Smooth Transitions:**
|
|
```css
|
|
.chess-piece {
|
|
transition: transform 0.3s ease-in-out;
|
|
will-change: transform;
|
|
}
|
|
|
|
.chess-piece.moving {
|
|
transform: translate(var(--move-x), var(--move-y));
|
|
}
|
|
|
|
@keyframes capture {
|
|
0% { opacity: 1; transform: scale(1); }
|
|
100% { opacity: 0; transform: scale(0); }
|
|
}
|
|
|
|
.chess-piece.captured {
|
|
animation: capture 0.3s ease-out forwards;
|
|
}
|
|
```
|
|
|
|
**Performance Tips:**
|
|
- Use `transform` instead of `top/left` (GPU-accelerated)
|
|
- Apply `will-change` sparingly (only during animations)
|
|
- Avoid animating layout properties (width, height, margin)
|
|
|
|
### 3.5 Local Storage for Game State
|
|
|
|
**Storage Strategy:**
|
|
|
|
**What to Store:**
|
|
- Current game FEN (board position)
|
|
- Move history (PGN format)
|
|
- Game settings (difficulty, theme, time control)
|
|
- Player statistics (wins, losses, draws)
|
|
|
|
**localStorage vs sessionStorage:**
|
|
|
|
| Feature | localStorage | sessionStorage |
|
|
|---------|--------------|----------------|
|
|
| **Persistence** | Survives browser restart | Tab session only |
|
|
| **Chess Use Case** | Save games for later | Temporary game state |
|
|
| **Expiration** | Never (until cleared) | Tab close |
|
|
| **Size Limit** | 5-10 MB | 5-10 MB |
|
|
|
|
**Implementation:**
|
|
```javascript
|
|
class GameStorage {
|
|
static saveGame(gameId, gameData) {
|
|
const data = {
|
|
fen: gameData.fen,
|
|
pgn: gameData.pgn,
|
|
timestamp: Date.now(),
|
|
playerColor: gameData.playerColor
|
|
};
|
|
localStorage.setItem(`chess_game_${gameId}`, JSON.stringify(data));
|
|
}
|
|
|
|
static loadGame(gameId) {
|
|
const data = localStorage.getItem(`chess_game_${gameId}`);
|
|
return data ? JSON.parse(data) : null;
|
|
}
|
|
|
|
static listSavedGames() {
|
|
const games = [];
|
|
for (let i = 0; i < localStorage.length; i++) {
|
|
const key = localStorage.key(i);
|
|
if (key.startsWith('chess_game_')) {
|
|
games.push(JSON.parse(localStorage.getItem(key)));
|
|
}
|
|
}
|
|
return games.sort((a, b) => b.timestamp - a.timestamp);
|
|
}
|
|
}
|
|
|
|
// Auto-save on every move
|
|
gameLoop.on('move', (move) => {
|
|
GameStorage.saveGame('current', {
|
|
fen: game.fen(),
|
|
pgn: game.pgn(),
|
|
playerColor: 'white'
|
|
});
|
|
});
|
|
```
|
|
|
|
**Best Practices:**
|
|
- **Encrypt sensitive data** (AES-256)
|
|
- **Validate input** before storage (prevent XSS)
|
|
- **Handle quota exceeded errors**
|
|
- **Sanitize user input** when retrieving
|
|
- **Use JSON.stringify/parse** for objects
|
|
- **Implement auto-save** (save on every move)
|
|
|
|
---
|
|
|
|
## 4. Existing Solutions Analysis
|
|
|
|
### 4.1 Lichess (lichess.org)
|
|
|
|
**Technology Stack:**
|
|
- **Backend:** Scala 3, scalachess library
|
|
- **Frontend:** JavaScript, chess.js
|
|
- **Architecture:** Fully asynchronous, Akka streams
|
|
- **WebSockets:** Separate server, Redis communication
|
|
- **Chess Engine:** Stockfish.js
|
|
|
|
**Strengths:**
|
|
- Open-source, fully auditable
|
|
- Production-proven architecture
|
|
- High-performance async design
|
|
- Professional-grade features
|
|
|
|
**Lessons:**
|
|
- Separate chess logic into pure library (scalachess pattern)
|
|
- Use WebSocket server separate from main app (scalability)
|
|
- Leverage battle-tested engines (Stockfish)
|
|
|
|
### 4.2 chess.js + chessboard.js
|
|
|
|
**The "Gold Standard" Combination:**
|
|
|
|
**chess.js:**
|
|
- Move generation and validation
|
|
- Check/checkmate/stalemate detection
|
|
- FEN and PGN support
|
|
- 153+ projects depend on it
|
|
|
|
**chessboard.js:**
|
|
- Visual chessboard rendering
|
|
- Drag-and-drop interface
|
|
- Piece animations
|
|
- Themeable
|
|
|
|
**Strengths:**
|
|
- Separation of concerns (logic vs. UI)
|
|
- Widely adopted and maintained
|
|
- Extensive documentation
|
|
- Community support
|
|
|
|
**Weaknesses:**
|
|
- chessboard.js uses jQuery (outdated dependency)
|
|
- Limited mobile touch support (requires polyfills)
|
|
|
|
**Alternative:** react-chessboard (modern, no jQuery)
|
|
|
|
### 4.3 Stockfish.js
|
|
|
|
**World's Strongest Open-Source Engine:**
|
|
- ELO rating: 3500+ (grandmaster level)
|
|
- Compiled to WebAssembly (native performance)
|
|
- Used by Lichess and Chess.com
|
|
|
|
**Integration:**
|
|
```javascript
|
|
import { Stockfish } from 'stockfish.js';
|
|
|
|
const engine = new Stockfish();
|
|
|
|
engine.onmessage = (event) => {
|
|
console.log(event.data);
|
|
if (event.data.includes('bestmove')) {
|
|
const move = parseBestMove(event.data);
|
|
makeComputerMove(move);
|
|
}
|
|
};
|
|
|
|
// Request best move
|
|
engine.postMessage('position fen ' + game.fen());
|
|
engine.postMessage('go depth 10');
|
|
```
|
|
|
|
**Benefits:**
|
|
- No need to implement AI from scratch
|
|
- Adjustable difficulty (depth parameter)
|
|
- Professional-grade analysis
|
|
|
|
---
|
|
|
|
## 5. Technology Stack Recommendations
|
|
|
|
### 5.1 Recommended Stack (Beginner-Friendly)
|
|
|
|
**Core Technologies:**
|
|
- **HTML5** - Structure
|
|
- **CSS3** - Styling and animations
|
|
- **Vanilla JavaScript** - Logic (or TypeScript for type safety)
|
|
|
|
**Libraries:**
|
|
- **chess.js** - Game rules and move validation
|
|
- **chessboard.js** or **react-chessboard** - Board rendering
|
|
- **DragDropTouch** - Mobile touch support
|
|
|
|
**Optional:**
|
|
- **Stockfish.js** - AI opponent (alternative to custom AI)
|
|
- **Socket.IO** - Multiplayer functionality
|
|
|
|
**Why This Stack:**
|
|
- Minimal dependencies
|
|
- Battle-tested libraries
|
|
- Large community support
|
|
- Easy to learn and debug
|
|
|
|
### 5.2 Advanced Stack (Modern Framework)
|
|
|
|
**Framework:**
|
|
- **React** or **Vue.js** - Component-based architecture
|
|
- **TypeScript** - Type safety
|
|
|
|
**State Management:**
|
|
- **Zustand** or **Redux** - Global state (for complex games)
|
|
|
|
**Styling:**
|
|
- **Tailwind CSS** - Utility-first styling
|
|
- **Framer Motion** - Advanced animations
|
|
|
|
**Backend (for multiplayer):**
|
|
- **Node.js + Express** - API server
|
|
- **Socket.IO** - WebSocket communication
|
|
- **PostgreSQL** - Game storage
|
|
|
|
**Deployment:**
|
|
- **Vercel** or **Netlify** - Frontend hosting
|
|
- **Railway** or **Render** - Backend hosting
|
|
|
|
### 5.3 Architecture Decision Matrix
|
|
|
|
| Requirement | DOM Approach | Canvas Approach | Recommendation |
|
|
|-------------|--------------|-----------------|----------------|
|
|
| Simple chess game | ✅ Excellent | ⚠️ Overkill | **DOM** |
|
|
| 3D graphics | ❌ Not possible | ✅ WebGL | **Canvas** |
|
|
| Mobile support | ✅ Good (with polyfills) | ⚠️ Manual touch handling | **DOM** |
|
|
| Accessibility | ✅ Native support | ❌ Requires work | **DOM** |
|
|
| Animation control | ✅ CSS animations | ✅ Pixel-perfect | **DOM** (easier) |
|
|
| Performance (chess) | ✅ Sufficient | ✅ Overkill | **DOM** |
|
|
|
|
**Decision: Use DOM-based rendering for standard chess games.**
|
|
|
|
---
|
|
|
|
## 6. Feature Priority Matrix
|
|
|
|
### 6.1 MVP (Minimum Viable Product)
|
|
|
|
**Phase 1 - Core Gameplay (Week 1-2):**
|
|
- ✅ P0: Chessboard rendering (8x8 grid)
|
|
- ✅ P0: Piece placement and movement
|
|
- ✅ P0: Move validation (legal moves only)
|
|
- ✅ P0: Turn-based gameplay
|
|
- ✅ P0: Check and checkmate detection
|
|
|
|
**Phase 2 - Essential Features (Week 3-4):**
|
|
- ✅ P1: Drag-and-drop piece movement
|
|
- ✅ P1: Move highlighting (legal moves)
|
|
- ✅ P1: Captured pieces display
|
|
- ✅ P1: Game state messages (check, checkmate, stalemate)
|
|
- ✅ P1: New game / reset functionality
|
|
|
|
### 6.2 Enhanced Features
|
|
|
|
**Phase 3 - Improved UX (Week 5-6):**
|
|
- ⭐ P2: Move animations
|
|
- ⭐ P2: Sound effects (move, capture, check)
|
|
- ⭐ P2: Move history display
|
|
- ⭐ P2: Undo/redo moves
|
|
- ⭐ P2: Save/load games (localStorage)
|
|
|
|
**Phase 4 - AI Opponent (Week 7-8):**
|
|
- 🤖 P2: Basic AI (random legal moves)
|
|
- 🤖 P2: Minimax AI (depth 2-3)
|
|
- 🤖 P2: Difficulty levels (easy, medium, hard)
|
|
- 🤖 P2: Stockfish.js integration (optional)
|
|
|
|
### 6.3 Advanced Features
|
|
|
|
**Phase 5 - Advanced Gameplay (Week 9-10):**
|
|
- 🎯 P3: PGN export/import
|
|
- 🎯 P3: Position analysis
|
|
- 🎯 P3: Opening book integration
|
|
- 🎯 P3: Time controls (blitz, rapid, classical)
|
|
|
|
**Phase 6 - Multiplayer (Week 11-12):**
|
|
- 🌐 P3: Local multiplayer (hot-seat)
|
|
- 🌐 P3: Online multiplayer (WebSockets)
|
|
- 🌐 P3: Spectator mode
|
|
- 🌐 P3: Game lobby/matchmaking
|
|
|
|
**Phase 7 - Polish (Week 13+):**
|
|
- 💎 P4: Multiple themes/board styles
|
|
- 💎 P4: Mobile responsive design
|
|
- 💎 P4: Tutorial mode
|
|
- 💎 P4: Achievement system
|
|
|
|
---
|
|
|
|
## 7. Reference Implementations
|
|
|
|
### 7.1 Open-Source Chess Projects
|
|
|
|
**1. Lichess**
|
|
- **URL:** https://github.com/lichess-org/lila
|
|
- **Language:** Scala (backend), JavaScript (frontend)
|
|
- **Lessons:** Professional architecture, async design patterns
|
|
- **License:** AGPL-3.0
|
|
|
|
**2. chess.js**
|
|
- **URL:** https://github.com/jhlywa/chess.js
|
|
- **Language:** TypeScript
|
|
- **Lessons:** Clean API design, comprehensive rule implementation
|
|
- **License:** BSD-2-Clause
|
|
|
|
**3. chessboard.js**
|
|
- **URL:** https://github.com/oakmac/chessboardjs
|
|
- **Language:** JavaScript
|
|
- **Lessons:** UI/logic separation, configurable components
|
|
- **License:** MIT
|
|
|
|
**4. Stockfish.js**
|
|
- **URL:** https://github.com/lichess-org/stockfish.js
|
|
- **Language:** C++ (compiled to WASM/JS)
|
|
- **Lessons:** WebAssembly integration, engine communication
|
|
- **License:** GPL-3.0
|
|
|
|
### 7.2 Learning Resources
|
|
|
|
**Tutorials:**
|
|
- React Live-Chess Tutorial: https://stack-chess-tutorial.netlify.app/
|
|
- Building Chess with JavaScript: https://www.david-cortese.com/html-and-css-chessboard-with-javascript-drag-and-drop-chess-pieces.htm
|
|
|
|
**Documentation:**
|
|
- chess.js API: https://github.com/jhlywa/chess.js/blob/master/README.md
|
|
- PGN specification: http://www.saremba.de/chessgml/standards/pgn/pgn-complete.htm
|
|
- FEN notation: https://en.wikipedia.org/wiki/Forsyth%E2%80%93Edwards_Notation
|
|
|
|
**Chess Programming:**
|
|
- Chess Programming Wiki: https://www.chessprogramming.org/
|
|
- Minimax Algorithm: https://www.geeksforgeeks.org/minimax-algorithm-in-game-theory-set-4-alpha-beta-pruning/
|
|
|
|
### 7.3 Code Snippets Repository
|
|
|
|
**Minimax Implementation:**
|
|
- https://gist.github.com/byanofsky/c8dd06cd1b1fb8d06a9dd695d07e403e
|
|
|
|
**Chess AI Review:**
|
|
- https://codereview.stackexchange.com/questions/219717/chess-ai-using-minimax-and-alpha-beta-pruning
|
|
|
|
**Drag-Drop Examples:**
|
|
- https://codepen.io/ChrisAwesome/pen/QNZvMa
|
|
- https://codepen.io/alexburton/pen/JjRpqzZ
|
|
|
|
---
|
|
|
|
## 8. Risk Assessment and Mitigation
|
|
|
|
### 8.1 Technical Risks
|
|
|
|
**Risk 1: Mobile Touch Support**
|
|
- **Impact:** High (majority of users on mobile)
|
|
- **Probability:** High
|
|
- **Mitigation:**
|
|
- Use DragDropTouch polyfill
|
|
- Implement tap-to-move as primary mobile interaction
|
|
- Test on real devices (iOS Safari, Chrome Android)
|
|
|
|
**Risk 2: AI Performance**
|
|
- **Impact:** Medium (slow AI degrades UX)
|
|
- **Probability:** Medium
|
|
- **Mitigation:**
|
|
- Use Web Workers for AI computation (prevent UI blocking)
|
|
- Implement progressive depth search (quick move + analysis)
|
|
- Consider Stockfish.js for production-grade AI
|
|
|
|
**Risk 3: Browser Compatibility**
|
|
- **Impact:** Medium
|
|
- **Probability:** Low (modern browsers well-supported)
|
|
- **Mitigation:**
|
|
- Use Babel for ES6+ transpilation
|
|
- Polyfill localStorage for old browsers
|
|
- Test on Safari, Chrome, Firefox, Edge
|
|
|
|
**Risk 4: State Management Complexity**
|
|
- **Impact:** Medium (bugs in game state)
|
|
- **Probability:** Medium
|
|
- **Mitigation:**
|
|
- Use chess.js (battle-tested rules engine)
|
|
- Implement comprehensive testing
|
|
- Store FEN strings (canonical state representation)
|
|
|
|
### 8.2 Performance Risks
|
|
|
|
**Risk 5: Animation Jank**
|
|
- **Impact:** Low (aesthetic issue)
|
|
- **Probability:** Low
|
|
- **Mitigation:**
|
|
- Use CSS transforms (GPU-accelerated)
|
|
- Implement RequestAnimationFrame for smooth animations
|
|
- Profile with Chrome DevTools
|
|
|
|
**Risk 6: Memory Leaks**
|
|
- **Impact:** Medium (degraded performance over time)
|
|
- **Probability:** Low
|
|
- **Mitigation:**
|
|
- Remove event listeners on cleanup
|
|
- Clear intervals/timeouts
|
|
- Profile memory usage
|
|
|
|
### 8.3 Security Risks
|
|
|
|
**Risk 7: XSS via localStorage**
|
|
- **Impact:** High (data theft)
|
|
- **Probability:** Low
|
|
- **Mitigation:**
|
|
- Sanitize all user input before storage
|
|
- Validate data when retrieving from localStorage
|
|
- Never use `eval()` on stored data
|
|
|
|
**Risk 8: Multiplayer Cheating**
|
|
- **Impact:** Medium (unfair gameplay)
|
|
- **Probability:** High (for online mode)
|
|
- **Mitigation:**
|
|
- Server-side move validation (never trust client)
|
|
- Rate limiting on API endpoints
|
|
- Detect impossible move patterns
|
|
|
|
---
|
|
|
|
## 9. Implementation Roadmap
|
|
|
|
### 9.1 Week 1-2: Foundation
|
|
```
|
|
✓ Setup project structure
|
|
✓ Integrate chess.js + chessboard.js
|
|
✓ Implement basic board rendering
|
|
✓ Add drag-drop piece movement
|
|
✓ Validate moves with chess.js
|
|
```
|
|
|
|
### 9.2 Week 3-4: Core Gameplay
|
|
```
|
|
✓ Implement special moves (castling, en passant, promotion)
|
|
✓ Add check/checkmate/stalemate detection
|
|
✓ Display game status messages
|
|
✓ Implement new game functionality
|
|
✓ Add move history display
|
|
```
|
|
|
|
### 9.3 Week 5-6: UX Enhancements
|
|
```
|
|
✓ CSS animations for piece movement
|
|
✓ Sound effects (move, capture, check)
|
|
✓ Undo/redo functionality
|
|
✓ Save/load games with localStorage
|
|
✓ Mobile touch support (tap-to-move)
|
|
```
|
|
|
|
### 9.4 Week 7-8: AI Opponent
|
|
```
|
|
✓ Implement random move AI (baseline)
|
|
✓ Build minimax algorithm with alpha-beta pruning
|
|
✓ Add difficulty levels
|
|
✓ Web Worker for AI computation
|
|
✓ Optional: Integrate Stockfish.js
|
|
```
|
|
|
|
### 9.5 Week 9-10: Advanced Features
|
|
```
|
|
✓ PGN export/import
|
|
✓ FEN position setup
|
|
✓ Time controls (chess clock)
|
|
✓ Position evaluation display
|
|
```
|
|
|
|
### 9.6 Week 11-12: Multiplayer
|
|
```
|
|
✓ Local multiplayer mode
|
|
✓ Setup WebSocket server (Socket.IO)
|
|
✓ Implement game rooms
|
|
✓ Real-time move synchronization
|
|
✓ Spectator mode
|
|
```
|
|
|
|
---
|
|
|
|
## 10. Key Findings for Hive Mind
|
|
|
|
### 10.1 Critical Decisions
|
|
|
|
**1. Rendering Approach:**
|
|
- **Decision:** DOM-based rendering with chessboard.js or react-chessboard
|
|
- **Rationale:** Simpler, better mobile support, sufficient performance for chess
|
|
- **Alternative:** Canvas only if advanced graphics needed (3D boards)
|
|
|
|
**2. Technology Stack:**
|
|
- **Decision:** chess.js + chessboard.js (or React variant)
|
|
- **Rationale:** Battle-tested, widely adopted, excellent documentation
|
|
- **Risk:** chessboard.js uses jQuery (consider react-chessboard for modern projects)
|
|
|
|
**3. AI Implementation:**
|
|
- **Decision:** Start with minimax + alpha-beta, consider Stockfish.js for advanced AI
|
|
- **Rationale:** Minimax teaches fundamentals, Stockfish provides pro-level AI
|
|
- **Implementation:** Use Web Workers to prevent UI blocking
|
|
|
|
**4. Mobile Strategy:**
|
|
- **Decision:** Tap-to-move as primary interface, drag-drop as enhancement
|
|
- **Rationale:** Mobile is majority traffic, tapping is more reliable than dragging
|
|
- **Implementation:** DragDropTouch polyfill + custom tap logic
|
|
|
|
**5. State Management:**
|
|
- **Decision:** FEN for current state, PGN for history, localStorage for persistence
|
|
- **Rationale:** Industry standards, interoperable, human-readable
|
|
- **Security:** Validate and sanitize all data from storage
|
|
|
|
### 10.2 Architecture Summary
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────┐
|
|
│ User Interface │
|
|
│ (HTML5 + CSS3 + chessboard.js/react-chessboard)│
|
|
└────────────────┬────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────┐
|
|
│ Game Controller (MVC) │
|
|
│ - Event routing │
|
|
│ - User input processing │
|
|
│ - Game flow control │
|
|
└────────┬───────────────────────┬─────────────────┘
|
|
│ │
|
|
▼ ▼
|
|
┌────────────────────┐ ┌───────────────────────┐
|
|
│ Game Model │ │ AI Engine │
|
|
│ (chess.js) │ │ (minimax/Stockfish) │
|
|
│ - Rules engine │ │ - Move calculation │
|
|
│ - State mgmt │ │ - Position eval │
|
|
│ - FEN/PGN support │ │ - Web Worker │
|
|
└────────────────────┘ └───────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────┐
|
|
│ Local Storage │
|
|
│ - Game state (FEN) │
|
|
│ - Move history (PGN) │
|
|
│ - User preferences │
|
|
└─────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 10.3 Next Steps for Hive
|
|
|
|
**For Planner:**
|
|
- Break down implementation into 2-week sprints
|
|
- Prioritize MVP features (P0/P1)
|
|
- Allocate AI development to separate sprint
|
|
- Plan testing strategy for each phase
|
|
|
|
**For Coder:**
|
|
- Setup project with chess.js + chessboard.js
|
|
- Implement MVC architecture pattern
|
|
- Use provided code snippets as starting point
|
|
- Follow SOLID principles from research findings
|
|
|
|
**For Tester:**
|
|
- Focus on move validation edge cases
|
|
- Test special moves (castling, en passant, promotion)
|
|
- Verify mobile touch interactions
|
|
- Check localStorage persistence across sessions
|
|
|
|
**For Architect:**
|
|
- Design component hierarchy (if using React)
|
|
- Plan state management approach
|
|
- Define API contracts for multiplayer (future)
|
|
- Consider Web Worker architecture for AI
|
|
|
|
---
|
|
|
|
## 11. Conclusion
|
|
|
|
HTML5 chess game development in 2025 is well-supported by mature libraries (chess.js, chessboard.js) and modern web standards. The recommended approach is:
|
|
|
|
1. **DOM-based rendering** for simplicity and mobile support
|
|
2. **MVC architecture** with chess.js handling all game logic
|
|
3. **Tap-to-move + drag-drop** for universal accessibility
|
|
4. **Minimax with alpha-beta pruning** for AI (or Stockfish.js for advanced)
|
|
5. **localStorage + FEN/PGN** for state persistence
|
|
|
|
This foundation enables rapid MVP development (2-4 weeks) with clear paths for enhancement (AI, multiplayer, advanced features).
|
|
|
|
---
|
|
|
|
**Research Status:** ✅ Complete
|
|
**Next Action:** Share findings with hive via memory coordination
|
|
**Estimated MVP Timeline:** 2-4 weeks with 1-2 developers
|
|
**Recommended First Sprint:** Core gameplay (board + move validation)
|