Beispiel #1
0
        // 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);
        }
Beispiel #2
0
        // 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;
                }
            }
        }
Beispiel #3
0
        // 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!");
            }
        }
Beispiel #4
0
        // 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();
            }
        }