feat: implement Phase 21 - replace with pattern-based generation
Replace Robatron's complex algorithm with simpler, always-valid approach:
Core Changes:
- src/useBoard/SudokuGenerator.ts: Complete rewrite
- Pattern-based generation (base pattern + structural shuffles)
- Generate complete solution first, then remove cells
- Validates all boards before returning (defensive)
- Class-based API: generate(), getPuzzle(), getSolution()
- Configurable difficulty: CELLS_TO_REMOVE = {easy: 40, medium: 50, hard: 60}
- ~130 lines vs 372 lines (much simpler)
- src/useBoard/SudokuRenderer.ts: NEW - Clean separation
- render(board, initialBoard): Displays current state
- renderEmpty(): Shows empty 9x9 grid
- Distinguishes 'given' vs 'user-entered' cells with CSS classes
- src/useBoard/useBoard.ts: Updated for class architecture
- Refs: generatorRef, rendererRef, boardRef, solutionRef
- Uses class instances for generation and rendering
- Clean separation of concerns
- src/useBoard/SudokuGenerator.test.ts: Unit tests
- Tests valid board generation (100x)
- Tests correct cell removal counts per difficulty
- Tests puzzle/solution consistency
Algorithm Benefits:
1. Always valid - starts with mathematically valid board
2. Always solvable - we keep the solution reference
3. Fast - no backtracking, just pattern + shuffle
4. Simple - easy to understand and maintain
5. Predictable - difficulty = cell count, not complexity
Pattern-Based Approach:
- Base pattern ensures valid structure
- Shuffle rows/cols within bands/stacks (preserves 3x3 boxes)
- Shuffle band/stack order
- Shuffle digit mapping (1-9)
- Result: Valid, random, unique board every time
Phase 21 complete. Next: Phase 30 (useGameStatus hook).
This commit is contained in:
+13
-8
@@ -77,14 +77,19 @@ src/
|
||||
|
||||
### Phase 20: useBoard Hook
|
||||
|
||||
- [ ] Port SudokuGenerator from src_old/lib/Sudoku.ts
|
||||
- [ ] Port SudokuRenderer from src_old rendering logic
|
||||
- [ ] Implement useBoard hook with refs pattern
|
||||
- containerRef for DOM
|
||||
- boardRef for SudokuBoard (2D array of cells)
|
||||
- initialBoardRef for puzzle state
|
||||
- solutionRef for solved state
|
||||
- [ ] Methods: renderBoard, generateBoard, getCell, setCell, canEditCell, isComplete, isFullyValid
|
||||
- [x] Port SudokuGenerator from src_old/lib/Sudoku.ts (Robatron's implementation)
|
||||
- [x] Basic puzzle generation and rendering
|
||||
- [x] Game flow integration (startGame/quitGame)
|
||||
|
||||
### Phase 21: Replace with Better Generation Algorithm
|
||||
|
||||
- [ ] Replace Robatron's algorithm with pattern-based generation
|
||||
- [ ] Implement SudokuGenerator class (from src_old/sudoku/)
|
||||
- [ ] Implement SudokuRenderer class for clean separation
|
||||
- [ ] Update useBoard to use new classes
|
||||
- [ ] Store both puzzle and solution refs
|
||||
- [ ] Port unit tests for validation
|
||||
- [ ] Three difficulty levels with configurable cell removal
|
||||
|
||||
### Phase 30: useGameStatus Hook
|
||||
|
||||
|
||||
Reference in New Issue
Block a user