# Data Models and Structures ## Core Data Structures ### 1. Square Represents a single square on the chess board. ```javascript class Square { file: number; // 0-7 (a-h) rank: number; // 0-7 (1-8) color: 'light' | 'dark'; piece: ChessPiece | null; // Helper methods toAlgebraic(): string; // "e4" fromAlgebraic(notation: string): Square; equals(other: Square): boolean; clone(): Square; } // Examples { file: 4, rank: 3, color: 'light', piece: null } // e4 { file: 0, rank: 0, color: 'dark', piece: WhiteRook } // a1 ``` **Algebraic Notation Mapping**: - Files: a=0, b=1, c=2, d=3, e=4, f=5, g=6, h=7 - Ranks: 1=0, 2=1, 3=2, 4=3, 5=4, 6=5, 7=6, 8=7 --- ### 2. BoardState Represents the complete chess board configuration. ```javascript class BoardState { // Array representation (primary) squares: Square[64]; // Alternative: 2D array // grid: Square[8][8]; // Bitboard representation (optional, for performance) bitboards: { white: { pawns: BigInt, knights: BigInt, bishops: BigInt, rooks: BigInt, queens: BigInt, king: BigInt, all: BigInt }, black: { /* same structure */ }, occupied: BigInt, empty: BigInt }; // Helper methods getSquare(file: number, rank: number): Square; getSquareByIndex(index: number): Square; getPieceAt(square: Square): ChessPiece | null; setPieceAt(square: Square, piece: ChessPiece): void; removePieceAt(square: Square): void; clone(): BoardState; toFEN(): string; fromFEN(fen: string): BoardState; } ``` **Index Calculation**: ```javascript // Square to index: rank * 8 + file // Index to square: { file: index % 8, rank: Math.floor(index / 8) } ``` **Starting Position FEN**: ``` rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 ``` --- ### 3. PieceType Enumeration ```javascript const PieceType = { PAWN: 'pawn', KNIGHT: 'knight', BISHOP: 'bishop', ROOK: 'rook', QUEEN: 'queen', KING: 'king' }; const PieceValue = { pawn: 1, knight: 3, bishop: 3, rook: 5, queen: 9, king: Infinity }; const PieceNotation = { pawn: '', // No letter for pawns knight: 'N', bishop: 'B', rook: 'R', queen: 'Q', king: 'K' }; ``` --- ### 4. Move Represents a single chess move with all metadata. ```javascript class Move { from: Square; to: Square; piece: PieceType; color: 'white' | 'black'; captured: PieceType | null; promotion: PieceType | null; // Special move flags isCastling: boolean; isEnPassant: boolean; isCheck: boolean; isCheckmate: boolean; // Metadata notation: string; // "Nf3", "exd5", "O-O" algebraicNotation: string; // "e2e4" timestamp: number; moveNumber: number; // Methods toSAN(): string; // Standard Algebraic Notation toLAN(): string; // Long Algebraic Notation toUCI(): string; // Universal Chess Interface equals(other: Move): boolean; clone(): Move; } ``` **Notation Examples**: - **SAN**: "Nf3", "e4", "O-O", "Qxe5+", "e8=Q#" - **LAN**: "Ng1-f3", "e2-e4", "Qd1xe5+" - **UCI**: "e2e4", "e7e5", "e1g1" (castling), "e7e8q" (promotion) --- ### 5. GameState Complete game state snapshot for state management. ```javascript class GameState { board: BoardState; currentPlayer: 'white' | 'black'; moveNumber: number; halfMoveClock: number; // For 50-move rule // Special move tracking enPassantSquare: Square | null; castlingRights: { whiteKingSide: boolean, whiteQueenSide: boolean, blackKingSide: boolean, blackQueenSide: boolean }; // Game status status: GameStatus; lastMove: Move | null; // Captured pieces capturedPieces: { white: PieceType[], black: PieceType[] }; // Methods toFEN(): string; fromFEN(fen: string): GameState; clone(): GameState; hash(): string; // For position repetition equals(other: GameState): boolean; } ``` **FEN Format**: ``` rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 │ │ │ │ │ │ │ │ │ │ │ └─ Full move number │ │ │ │ └─── Halfmove clock │ │ │ └───── En passant square │ │ └────────── Castling rights │ └──────────── Active player └──────────────────────────────────────────────────────── Board position ``` --- ### 6. GameStatus Enumeration ```javascript const GameStatus = { ACTIVE: 'active', CHECK: 'check', CHECKMATE: 'checkmate', STALEMATE: 'stalemate', DRAW_50_MOVE: 'draw-50-move', DRAW_REPETITION: 'draw-repetition', DRAW_INSUFFICIENT: 'draw-insufficient-material', DRAW_AGREEMENT: 'draw-agreement', RESIGNATION: 'resignation' }; ``` --- ### 7. GameConfiguration Settings and options for game initialization. ```javascript class GameConfig { mode: 'pvp' | 'pva' | 'ava'; timeControl: TimeControl | null; playerWhite: Player; playerBlack: Player; aiDifficulty: number; // 1-10 for AI opponent theme: string; soundEnabled: boolean; animationSpeed: number; // ms for animations autoSave: boolean; legalMovesHighlight: boolean; dragAndDrop: boolean; } class TimeControl { type: 'none' | 'classical' | 'rapid' | 'blitz' | 'bullet'; initialTime: number; // seconds increment: number; // seconds per move whiteTime: number; blackTime: number; } class Player { name: string; type: 'human' | 'ai'; color: 'white' | 'black'; elo: number | null; } ``` --- ### 8. MoveHistory Structure for tracking complete game history. ```javascript class MoveHistory { moves: Move[]; positions: string[]; // FEN strings for repetition detection currentIndex: number; startingPosition: string; // Initial FEN // PGN metadata metadata: { event: string, site: string, date: string, round: string, white: string, black: string, result: string }; // Methods addMove(move: Move, position: string): void; getMove(index: number): Move; getAllMoves(): Move[]; undo(): Move | null; redo(): Move | null; canUndo(): boolean; canRedo(): boolean; clear(): void; toPGN(): string; fromPGN(pgn: string): MoveHistory; toJSON(): string; fromJSON(json: string): MoveHistory; } ``` **PGN Format Example**: ``` [Event "Casual Game"] [Site "Chess App"] [Date "2025.11.22"] [Round "1"] [White "Player 1"] [Black "Player 2"] [Result "1-0"] 1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 1-0 ``` --- ### 9. Event System Event definitions for component communication. ```javascript class GameEvent { type: EventType; payload: any; timestamp: number; source: string; } const EventType = { // Board events SQUARE_CLICKED: 'square-clicked', PIECE_SELECTED: 'piece-selected', PIECE_MOVED: 'piece-moved', PIECE_CAPTURED: 'piece-captured', PIECE_PROMOTED: 'piece-promoted', // Game events GAME_STARTED: 'game-started', GAME_OVER: 'game-over', TURN_CHANGED: 'turn-changed', CHECK_DETECTED: 'check-detected', MOVE_EXECUTED: 'move-executed', MOVE_UNDONE: 'move-undone', MOVE_REDONE: 'move-redone', // UI events THEME_CHANGED: 'theme-changed', SETTINGS_UPDATED: 'settings-updated', // AI events AI_THINKING: 'ai-thinking', AI_MOVE_READY: 'ai-move-ready', // Error events INVALID_MOVE: 'invalid-move', VALIDATION_FAILED: 'validation-failed' }; ``` --- ### 10. Bitboard Representation (Advanced) For performance-critical operations and AI. ```javascript class Bitboard { value: BigInt; // 64-bit integer representing board // Bitwise operations setBit(square: Square): void; clearBit(square: Square): void; toggleBit(square: Square): void; testBit(square: Square): boolean; popCount(): number; // Count set bits // Board operations and(other: Bitboard): Bitboard; or(other: Bitboard): Bitboard; xor(other: Bitboard): Bitboard; not(): Bitboard; shift(direction: number): Bitboard; // Move generation helpers northOne(): Bitboard; southOne(): Bitboard; eastOne(): Bitboard; westOne(): Bitboard; getSetSquares(): Square[]; } ``` **Bitboard Example**: ``` Bit 0 = a1, Bit 1 = b1, ..., Bit 7 = h1 Bit 8 = a2, Bit 9 = b2, ..., Bit 63 = h8 White pawns starting position: 0x000000000000FF00 (bits 8-15 set) Black pawns starting position: 0x00FF000000000000 (bits 48-55 set) ``` --- ## Data Flow Diagrams ### Move Execution Flow ``` User Input ↓ UI captures click/drag ↓ GameController validates selection ↓ MoveValidator checks legality ↓ GameEngine executes move ↓ BoardState updated ↓ GameHistory records move ↓ UI renders new state ↓ Turn switches ``` ### State Update Flow ``` Move → GameState (immutable) → New GameState ↓ ↓ └─────── History records both ──────┘ ``` --- ## Serialization Formats ### JSON Save Format ```json { "version": "1.0.0", "timestamp": 1700000000000, "gameState": { "fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", "moveHistory": [ {"from": "e2", "to": "e4", "notation": "e4"}, {"from": "e7", "to": "e5", "notation": "e5"} ], "capturedPieces": {"white": [], "black": []}, "timeControl": { "whiteTime": 600, "blackTime": 595 } }, "config": { "mode": "pvp", "theme": "classic" } } ``` ### Local Storage Keys ```javascript const StorageKeys = { CURRENT_GAME: 'chess-current-game', SAVED_GAMES: 'chess-saved-games', SETTINGS: 'chess-settings', THEME: 'chess-theme', GAME_HISTORY: 'chess-game-history' }; ``` --- ## Performance Considerations ### Memory Optimization - **Board Representation**: Array[64] uses ~2KB per position - **Move History**: Average game ~80 moves = ~40KB - **Bitboards**: Enable compact representation (8 bytes per piece type) ### Caching Strategy ```javascript class CacheManager { moveValidationCache: Map; moveGenerationCache: Map; evaluationCache: Map; maxSize: number = 10000; set(key: string, value: any): void; get(key: string): any | null; clear(): void; prune(): void; // Remove old entries } ``` ### Position Hashing ```javascript // Zobrist hashing for position identification class ZobristHash { pieceKeys: BigInt[64][12]; // Square × PieceType castlingKeys: BigInt[4]; enPassantKeys: BigInt[8]; sideToMoveKey: BigInt; hash(gameState: GameState): BigInt; updateHash(hash: BigInt, move: Move): BigInt; } ``` This data model design ensures efficient state management, easy serialization, and optimal performance for both UI rendering and AI computation.