Initial commit: CatDoku puzzle game with leaderboard

This commit is contained in:
truetype committed 2026-06-15 18:40:07 +02:00
commit 642f568ac6
11 files changed
+2988

No files matched your search

+216
View File
@@ -0,0 +1,216 @@
# Architettura del Sistema
## Panoramica
CatDoku è un'applicazione web single-page (SPA) costruita con HTML, CSS e JavaScript vanilla. L'architettura segue un pattern MVC semplificato dove la logica di gioco, il rendering e lo stato sono separati ma comunicano attraverso funzioni ben definite.
## Struttura dei File
```
catdoku/
├── index.html # Entry point principale
── style.css # Foglio di stile globale
├── game.js # Logica di gioco (IIFE)
├── leaderboard.html # Pagina classifica (standalone)
└── docs/ # Documentazione
```
## Moduli Principali
### 1. Game State (Model)
Lo stato del gioco è gestito attraverso un oggetto `state` che contiene:
```javascript
let state = {
size: 8, // Dimensione griglia (6-12)
grid: [], // Array 2D delle celle
solution: [], // Array delle posizioni soluzione
errors: 3, // Errori rimanenti
maxErrors: 3, // Errori massimi
catsPlaced: 0, // Gatti piazzati
totalCats: 0, // Gatti totali (= size)
level: 1, // Livello corrente
score: 0, // Punteggio totale
hints: 3, // Suggerimenti rimanenti
gameOver: false, // Flag game over
won: false, // Flag vittoria
playerName: '', // Nome giocatore
levelStartTime: null, // Timestamp inizio livello
levelTime: 0, // Tempo trascorso (secondi)
sessionRecords: [] // Record della sessione
};
```
### 2. Grid Cell Structure
Ogni cella della griglia è un oggetto con:
```javascript
{
color: 0-11, // Indice colore (0-11)
hasCat: boolean, // Contiene un gatto?
hasX: boolean, // Contiene una X?
isSolution: boolean // È parte della soluzione?
}
```
### 3. Generator Module
Il generatore di puzzle è composto da tre funzioni principali:
#### generateSolution(size)
- **Input**: Dimensione griglia
- **Output**: Array di posizioni {row, col}
- **Algoritmo**: Backtracking randomizzato
- **Complessità**: O(n!) nel worst case, ma con pruning efficiente
#### generateColors(size, solution)
- **Input**: Dimensione griglia e soluzione
- **Output**: Griglia 2D di indici colore
- **Algoritmo**: Flood fill simultaneo BFS
- **Garantisce**: Regioni contigue e connesse
#### generatePuzzle(size)
- **Input**: Dimensione griglia
- **Output**: Oggetto {grid, solution}
- **Processo**: Combina solution + colors + stato iniziale
### 4. Validation Module
Funzioni di validazione per le regole del gioco:
```javascript
isValidPlacement(row, col) {
// Controlla:
// 1. Cella non ha X
// 2. Nessun gatto nella riga
// 3. Nessun gatto nella colonna
// 4. Nessun gatto nello stesso colore
// 5. Nessun gatto adiacente (8 direzioni)
}
```
### 5. UI/Rendering Module
#### renderGrid()
- Ricostruisce completamente il DOM della griglia
- Applica colori di background dalle costanti COLORS
- Aggiunge event listeners per interazioni
#### updateUI()
- Aggiorna contatori (livello, punteggio, tempo, gatti)
- Aggiorna indicatori errori (cuori)
- Aggiorna badge suggerimenti
### 6. Input Handling Module
Gestisce due tipi di interazione:
#### Mouse Events
- `mousedown`: Avvia timer per long press
- `mouseup`: Se long press non attivato → toggle X
- `mouseleave`: Cancella timer
#### Touch Events
- `touchstart`: Avvia timer per long press
- `touchend`: Se long press non attivato → toggle X
- `touchcancel`: Cancella timer
**Long press threshold**: 500ms
### 7. Timer Module
```javascript
startTimer() {
// Avvia setInterval che aggiorna levelTime ogni secondo
}
stopTimer() {
// Ferma il timer
}
formatTime(seconds) {
// Converte secondi in formato mm:ss
}
```
### 8. Storage Module
Utilizza `localStorage` per persistenza:
```javascript
// Key: 'catdoku_records'
// Value: JSON array di record
{
playerName: string,
level: number,
gridSize: number,
time: number, // secondi
score: number,
errors: number,
hintsUsed: number,
date: ISO string
}
```
## Flusso di Gioco
```
1. Avvio
↓
2. Input nome giocatore
↓
3. Selezione dimensione griglia
↓
4. Generazione puzzle
↓
5. Avvio timer
↓
6. Loop di gioco (input → validazione → render)
↓
7. Vittoria o Game Over
↓
8. Salvataggio record
↓
9. Prossimo livello o nuova partita
```
## Gestione Errori
Il sistema gestisce errori in due modi:
1. **Errori di gioco** (posizionamento invalido):
- Decrementa contatore errori
- Flash rosso sulla cella
- Game Over se errori = 0
2. **Errori di sistema**:
- Try-catch non utilizzato (codice sincrono)
- Fallback nel generatore (se backtracking fallisce 100 volte)
## Performance Considerations
- **Rendering**: Ricostruzione completa DOM ad ogni azione (accettabile per griglie ≤12×12)
- **Generazione**: Backtracking con pruning, media <100ms per griglia 10×10
- **Storage**: localStorage è sincrono, operazioni rapide per piccoli dataset
## Security Considerations
- Nessun dato sensibile trasmesso
- localStorage è locale al browser
- No eval() o codice dinamico
- Input nome giocatore sanitizzato (trim, maxlength)
## Browser Compatibility
Testato e compatibile con:
- Chrome 90+
- Firefox 88+
- Safari 14+
- Edge 90+
Requisiti:
- ES6+ support
- CSS Grid support
- localStorage support