Luogo //______________________________________________________________________________ // Classe Luogo (Contenitore di oggetti) #include "dichiarazioni.h" int luogo::luogocod = 0; // *** Costruttore della classe Luogo *** luogo::luogo(string n, string sopran, string d, bool i, bool st, string sugg){ nome=n; sopranome=sopran; descrizione=d; stato=st; idluogo=luogocod++; illuminazione=i; est=NULL; ostr_est=""; sud=NULL; ostr_sud=""; nord=NULL; ostr_nord=""; alto=NULL; ostr_alto=""; basso=NULL; ostr_basso=""; ovest=NULL; ostr_ovest=""; suggest=sugg; } // *** Ridefinizione dell'operatore += della classe Luogo *** luogo& luogo::operator+=(oggetto &ogg){ string desc = ogg.nome(); pair<string,oggetto*> a(desc,&ogg); oggetti.insert(a); return *this; } // *** Distruttore della classe Luogo *** luogo::~luogo(){ for(map<string,oggetto*>::iterator i=oggetti.begin(); i!=oggetti.end(); i++) delete(i->second); } // *** Salva della classe Luogo *** int luogo::salva(fstream& uscita){ uscita<<"[Luogo]\nNOMELUOGO="<<nome<<"\nSOPRANOME="<<sopranome; uscita<<"\nILLUMINAZIONE="; if(illuminazione) uscita<<"trUE"; else uscita<<"FALSE"; uscita<<"\nSTATO="; if(stato) uscita<<"trUE"; else uscita<<"FALSE"; uscita<<"\n[Descrizione]\n"<<descrizione<<"[EndDescrizione]"; uscita<<"\n[Suggerimento]\n"<<suggest; uscita<<"[EndSuggerimento]\n[EndLuogo]\n"; uscita<<"\n[OggInLuogo]\nNOMELUOGO="<<nome<<'\n'; for (map<string,oggetto*>::iterator i=oggetti.begin(); i!=oggetti.end(); i++) (i->second)->salva(uscita); uscita<<"[EndOggInLuogo]\n\n"; return 0; } // *** Salvapuntatori della classe Luogo *** int luogo::salvap(fstream& uscita){ uscita<<"\n[PuntatoriALuogo]\n"; uscita<<"NOMELUOGO="<<nome<<"\nNORD="; if (nord!=NULL) uscita<<nord->name(); else uscita<<"NULL"; uscita<<"\nSUD="; if (sud!=NULL) uscita<<sud->name(); else uscita<<"NULL"; uscita<<"\nEST="; if (est!=NULL) uscita<<est->name(); else uscita<<"NULL"; uscita<<"\nOVEST="; if (ovest!=NULL) uscita<<ovest->name(); else uscita<<"NULL"; uscita<<"\nALTO="; if (alto!=NULL) uscita<<alto->name(); else uscita<<"NULL"; uscita<<"\nBASSO="; if (basso!=NULL) uscita<<basso->name(); else uscita<<"NULL"; uscita<<"\nOStrUZIONENORD="<<ostr_nord; uscita<<"\nOStrUZIONESUD="<<ostr_sud; uscita<<"\nOStrUZIONEEST="<<ostr_est; uscita<<"\nOStrUZIONEOVEST="<<ostr_ovest; uscita<<"\nOStrUZIONEALTO="<<ostr_alto; uscita<<"\nOStrUZIONEBASSO="<<ostr_basso; uscita<<"\n[EndPuntatoriALuogo]\n"; return 0; } // *** Lascia della classe Luogo *** luogo* luogo::lascia(luogo* &utente, string& ogg, oggcont& zaino){ string tipo = "zaino"; oggetto * p = zaino.estrai(ogg,tipo); if (p!=NULL){ *utente+=(*p); cout<<"\n - Hai lasciato "<<ogg<<" nel luogo\n"; } return utente; } // *** Prendi della classe Luogo *** luogo& luogo::prendi(string& ogg, oggcont& zaino){ if(oggetti.begin()==oggetti.end()) cout<<"\n ! ERRORE: Non vi sono oggetti in questo luogo\n"; else{ bool trovato = false; for(map<string,oggetto*>::iterator i=oggetti.begin(); i!=oggetti.end(); i++) if (i->first==ogg){ trovato = true; string domanda; cout<<"\n - Vuoi prendere l'oggetto "<<ogg<<" presente nel luogo si/no\n"; cout<<"\nRisposta => "; getline(cin,domanda); if (domanda=="si"){ if ((i->second)->prendi()){ if ((i->second)->lux()){ cout<<"\n - Hai spento l'oggetto "<<i->first<<".\n"; (i->second)->spegni(); } zaino+=(*(i->second)); cout<<"\n - Hai messo l'oggetto "<<ogg<<" nello zaino.\n"; if ((i->second)->sugg()){cout<<'\n'<<(i->second)->prntsugg()<<'\n'; (i->second)->deletesugg();} oggetti.erase(i); return *this; }else cout<<"\n - Questo oggetto "<<ogg<<" non pu"<<o<<" essere preso: troppo pesante da trasportare.\n"; } if ((i->second)->contenitore()){ string tipo = i->first; oggetto* obj = (i->second)->estrai(ogg,tipo); if (obj!=NULL){ zaino+=*obj; return *this; } } } else if ((i->second)->contenitore()){ string tipo = i->first; oggetto* obj = (i->second)->estrai(ogg,tipo); if (obj!=NULL){ zaino+=*obj; return *this; } } if(!trovato) cout<<"\n - Oggetto "<<ogg<<" non trovato.\n"; } return *this; } // *** Apri della classe Luogo *** luogo* luogo::apri(luogo* &utente, oggcont& zaino, string& ogg1, string& ogg2){ if (oggetti.begin()!=oggetti.end()){ map<string,oggetto*>::iterator i = oggetti.find(ogg1); if (i!=oggetti.end()){ if (ogg2!="") if (zaino.search(ogg2)) (i->second)->apri(utente, ogg2); else cout<<"\n ! ERRORE: L'oggetto "<<ogg2<<" non "<<e<<" presente nello zaino.\n"; else (i->second)->apri(utente, ogg2); } else cout<<"\n ! ERRORE: L'oggetto "<<ogg1<<" non "<<e<<" presente nel luogo\n"; } else cout<<"\n ! ERRORE: Non ci sono oggetti in questo luogo.\n"; return utente; } // *** Accendi della classe Luogo *** void luogo::accendi(oggcont& zaino, string& ogg1, string& ogg2){ if (oggetti.begin()!=oggetti.end()){ map<string,oggetto*>::iterator i = oggetti.find(ogg1); if (i!=oggetti.end()){ if (ogg2=="") (i->second)->accendi(ogg2); else{ if (zaino.search(ogg2)) (i->second)->accendi(ogg2); else cout<<"\n ! ERRORE: L'oggetto "<<ogg2<<" non "<<e<<" presente nello zaino.\n"; } } else if (zaino.search(ogg1)) cout<<"\n - Forse "<<e<<" opportuno che lasci l'oggetto "<<ogg1<<" nel luogo prima!\n"; else cout<<"\n ! ERRORE: L'oggetto "<<ogg1<<" non "<<e<<" n"<<e<<" nel luogo n"<<e<<" nel tuo zaino!\n"; } else cout<<"\n ! ERRORE: Non ci sono oggetti in questo luogo.\n"; } // *** Usa della classe Luogo *** luogo* luogo::usa(luogo* &utente, oggcont& zaino, string& ogg1, string& ogg2){ if (oggetti.begin()!=oggetti.end()){ map<string,oggetto*>::iterator i = oggetti.find(ogg2); if (i!=oggetti.end()){ if (zaino.search(ogg1)) (i->second)->usa(utente,ogg1); else cout<<"\n ! ERRORE: L'oggetto "<<ogg1<<" non "<<e<<" presente nello zaino.\n"; } else cout<<"\n ! ERRORE: L'oggetto "<<ogg2<<" non "<<e<<" presente nel luogo\n"; } else cout<<"\n ! ERRORE: Non ci sono oggetti in questo luogo.\n"; return utente; } // *** Ricerca della classe Luogo *** void luogo::ricerca(string nomeobj, unsigned int &trovato){ for (map<string,oggetto*>::iterator i=oggetti.begin(); i!=oggetti.end(); i++) if (nomeobj==(i->second)->nome()) trovato++; } // *** Sposta della classe Luogo *** luogo* luogo::sposta(luogo* &utente, string& ogg1, string& ogg2){ if (oggetti.begin()!=oggetti.end()){ map<string,oggetto*>::iterator i = oggetti.find(ogg1); if (i!=oggetti.end()) (i->second)->sposta(utente, ogg2); else cout<<"\n ! ERRORE: L'oggetto "<<ogg1<<" che si vuole spostare non "<<e<<" presente nel luogo\n"; } else cout<<"\n ! ERRORE: Non ci sono oggetti in questo luogo.\n"; return utente; } // *** Guarda della classe Luogo (anche guarda oggetto) *** void luogo::guarda(string ogg){ bool lucis = false; if ((!illuminazione) && (oggetti.begin()!=oggetti.end())) for (map<string,oggetto*>::iterator k = oggetti.begin(); k!=oggetti.end(); k++) if ((k->second)->lux()) lucis = true; if (ogg==""){ cout<<"\n* "<<sopranome<<"\n"; if(suggest!=""){cout<<'\n'<<suggest; suggest="";} } if (illuminazione || lucis){ if (ogg==""){ if (!stato) stato=true; if (oggetti.begin()!=oggetti.end()){ cout<<"\n Questa "<<e<<" la lista degli oggetti presenti in questo luogo.\n"; for (map<string,oggetto*>::iterator i = oggetti.begin(); i!=oggetti.end(); i++) cout<<" - "<<(i->second)->nome()<<'\n'; }else cout<<"\n - Non ci sono oggetti in questo luogo."; cout<<"\n"<<descrizione; } else{ map<string,oggetto*>::iterator i = oggetti.find(ogg); if (i!=oggetti.end()) (i->second)->guarda(); else cout<<"\n ! ERRORE: L'oggetto "<<ogg<<" non "<<e<<" presente nel luogo.\n"; } }else cout<<"\n - Spiacente: il luogo non "<<e<<" illuminato.\n"; } // *** Vai della classe Luogo *** luogo* luogo::vai(luogo* &utente, string& s){ if (s == "nord"){ if (nord == NULL) cout<<"\n - Verso Nord non vi "<<e<<" alcun luogo\n"; else if (ostr_nord!="") cout<<"\n - "<<ostr_nord<<'\n'; else{ utente = nord; if (!utente->stato) utente->guarda(""); else utente->prnt_des(); } } else if (s == "sud"){ if (sud == NULL) cout<<"\n - Verso Sud non vi "<<e<<" alcun luogo\n"; else if (ostr_sud!="") cout<<"\n - "<<ostr_sud<<'\n'; else{ utente = sud; if (!utente->stato) utente->guarda(""); else utente->prnt_des(); } } else if (s == "est"){ if (est == NULL) cout<<"\n - Verso Est non vi "<<e<<" alcun luogo\n"; else if (ostr_est!="") cout<<"\n - "<<ostr_est<<'\n'; else{ utente = est; if (!utente->stato) utente->guarda(""); else utente->prnt_des(); } } else if (s=="ovest"){ if (ovest==NULL) cout<<"\n - Verso Ovest non vi "<<e<<" alcun luogo\n"; else if (ostr_ovest!="") cout<<"\n - "<<ostr_ovest<<'\n'; else{ utente = ovest; if (!utente->stato) utente->guarda(""); else utente->prnt_des(); } } else if (s=="basso"){ if (basso==NULL) cout<<"\n - Verso gi"<<u<<" non vi "<<e<<" alcun luogo.\n"; else if (ostr_basso!="") cout<<"\n - "<<ostr_basso<<'\n'; else{ utente = basso; if (!utente->stato) utente->guarda(""); else utente->prnt_des(); } } else if (s=="alto"){ if (alto==NULL) cout<<"\n - Verso su non vi "<<e<<" alcun luogo.\n"; else if (ostr_alto!="") cout<<"\n - "<<ostr_alto<<'\n'; else{ utente = alto; if (!utente->stato) utente->guarda(""); else utente->prnt_des(); } } else cout<<"\n ! ERRORE: Direzione non riconosciuta\n"; return utente; } // *** Delostr della classe Luogo *** void luogo::delostr(string& direzione){ if (direzione=="nord") ostr_nord=""; else if (direzione=="sud") ostr_sud=""; else if (direzione=="est") ostr_est=""; else if (direzione=="ovest") ostr_ovest=""; else if (direzione=="alto") ostr_alto=""; else if (direzione=="basso") ostr_basso=""; else cout<<"\n ! ERRORE: direzione (dell'ostruzione) non riconosciuta: "<<direzione<<".\n"; }; // *** Prnt_des della classe Luogo *** void luogo::prnt_des(){ bool lucis = false; if ((!illuminazione) && (oggetti.begin()!=oggetti.end())) for (map<string,oggetto*>::iterator k = oggetti.begin(); k!=oggetti.end(); k++) if ((k->second)->lux()) lucis = true; cout<<"\n* "<<sopranome; if ((!illuminazione) && (!lucis)) cout<<"\n - Questo luogo non "<<e<<" illuminato."; cout<<"\n\n"<<descrizione; } // *** Ridefinizione dell'operatore >> della classe Luogo *** fstream& operator>>(fstream& s, luogo* &a){ string linea, nome, sopranome, suggerimento, descrizione; bool stato = false; bool illuminazione = true; getline(s,linea); while (linea!="[EndLuogo]" && !s.eof()){ string right, left; bool cerca = research(linea,right,left); if (cerca){ if (left!="" && right!=""){ if (left=="NOMELUOGO") nome=right; else if (left=="SOPRANOME") sopranome=right; else if (left=="ILLUMINAZIONE"){maiuscolizza(right); if(right=="FALSE") illuminazione=false;} else if (left=="STATO"){maiuscolizza(right); if(right=="trUE") stato=true;} else cout<<"\n ! ERRORE: comando left "<<left<<" non riconosciuto.\n"; } } else if(linea=="[Descrizione]"){ getline(s,linea); while(linea!="[EndDescrizione]" && !s.eof()){ descrizione+=linea+'\n'; getline(s,linea); } } else if(linea=="[Suggerimento]"){ getline(s,linea); while(linea!="[EndSuggerimento]" && !s.eof()){ suggerimento+=linea+'\n'; getline(s,linea); } } else{ cout<<"\n ! ERRORE: Comando "<<linea<<" non riconosciuto (luogo).\n"; system("pause"); exit(1); } getline(s,linea); } if (nome!="") a = new luogo(nome,sopranome,descrizione,illuminazione,stato,suggerimento); else cout<<" ! ERRORE: Non "<<e<<" stoto trovato il nome del luogo.\n - Il luogo non "<<e<<" stato creato."; return s; } |