// Metodo che restituisce il creatore associato al campo minato dal nome specificato public IMinefieldCreator GetMinefieldCreator(string minefieldName) { // creatore di campo minato da restituire IMinefieldCreator minefieldCreator = null; // si cerca il creatore corrispondente al nome specificato di campo minato foreach (Tuple <string, string, Type> entry in _minefieldsTable) { if (entry.Item1 == minefieldName) { minefieldCreator = (IMinefieldCreator)Activator.CreateInstance(entry.Item3); break; } } return(minefieldCreator); }
// Metodo eseguito quando l'utente ha stabilito la configurazione di gioco private void AcquireConfiguration(object sender, EventArgs e) { if (_settingsMemento == null) { // CASO A - Non è stata acquisita alcuna configurazione di gioco // si acquisisce la configurazione di gioco stabilita dall'utente _minefieldCreator = _settingsController.GetGameConfiguration(out _length, out _height, out _mines, out _modality); // si crea un campo minato e una partita opportunamente configurate con le scelte dell'utente _minefield = _minefieldCreator.CreateMinefield(_length, _height, _mines); _minesweeperGame = new MinesweeperGame(_minefield, _modality); // si crea un gestore eventi per la scoperta di una zona del campo minato _minesweeperGame.ZoneUncovered += UpdateInteractableZone; // si configurano le zone interagibili e i controlli del form di gioco _mainForm.SetInteractableMinefieldSize(_length, _height); _interactableZoneUncovered = false; SetFormControls(); // si memorizza lo stato attuale del form delle impostazioni _settingsMemento = _settingsController.SaveState(); } else { // CASO B - Almeno una configurazione di gioco è stata acquisita // si acquisisce lo stato attuale del form delle impostazioni IMemento newMemento = _settingsController.SaveState(); // si configura una nuova partita se almeno una zona interagibile è stata scoperta // oppure se il vecchio e il nuovo memento delle impostazioni differiscono tra loro if (_interactableZoneUncovered || !_settingsMemento.Equals(newMemento)) { // si acquisisce e si analizza la configurazione di gioco più recente AcquireNewConfiguration(); // si configurano le zone interagibili e i controlli del form di gioco _mainForm.SetInteractableMinefieldSize(_length, _height); _interactableZoneUncovered = false; SetFormControls(); // si memorizza lo stato attuale del form delle impostazioni _settingsMemento = newMemento; } } }
// Costruttore che associa a ciascun campo minato un nome univoco, una descrizione e un creatore public MinesweeperHelper() { // si acquisiscono tutti i tipi contenuti nella libreria Type[] libraryTypes = GetType().Assembly.GetTypes(); // creazione e inizializzazione della lista dei tipi di creatore di campi minati List <Type> minefieldCreatorTypes = new List <Type>(); foreach (Type libraryType in libraryTypes) { // se il tipo analizzato è un creatore di campi minati allora viene aggiunto alla lista if (typeof(IMinefieldCreator).IsAssignableFrom(libraryType)) { minefieldCreatorTypes.Add(libraryType); } } // si rimuove dalla lista il tipo rappresentante l'interfaccia di un creatore di campi minati minefieldCreatorTypes.Remove(typeof(IMinefieldCreator)); // insieme di elementi non uguali contenente i nomi dei campi minati HashSet <string> minefieldNamesHashSet = new HashSet <string>(); // creazione e inizializzazione della "tabella" delle informazioni dei campi minati _minefieldsTable = new List <Tuple <string, string, Type> >(); foreach (Type creatorType in minefieldCreatorTypes) { // si crea un'istanza di un creatore di campi minati IMinefieldCreator creator = (IMinefieldCreator)Activator.CreateInstance(creatorType); // si aggiunge il nome del campo minato a cui il creatore fa riferimento nella struttura HashSet minefieldNamesHashSet.Add(creator.GetMinefieldName().Trim()); // si aggiunge alla "tabella" delle informazioni dei campi minati una nuova entry _minefieldsTable.Add(new Tuple <string, string, Type>(creator.GetMinefieldName().Trim(), creator.GetMinefieldInfo().Trim(), creatorType)); } if (minefieldNamesHashSet.Count < minefieldCreatorTypes.Count) { throw new Exception ("Ciascun creatore di campo minato deve restituire un nome univoco di campo minato!"); } }
// Metodo che acquisisce e analizza la configurazione di gioco più recente stabilita dall'utente private void AcquireNewConfiguration() { // si memorizzano a parte il vecchio creatore di campo minato e la vecchia modalità di gioco IMinefieldCreator oldMinefieldCreator = _minefieldCreator; MinesweeperGame.GameModality oldModality = _modality; // si acquisisce la nuova configurazione di gioco stabilita dall'utente _minefieldCreator = _settingsController.GetGameConfiguration(out _length, out _height, out _mines, out _modality); // CASO A - se si ha acquisito una nuova tipologia di campo minato oppure una nuova // modalità di gioco allora si crea una nuova partita con nuove impostazioni if (oldMinefieldCreator.GetMinefieldName() != _minefieldCreator.GetMinefieldName() || oldModality != _modality) { // si determina se creare un nuovo campo minato dello stesso tipo oppure di tipo diverso if (oldMinefieldCreator.GetMinefieldName() != _minefieldCreator.GetMinefieldName()) { _minefield = _minefieldCreator.CreateMinefield(_length, _height, _mines); } else { _minefield.CreateNewMinefield(_length, _height, _mines); } // si crea una nuova partita con nuove impostazioni _minesweeperGame.NewGame(_minefield, _modality); } else { // CASO B - se si ha acquisito la stessa tipologia di campo minato e la stessa // modalità di gioco allora si crea una nuova partita con le medesime impostazioni _minefield.CreateNewMinefield(_length, _height, _mines); _minesweeperGame.NewGame(); } }