// Ohj 2e Harjoitustyö: Hervannan hakkerit // 5/2008 // 205441 Petteri Aimonen (aimonen) #include "hakkeripeli.hh" #include "komentotulkki.hh" #include "poikkeukset.hh" #include "hakkeriai.hh" #include #include #include using std::cin; using std::cerr; using std::cout; using std::endl; const std::string PARAMETRIOHJE( "Ohjelmalle on annettava parametrit -a, -1 ja -2:\n" " -a tiedosto Yleisasetustiedoston nimi.\n" " -1 tiedosto Ensimmäisen hakkeriryhmän asetustiedosto.\n" " -2 tiedosto Toisen hakkeriryhmän asetustiedosto.\n" " -h tai --help Tämän ohjeen näyttäminen.\n"); // Tulkitsee komentoriviparametrit ja toteuttaa ne. // Palauttaa true jos peli alkaa normaalisti. // Palauttaa false, jos parametrina oli --help, eli pelin ei pidä alkaa. // Voi tuottaa poikkeukset Parametrivirhe, Avausvirhe, Lukuvirhe bool tulkitseParametrit(int argc, char *argv[], Pelitilanne &pelitilanne) { std::string nimi_a(""); std::string nimi_1(""); std::string nimi_2(""); // Onko havaittu virheitä? // Tarkistetaan vasta silmukan loputtua, jotta ohjetta pyydettäessä // ei tuoteta virheitä. bool virhe = false; // Käydään parametrit läpi for (int i = 1; i < argc; ++i) { std::string parametri(argv[i]); // Yksittäiset parametrit if (parametri == "-h" || parametri == "--help") { // Ohjetekstin tulostus cout << PARAMETRIOHJE; return false; } if (parametri != "-a" && parametri != "-1" && parametri != "-2") { // Tuntematon parametri, jatketaan silti --help:n etsintää virhe = true; continue; } // Muut parametrit tarvitsevat tiedostonimen if (i + 1 >= argc) { throw Parametrivirhe(); } i += 1; // Seuraavaan parametriin, silmukka jatkuu tiedostonimen // jälkeen. std::string tiedosto(argv[i]); // Tutkitaan vaihtoehdot, tarkistukset ettei parametreja kahdenneta if (parametri == "-a" && nimi_a == "") { nimi_a = tiedosto; } else if (parametri == "-1" && nimi_1 == "") { nimi_1 = tiedosto; } else if (parametri == "-2" && nimi_2 == "") { nimi_2 = tiedosto; } else { // Annettu kahdesti, jatketaan --help:n etsintää virhe = true; } } if (virhe) { // Tuntemattomia parametreja tms. virheitä, eikä --help:iä throw Parametrivirhe(); } if (nimi_a == "" || nimi_1 == "" || nimi_2 == "") { // Jotain nimistä ei ole annettu throw Parametrivirhe(); } // Luetaan asetustiedostot, lukufunktiot tuottavat tarvittaessa // poikkeukset lueYleisasetukset(nimi_a, pelitilanne.asetukset); try { lueHakkeriryhma(nimi_1, pelitilanne); lueHakkeriryhma(nimi_2, pelitilanne); } catch (...) { vapautaHakkerit(pelitilanne.ryhmat); throw; } return true; } int main(int argc, char *argv[]) { cout << "### OHJ-1101 Ohjelmointi Ie" << endl; cout << "### Petteri Aimonen, 205441, aimonen" << endl; Pelitilanne pelitilanne; try { if (!tulkitseParametrit(argc, argv, pelitilanne)) { // Tulostettiin vain ohje, peli ei alkanut return EXIT_SUCCESS; } } catch (Parametrivirhe &virhe) { cerr << "Virhe: Virheelliset komentoriviparametrit." << endl; return EXIT_FAILURE; } catch (Avausvirhe &virhe) { cerr << "Virhe: Asetustiedoston " << virhe.what(); cerr << " avaaminen ei onnistunut." << endl; return EXIT_FAILURE; } catch (Lukuvirhe &virhe) { cerr << "Virhe: Virheellinen asetustiedosto: " << virhe.what(); cerr << "." << endl; return EXIT_FAILURE; } tulostaVuoro(pelitilanne, cout); std::string rivi(""); while (!pelitilanne.lopetettu) { if (pelitilanne.vuoro == 0) { cout << "Mennään tonne" << endl; Siirto siirto(EISIIRTOA); etsiSiirto(siirto, pelitilanne); if (!haeVuoro(pelitilanne)->tarkistaSiirto(siirto, cerr)) { cerr << "AI HUIJAA!!!" << endl; } suoritaSiirto(siirto, pelitilanne, cout); cout << "Tultiin takas" << endl; continue; } cout << haeKehote(pelitilanne); do { if (!std::getline(cin, rivi)) { // Syötevirta loppui, tulostetaan rivinvaihto // jotta komentotulkin kehote menee eri riville. cout << endl; return EXIT_SUCCESS; } // Luetaan kunnes rivi ei ole kommentti } while (rivi.size() != 0 && rivi.at(0) == '#'); toteutaRivi(rivi, pelitilanne, cout, cerr); } // Tarkistetaan päättyikö peli kesken vai voittoon. if (ryhmaMukana(pelitilanne.ryhmat.at(0)) && ryhmaMukana(pelitilanne.ryhmat.at(1))) { // Molemmat mukana, kesken. cout << "Peli päättyi!" << endl; } else if (ryhmaMukana(pelitilanne.ryhmat.at(0))) { // Ensimmäinen voitti. cout << pelitilanne.ryhmat.at(0).nimi << " voitti!" << endl; } else if (ryhmaMukana(pelitilanne.ryhmat.at(1))) { // Jälkimmäinen voitti. cout << pelitilanne.ryhmat.at(1).nimi << " voitti!" << endl; } tulostaTilanne(pelitilanne.ryhmat, cout); return EXIT_SUCCESS; }