Per strutturare il progetto in maniera ordinata e ridurre al minimo le dipendenze tra le varie parti, è stata adottata un’architettura basata sul modello MVC. Questa scelta consente di realizzare un sistema flessibile, facilmente estendibile e in grado di adattarsi a scenari futuri.

Come mostrato in figura, è presente una separazione di responsabilità tra le principali classi, come segue:
SimModel implementa Model
MapGeneration per generare la mappa, di tipo MatrixSimParamsFireSpread e FireFighter per l’avanzamento della simulazioneMapGeneration genera una mappa verosimile di tipo Matrix con strategie più o meno complesseFireFighter gestisce il movimento di un vigile del fuoco, aggiornando il movimento e le azioni svolte dal vigile del fuoco, come spegnere celle infuocate o ricaricareFireSpread si occupa della gestione dell’avanzamento del fuoco, andando a modificare o aggiornare le celle, come ad esempio trasformare le celle che stanno bruciando a celle bruciate.SimController implementa Controller
CellTypeConverter per la conversione tra tipi di celle model e tipi di celle viewSimModel per:
SimView visualizza le informazioni fornite dal SimController
SimController gli input ricevuti dall’utente

Come mostrato in figura, le interfacce di Model, View e Controller permettono una separazione delle responsabilità, come segue:
Model: viene interrogato dal controller e gestisce la logica della simulazione nella sua interezzaController: gestisce il loop della simulazione e collega View e ModelView: si occupa della visualizzazione delle informazioni fornite dal Controller e dell’invio al controller di input ricevuti dall’utenteIl modello MVC permette di separare in modo netto la logica dei dati, la presentazione e il controllo del flusso. Questa impostazione può introdurre rigidità e maggiore carico di gestione, ma porta con sé molteplici vantaggi: