Torna alla pagina Introduttiva del commento al codice
 
 

Classe Luogo


 
 

Classe Luogo


protected:
      friend fstream& operator>>(fstream& s, luogo* &a);
      static int luogocod;
      int idluogo;
      string sopranome;
      string nome;
      string descrizione;
      map<string,oggetto*> oggetti;
      luogo* nord;  string ostr_nord;
      luogo* sud;   string ostr_sud;
      luogo* est;   string ostr_est;
      luogo* ovest; string ostr_ovest;
      luogo* alto;  string ostr_alto;
      luogo* basso; string ostr_basso;
      bool stato;
      bool illuminazione;
      string suggest;
public:
      luogo(string n, string sopran, string d, bool i, bool st,          
      string sugg);
      ~luogo();
      void prnt_des();
      luogo& operator+=(oggetto &ogg);
      string name();
      int id();
      void pnord(luogo& n);

      void psud(luogo& s);
      void pest(luogo& e);
      void povest(luogo& o);
      void palto(luogo& a);
      void pbasso(luogo& b);
      void Onord(string StrN);
      void Osud(string StrS);
      void Oest(string StrE);
      void Oovest(string StrO);
      void Oalto(string StrA);
      void Obasso(string StrB);
      void delostr(string& direzione);
      void guarda(string ogg = "");
      void cambiastato();
      luogo& prendi(string& ogg, oggcont& zaino);
      luogo* vai(luogo* &utente, string& s);
      luogo* sposta(luogo* &utente, string& ogg);
      luogo* lascia(luogo* &utente, string& ogg, oggcont&
      zaino);
      luogo* apri(luogo* &utente, oggcont& zaino, string&        
      ogg1, string& ogg2);
      luogo* usa(luogo* &utente, oggcont& zaino, string&
      ogg1, string& ogg2);
      void accendi(oggcont& zaino, string& ogg1, string&
      ogg2);
      bool ricerca(string nomeobj, int&);
      int salva(fstream& uscita);
      int salvap(fstream& uscita);
 

 
 
 

Come nella classe Ambiente, la struttura portante della classe Luogo una mappa, in questo caso di oggetti (map<string,oggetto*>oggetti).

Nel campo privato di questa classe troviamo quattro stringhe: sopranome (string sopranome, che rappresenta il nome lungo del luogo), nome (string nome, che identifica i luoghi allinterno della mappa), descrizione (string descrizione) e suggest (string suggest).

Sopranome un messaggio che viene visualizzato allutente e lo informa della sua posizione allinterno di Ambiente; molto simile suggest, inizializzata con suggerimenti o brevi dialoghi.

Nome e descrizione, invece, sono rispettivamente il nome del luogo e lelenco delle possibili direzioni di spostamento. Gli interi luogocod (static int luogocod) e idluogo (int idluogo) servono invece a individuare univocamente il luogo; luocod, dichiarato statico, funge da contatore, mentre idluogo e lidentificatore numerico di ogni luogo. Il booleano stato viene usato col valore di false se il luogo non stato ancora visitato; questo servir per evitare che dopo il primo ingresso appaia nuovamente  allutente il suggerimento e la lista degli oggetti nel luogo. Illuminazione, anchessa booleano, ci permette di sapere se un luogo o meno illuminato.

Lutilizzo dei puntatori a luogo legato alle relative stringhe ostruzione e consente il collegamento tra i luoghi. Infine troviamo, dichiarata friend, la ridefinizione delloperatore >> (friend fstream& operator>> (fstream&, luogo*&)). Questa necessaria per il corretto funzionamento della carica della classe Ambiente.

 

METODI

Il costruttore della classe inizializza le quattro stringhe del campo protetto, pone a  true o false i due booleani in base agli argomenti, assegna un idluogo al luogo tramite la variabile statica luogocod, setta  a NULL tutti i puntatori luogo e inizializza a vuote le stringhe ostruzione. I puntatori a luogo e le relative ostruzioni, se ve ne sono, vengono assegnati in momenti successivi poich non si possono assegnare dei puntatori a luoghi che ancora non sono stati creati.

Il distruttore cancella gli oggetti dalla mappa. Molti dei metodi sono definiti inline dal momento che compiono semplici assegnamenti. E il caso di tutte le funzioni pdirezione (void pnord (luogo&) etc..) che inizializzano i puntatori  con lindirizzo del luogo passato come argomento, oppure delle funzioni Odirezione (void Onord (string) etc..) che assegnano alle rispettive stringhe una frase con la specificazione del tipo dellostruzione , ma anche di string name() e int id() che ritornano il valore dei campi protetti a cui si riferiscono. Anche cambiastato (void cambiastato()), modifica solamente il valore del booleano stato.

La ridefinizione delloperatore += (luogo& operator +=(oggetto& ogg)) necessaria per poter inserire gli oggetti allinterno del luogo attraverso la carica.

