# Progettare un Gioco: Applicare i Design Pattern ## Panoramica dell'assegnazione Metti in pratica le tue nuove conoscenze sui design pattern creando un prototipo di gioco semplice! Questo compito ti aiuterà a esercitarti sia con i pattern architetturali (ereditarietà o composizione) sia con il sistema di comunicazione pub/sub che hai imparato nella lezione. ## Istruzioni Crea una rappresentazione di gioco semplice che dimostri i design pattern trattati in questa lezione. Il tuo gioco dovrebbe essere funzionale, ma non è necessario che abbia una grafica complessa – concentrati sull'architettura sottostante e sui modelli di comunicazione. ### Requisiti **Scegli il tuo pattern architetturale:** - **Opzione A**: Usa l'ereditarietà basata su classi (come l'esempio `GameObject` → `Movable` → `Hero`) - **Opzione B**: Usa la composizione (come l'approccio con funzione factory e comportamenti misti) **Implementa la comunicazione:** - **Includi** una classe `EventEmitter` per la messaggistica pub/sub - **Configura** almeno 2-3 tipi di messaggi diversi (come `PLAYER_MOVE`, `ENEMY_SPAWN`, `SCORE_UPDATE`) - **Collega** l'input dell'utente (tastiera/mouse) agli eventi del gioco tramite il sistema di eventi **Elementi di gioco da includere:** - Almeno un personaggio controllato dal giocatore - Almeno un altro oggetto di gioco (nemico, oggetto da raccogliere o elemento ambientale) - Interazione di base tra gli oggetti (collisione, raccolta o comunicazione) ### Idee di gioco suggerite **Giochi semplici da considerare:** - **Gioco del Serpente** – I segmenti del serpente seguono la testa, il cibo appare casualmente - **Variante di Pong** – La racchetta risponde agli input, la pallina rimbalza sui muri - **Gioco del Collezionista** – Il giocatore si muove raccogliendo oggetti ed evitando ostacoli - **Base di Tower Defense** – Le torri rilevano e sparano ai nemici in movimento ### Linee guida per la struttura del codice ```javascript // Example starting structure const Messages = { // Define your game messages here }; class EventEmitter { // Your event system implementation } // Choose either class-based OR composition approach // Class-based example: class GameObject { /* base properties */ } class Player extends GameObject { /* player-specific behavior */ } // OR Composition example: const gameObject = { /* base properties */ }; const movable = { /* movement behavior */ }; function createPlayer() { /* combine behaviors */ } ``` ### Testare la tua implementazione **Verifica che il tuo codice funzioni:** - **Testando** che gli oggetti si muovano o cambino quando gli eventi vengono attivati - **Confermando** che più oggetti possano rispondere allo stesso evento - **Controllando** che sia possibile aggiungere nuovi comportamenti senza modificare il codice esistente - **Assicurandoti** che l'input da tastiera/mouse attivi correttamente gli eventi del gioco ## Linee guida per la consegna **La tua consegna dovrebbe includere:** 1. **File JavaScript** con l'implementazione del tuo gioco 2. **File HTML** per eseguire e testare il tuo gioco (può essere semplice) 3. **Commenti** che spiegano quale pattern hai scelto e perché 4. **Breve documentazione** dei tipi di messaggi e delle loro funzioni ## Griglia di valutazione | Criteri | Esemplare (3 punti) | Adeguato (2 punti) | Da migliorare (1 punto) | |---------|---------------------|--------------------|--------------------------| | **Pattern architetturale** | Implementa correttamente l'ereditarietà OPPURE la composizione con una chiara gerarchia di classi/oggetti | Usa il pattern scelto con lievi problemi o incoerenze | Tenta di usare il pattern ma l'implementazione presenta problemi significativi | | **Implementazione Pub/Sub** | EventEmitter funziona correttamente con più tipi di messaggi e flusso di eventi appropriato | Sistema pub/sub di base funziona con una gestione degli eventi adeguata | Sistema di eventi presente ma non funziona in modo affidabile | | **Funzionalità del gioco** | Tre o più elementi interattivi che comunicano tramite eventi | Due elementi interattivi con comunicazione di eventi di base | Un elemento risponde agli eventi o ha un'interazione di base | | **Qualità del codice** | Codice pulito, ben commentato, con organizzazione logica e JavaScript moderno | Codice generalmente ben organizzato con commenti adeguati | Il codice funziona ma manca di organizzazione o di commenti chiari | **Punti bonus:** - **Meccaniche di gioco creative** che mostrano usi interessanti dei pattern - **Metodi di input multipli** (eventi da tastiera E mouse) - **Architettura scalabile** che sarebbe facile da estendere con nuove funzionalità --- **Disclaimer**: Questo documento è stato tradotto utilizzando il servizio di traduzione AI [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche potrebbero contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale umana. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.