Initial commit: CatDoku puzzle game with leaderboard
This commit is contained in:
commit
642f568ac6
11 files changed
+2988
No files matched your search
@@ -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
|
||||
Reference in new issue
Block a user