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 = ≪
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;
|