Torna alla pagina Introduttiva del codice

Ambiente

 

 

//______________________________________________________________________________
// Classe Ambiente     (Contenitore di luoghi)

#include "dichiarazioni.h"
oggcont ambiente::zaino("zaino","Il tuo zainetto",false,false,false,true,false,"","",true);

// *** Distruttore della classe Ambiente ***
ambiente::~ambiente(){
    for (map<string,luogo*>::iterator i = luoghi.begin(); i!=luoghi.end(); i++)
        delete(i->second);
}

// *** Costruttore della classe Ambiente ***
ambiente::ambiente(luogo& ll){
     utente = &ll;
     fine = NULL;
}

// *** Ridefinizione dell'operatore += della classe Ambiente ***
ambiente& ambiente::operator+=(luogo& l){
     string desc = l.name();
     pair<string,luogo*> a(desc,&l);
     luoghi.insert(a);
     return *this;
}

// *** Analizza della classe Ambiente (analizzatore sintattico)***
void ambiente::analizza(string s){
     bool penna = false;
     s+=' ';
     int dim=0;
     for (string::const_iterator i=s.begin(); i!=s.end(); i++){
         if ((!penna)&&(*i!=' ')){penna = true; continue;}
         if (penna && (*i==' ')){penna = false; dim++;}
     }
     if (dim==0) dim++;
     string = newmsg[dim]; string temp=""; int n=0;
     for (string::const_iterator i=s.begin(); i!=s.end(); i++){
         if (!penna &&(*i==' '))continue;
         if (!penna &&(*i!=' ')){penna = true; temp=*i; continue;}
         if (penna && (*i!=' ')){temp+=*i; continue;}
         if (penna && (*i==' ')){penna = false; msg[n]+=temp; n++;}
     }
     string word = msg[0];
     if (word=="prendi"){
         if (1<dim){
             word=msg[1];
             utente->prendi(word,zaino);
         }else cout<<"\n - Si! Penso proprio che ti prender"<<o<<" a schiaffi...!\n";
     }
     if (word == "usa"){
        if (3<dim && (msg[2]=="con")){
           string ogg1=msg[1]; string ogg2=msg[3];
           utente->usa(utente,zaino,ogg1,ogg2);
        }
        else if (3<=dim && msg[2]!="con") cout<<"\n ! ERRORE: La parola scritta dopo il primo oggetto non "<<e<<" 'con'.\n";
        else if(2<dim) cout<<"\n ! ERRORE: Manca il secondo oggetto.\n";
        else if(1<dim) cout<<"\n ! ERRORE: sintassi non riconosciuta. Manca 'con'.\n";
        else cout<<"\n - Che cosa dovrei usare? \n";
    }
    if (word=="lascia"){
       if (1<dim){
          word=msg[1];
          utente->lascia(utente,word,zaino);
       }else cout<<"\n - Bisogna lasciarsi dietro tutti i desideri terreni: la felicit"<<a<<' '<<e<<" in noi!\n";
    }
    if (word=="vai"){
       if (1<dim){
          word = msg[1];
          utente->vai(utente,word);  
       }else cout<<"\n - Sapere dove andare nella vita "<<e<<" importante...\n";
    }
    if (word=="apri"){
       if (3<dim && msg[2]=="con"){
          string ogg1=msg[1]; string ogg2=msg[3];
          utente->apri(utente,zaino,ogg1,ogg2);
       }
       else if(3<=dim && msg[2]!="con") cout<<"\n ! ERRORE: La parola scritta dopo il primo oggetto non "<<e<<" 'con'.\n";
       else if(2<dim) cout<<"\n ! ERRORE: Manca il secondo oggetto.\n";
       else if(1<dim){
          string ogg1=msg[1]; string ogg2="";
          utente->apri(utente,zaino,ogg1,ogg2);
       }else cout<<"\n - Che cosa dovrei aprire?\n";
    }
    if (word=="sposta"){
       if (3<dim && msg[2]=="con"){
         string ogg1=msg[1]; string ogg2=msg[3];
         utente->sposta(utente,ogg1,ogg2);
       }
       else if(3<=dim && msg[2]!="con") cout<<"\n ! ERRORE: La parola scritta dopo il primo oggetto non "<<e<<" 'con'.\n";
       else if(2<dim) cout<<"\n ! ERRORE: Manca il secondo oggetto.\n";
       else if(1<dim){
          string ogg1=msg[1]; string ogg2="";
          utente->sposta(utente,ogg1,ogg2);
       }else cout<<"\n - Interpretare i tuoi comandi "<<e<<" arduo, soprattutto se non sai cosa vuoi fare!\n";
    }
    if (word=="accendi"){
       if (3<dim && msg[2]=="con"){
          string ogg1=msg[1]; string ogg2=msg[3];
          utente->accendi(zaino,ogg1,ogg2);
       }
       else if(3<=dim && msg[2]!="con") cout<<"\n ! ERRORE: La parola scritta dopo il primo oggetto non "<<e<<" 'con'.\n";
       else if(2<dim) cout<<"\n ! ERRORE: Manca il secondo oggetto.\n";
       else if(1<dim){
         string ogg1=msg[1]; string ogg2="";
         utente->accendi(zaino,ogg1,ogg2);
       }else cout<<"\n - Cosa dovrei accendere?\n - Piuttosto accendi il tuo cervello prima...\n";
    }
    if (word=="guarda"){
       if (1<dim){
           word=msg[1];
           if (word != "zaino") utente->guarda(word);
             else zaino.guarda();  
       }else utente->guarda();
    }
    if (word=="esci"){
        string domanda;
        cout<<"\n - Vuoi salvare la partita? si/no\n";
        cout<<"\nSono in attesa di una risposta => ";
        getline(cin,domanda);
        if (domanda == "si") salva();
    }
    if (word=="salva") salva();
    if (word=="aiuto") help();
    end();
    delete[] msg;
};

