// 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(); } }
// Metodo che richiama il form che visualizza le informazioni relative alla partita in corso private void CallUpGameInfo(object sender, EventArgs e) { // si crea il form delle informazioni sulla partita InfoView gameInfo = new InfoView { // vengono aggiornate le informazioni contenute nel form MinefieldName = _minefieldCreator.GetMinefieldName(), MinefieldLength = _length.ToString(), MinefieldHeight = _height.ToString(), MinefieldMines = _mines.ToString(), ModalityName = _minesweeperGame.SelectedModality.ToString(), Attempts = "---" }; // vengono visualizzati i tentativi rimanenti e totali se tale informazione è definita if (_minesweeperGame.RemainingAttempts != null) { gameInfo.Attempts = _minesweeperGame.RemainingAttempts + " / " + _minesweeperGame.TotalAttempts; } // si visualizza il form come finestra di dialogo modale gameInfo.ShowDialog(); }