I metodi definiti allesterno della classe riguardano in gran parte limplementazione delle azioni che il giocatore pu effettuare.

La funzione guarda (void guarda (string ogg=)) in un primo tempo stampa il sopranome e leventuale suggerimento presente nel luogo. Il suggerimento, una volta stampato, viene opportunamente cancellato per evitare che venga stampato nuovamente. Poi, attraverso un controllo sul luogo e sugli oggetti in esso presenti, stampa la lista degli oggetti presenti se il luogo illuminato oppure se nel luogo si trova un oggetto che fa luce. Infine viene stampata la descrizione del luogo Prendi (luogo& prendi (string&, oggcont& zaino)) il metodo che permette di inserire un oggetto nella mappa degli oggetti  del contenitore zaino estrapolandolo dal luogo.  Dopo la consueta gestione degli errori (es. luogo vuoto) si fa un a ricerca nel luogo delloggetto da prendere e, gestita la situazione degli oggetti illuminabili e degli oggetti contenitore (chiamata alla funzione estrai), si effettua linserimento.

Inversa della prendi, la funzione  lascia (luogo* lascia (luogo* utente, string& ogg, oggcont& zaino). Questa, attraverso una chiamata allestrai ridefinita per gli oggetti contenitore (virtual oggetto* estrai (string& oggetto, string& tipo)) permette di lasciare nel luogo un oggetto presente nello zaino. La estrai viene chiamata sia dalla prendi che dalla lascia e restituisce un puntatore alloggetto estratto. Questa funzione stata definita in modo che estragga dallo zaino se a questultima viene passata la stringa zaino, dal luogo in tutti gli altri casi.

La funzione apri (luogo* apri (luogo*&utente, oggcont& zaino, string& ogg1, string& ogg2)), richiamata anche come apri con, effettua solamente dei controlli sul luogo e sullo zaino prima di richiamare la sua omonima sugli oggetti (apri e apri con).

Come la apri, funzionano anche la accendi (void accendi (oggcont& zaino, string& ogg1, string& ogg2)) , la sposta (luogo* sposta (luogo*& utente, string& ogg)) e la usa (luogo* usa (luogo*&utente, oggcont& zaino, string& ogg1, string& ogg2)).

Molto importante  invece la funzione vai (luogo* vai (luogo*& utente, string & s)), visto che quella che permette lo spostamento da un luogo allaltro. Vengono gestite singolarmente le direzioni possibili in base al valore della stringa s e, dopo aver controllato eventuali ostruzioni presenti, viene assegnato al puntatore utente lindirizzo del luogo che si trova in quella direzione.

A questo punto, se la prima volta accediamo al luogo, viene chiamata la guarda e il valore di stato viene settato a true. Se non la prima volta che accediamo al luogo (stato=true) non viene stampata la lista degli oggetti. Infine abbiamo una chiamata alla funzione prnt_des().

Il metodo delostr (void delostr (string& direzione)) viene richiamato da alcune funzioni della classe oggetto; il suo effetto quello di liberare una direzione ostruita cancellando la stringa ostruzione_direzione.

La ricerca di un oggetto allinterno del luogo possibile attraverso la funzione ricerca (bool ricerca (string nomeobj, int & trovato)). Largomento trovato necessario perch questa funzione chiamata dalla funzione end() di Ambiente, che gestisce la fine del gioco quando tutti gli oggetti da trovaresono stati lasciati ne luogo finale.

 

SALVA

La salva nella classe Luogo chiamata dalla salva di Ambiente e si occupa della scrittura sul file world.ini di tutt ci che riguarda il luogo.

Precisamente inserisce e inizializza le voci  NOMELUOGO, SOPRANOME, ILLUMINAZIONE e STATO; scrive allinterno dei separatori [Descrizione] e [EndDescrizione] la descrizione del luogo; nei separatori [Suggerimento] e [EndSuggerimento] gli eventuali suggerimenti e attraverso una chiamata alla salva degli oggetti, avvia la scrittura su file degli oggetti.

Il salvataggio dei puntatori avviene in maniera analoga per mezzo della funzione salvap (int salvap (fsream& uscita)). La distinzione fra le due funzioni salva (che salva le informazioni, lo stato e gli oggetti del luogo) e salvap (che salva solo i puntatori dei luoghi) importante poich non possibile assegnare puntatori a luoghi non ancora creati.

 

OPERATORE >>

La ridefinizione delloperatore >> necessaria per consentire la creazione dinamica dei luoghi in funzione del file che si decide di caricare (vedi carica della classe Ambiente).

Infatti tutte le voci presenti allinterno dei separatori [Luogo] e [EndLuogo] vengono recuperate attraverso la research e vanno ad inizializzare i campi protetti della classe luogo passati come argomento al costruttore. Quindi attraverso loperatore new viene allocato in memoria il luogo.