// *** Salva della classe Ambiente ***
int ambiente::salva(){
    fstream uscita;
    uscita.open("world.ini", ios::out);
    if (uscita.bad()){ cout<<"\n ! ERRORE: In apertura del file.\n"; return 1;}
    uscita<<"[Titolo]\n"<<titolo<<"[EndTitolo]\n\n[Zaino]\n";
    zaino.salvazaino(uscita);
    uscita<<"[EndZaino]\n\n";
    for (map<string,luogo*>::iterator i = luoghi.begin(); i!=luoghi.end(); i++)
        (i->second)->salva(uscita);
    for (map<string,luogo*>::iterator i = luoghi.begin(); i!=luoghi.end(); i++)
        (i->second)->salvap(uscita);
    uscita<<"\n[Utente]\nINIZIO="<<utente->name()<<"\n[EndUtente]\n";
    uscita<<"\n[FineGioco]";
    for (list<string>::iterator i = dati.begin(); i!=dati.end(); i++)
        uscita<<'\n'<<"OBJ="<<*i;
    if (fine!=NULL) uscita<<"\nFINELUOGO="<<fine->name()<<'\n';
    uscita<<"[MsgFineGioco]\n"<<finegioco<<"[EndMsgFineGioco]\n[EndFineGioco]\n";
    uscita.close();
    cout<<"\n - Gioco salvato correttamente...\n";
    return 0;
};

// *** End della classe Ambiente (stampa messaggio di fine gioco) ***
void ambiente::end(){
     unsigned int trovato = 0;
     if (utente==fine){
        for (list<string>::iterator i = dati.begin(); i!=dati.end(); i++)
            utente->ricerca(*i,trovato);
        if (trovato==dati.size()){cout<<"\n - "<<finegioco; finegioco="";}
     }
}

// *** Carica della classe Ambiente ***
bool ambiente::carica(){
     fstream ingresso;
     string domanda;
     cout<<"\n - Vuoi caricare il gioco salvato se ne esiste uno";
     cout<<"\n   oppure vuoi caricare il gioco di default? si = salvato no = default.\n";
     cout<<"\nSono in attesa di una risposta => ";
     getline(cin,domanda);
      cout<<'\n';
     if (domanda=="si") ingresso.open("world.ini", ios::in);
     else ingresso.open("mondo.ini", ios::in);
     if (ingresso.bad()){
        if (domanda=="si"){
           cout<<"\n ! ERRORE in apertura file: 'world.ini' non trovato:\n";
           cout<<"\n          probabilmente non esiste alcun gioco salvato!\n";
        }
        else{ cout<<"\n ! ERRORE in apertura file: 'mondo.ini' non trovato\n";
        cout<<"\n Sar"<<a<<" impossibile continuare nell'esecuzione del programma.\n";
        system("pause");
        exit(1);
     }
     string linea;
     while (!ingresso.eof()){
           getline(ingresso,linea);
           while(linea.begin()==linea.end() && !ingresso.eof()) getline(ingresso,linea);
           if (linea=="[Titolo]"){
              getline(ingresso,linea);
              while(linea!="[EndTitolo]" && !ingresso.eof()){
                   titolo+=linea+'\n';
                   getline(ingresso,linea);
              }
           }
           else if (linea=="[Zaino]"){
              getline(ingresso,linea);
              while(linea!="[EndZaino]" && !ingresso.eof()){
                  if (linea=="[Oggetto]"){oggetto* obj; ingresso>>obj; zaino+=*(obj);}
                  if (linea=="[OggContenitore]"){oggcont* obj; ingresso>>obj; zaino+=*(obj);}
                  if (linea=="[OggOstruzione]"){oggostr* obj; ingresso>>obj; zaino+=*(obj);}
                  if (linea=="[OggNascondiglio]"){oggnasc* obj; ingresso>>obj; zaino+=*(obj);}
                  getline(ingresso,linea);
              }
           }
           else if (linea=="[Luogo]"){
              luogo* lg;
              ingresso>>lg;
              string desc = lg->name();
              pair<string,luogo*> a(desc,lg);
              luoghi.insert(a);
           }
           else if (linea=="[OggInLuogo]"){
                 string right, left; string nomeluogo="";
                 map<string,luogo*>::iterator i;
                 while (linea!="[EndOggInLuogo]"){
                 getline(ingresso,linea);
                 while(linea.begin()==linea.end()) getline(ingresso,linea);
                 bool cerca = research(linea,right,left);
                 if (cerca){
                     if (left=="NOMELUOGO") {nomeluogo=right;}
                     else if (nomeluogo=="") cout<<"\n ! ERRORE: Ci si aspettava il nome del luogo.\n";
                 }
                 i = luoghi.find(nomeluogo);
                 if (i!=luoghi.end()){
                    string nascondiglio, contenitore;
                    if (linea=="[Oggetto]"){oggetto* obj; ingresso>>obj; *(i->second)+=*(obj);}
                    if (linea=="[OggContenitore]"){oggcont* obj; ingresso>>obj; *(i->second)+=*(obj);}
                    if (linea=="[OggOstruzione]"){oggostr* obj; ingresso>>obj; *(i->second)+=*(obj);}
                    if (linea=="[OggNascondiglio]"){oggnasc* obj; ingresso>>obj; *(i->second)+=*(obj);}
                  } else cout<<" ! ERRORE: Oggetto non creato perch"<<e<<" il luogo non "<<e<<" stato trovato.\n";
              }
           } 
           else if (linea =="[PuntatoriALuogo]"){
              string left, right, nomeluogo;
              map<string,luogo*>::iterator i;
              while (linea!="[EndPuntatoriALuogo]" && !ingresso.eof()){
                 getline(ingresso,linea);
                 while(linea.begin()==linea.end() && !ingresso.eof()) getline(ingresso,linea);
                 bool cerca = research(linea,right,left);
                 if (cerca){
                    if (left!="" && right!=""){
                       if (left=="NOMELUOGO"){
                          nomeluogo = right;
                          i = luoghi.find(right);
                          if (i==luoghi.end()){
                                    cout<<" ! ERRORE: Luogo non trovato nella mappa.";
                             cout<<"\n Sar"<<a<<" impossibile continuare nell'esecuzione del programma.\n";
                             system("pause");
                             exit(1);
                          }
                       }
                       else if (left=="NORD" && right!="NULL"){
                           map<string,luogo*>::iterator k = luoghi.find(right);
                           if (k!=luoghi.end()) (i->second)->pnord(*(k->second));
                           else cout<<"\n ! ERRORE: Puntatore Nord del luogo "<<nomeluogo<<" errato.\n";
                       }
                       else if (left=="SUD" && right!="NULL"){
                            map<string,luogo*>::iterator k = luoghi.find(right);
                            if (k!=luoghi.end()) (i->second)->psud(*(k->second));
                            else cout<<"\n ! ERRORE: Puntatore Sud del luogo "<<nomeluogo<<" errato.\n";
                       }
                       else if (left=="EST" && right!="NULL"){
                           map<string,luogo*>::iterator k = luoghi.find(right);
                           if (k!=luoghi.end()) (i->second)->pest(*(k->second));
                                  else cout<<"\n ! ERRORE: Puntatore Est del luogo "<<nomeluogo<<" errato.\n";
                       }
                       else if (left=="OVEST" && right!="NULL"){
                           map<string,luogo*>::iterator k = luoghi.find(right);
                           if (k!=luoghi.end()) (i->second)->povest(*(k->second));
                                  else cout<<"\n ! ERRORE: Puntatore Ovest del luogo "<<nomeluogo<<" errato.\n";
                       }
                       else if (left=="ALTO" && right!="NULL"){
                           map<string,luogo*>::iterator k = luoghi.find(right);
                           if (k!=luoghi.end()) (i->second)->palto(*(k->second));
                           else cout<<"\n ! ERRORE: Puntatore Alto del luogo "<<nomeluogo<<" errato.\n";
                       }
                       else if (left=="BASSO" && right!="NULL"){
                          map<string,luogo*>::iterator k = luoghi.find(right);
                          if (k!=luoghi.end()) (i->second)->pbasso(*(k->second));
                          else cout<<"\n ! ERRORE: Puntatore Basso del luogo "<<nomeluogo<<" errato.\n";
                       }
                       else if (left=="OStrUZIONENORD") (i->second)->Onord(right);
                       else if (left=="OStrUZIONESUD") (i->second)->Osud(right);
                       else if (left=="OStrUZIONEEST") (i->second)->Oest(right);
                       else if (left=="OStrUZIONEOVEST") (i->second)->Oovest(right);
                       else if (left=="OStrUZIONEALTO") (i->second)->Oalto(right);
                       else if (left=="OStrUZIONEBASSO") (i->second)->Obasso(right);
                       else if (right!="NULL") cout<<"\n ! ERRORE: linea "<<left<<" non riconosciuta.\n";
                    }
                 }
              }
           }
           else if (linea =="[FineGioco]"){
              getline(ingresso,linea);
              while (linea!="[EndFineGioco]" && !ingresso.eof()){
                 string right, left;
                 bool cerca = research(linea,right,left);
                 if (cerca){
                    if (left=="OBJ") dati.push_back(right);
                    if (left=="FINELUOGO"){
                        map<string,luogo*>::iterator i = luoghi.find(right);
                              if  (i!=luoghi.end()) fine=(i->second);
                        else{
                           cout<<"\n ! ERRORE GRAVE: Non "<<e<<" stato trovato il luogo di fine del gioco.\n";
                           cout<<"\n Sar"<<a<<" impossibile continuare nell'esecuzione del programma.\n";
                           system("pause");
                           exit(1);
                       }
                    }
                 }
                 else if (linea=="[MsgFineGioco]"){
                    getline(ingresso,linea);
                    while(linea!="[EndMsgFineGioco]" && !ingresso.eof()){
                         finegioco+=linea+'\n';
                         getline(ingresso,linea);
                    }
                 }
                 getline(ingresso,linea);
              }
           }
           else if (linea =="[Utente]"){
              getline(ingresso,linea);
              while (linea!="[EndUtente]" && !ingresso.eof()){
                 string right, left;
                 bool cerca = research(linea,right,left);
                 if (cerca && left=="INIZIO"){
                    map<string,luogo*>::iterator i = luoghi.find(right);
                    if (i!=luoghi.end()) utente=(i->second);
                    else{
                       coutt<<"\n ! ERRORE GRAVE: Non "<<e<<" stato trovato il luogo di partenza.\n";
                       cout<<"\n Sar"<<a<<" impossibile continuare nell'esecuzione del programma.\n";
                       system("pause");
                       exit(1);
                    }
                 }
                 getline(ingresso,linea);
              }
           }
           if (ingresso.bad()){
              cout<<"\n - ! Si "<<e<<" verificato un errore non gestito.\n";
              system("pause");
              exit(1);
           }
     }
     ingresso.close();
     return true;