// Ohj 2e Harjoitustyö: Hervannan hakkerit // 5/2008 // 205441 Petteri Aimonen (aimonen) #include "hakkeripeli.hh" #include #include #include 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(); } // FIXME: Vaihepalautus 1 cout << "asetustiedosto: " << nimi_a << endl; cout << "hakkeriryhmätiedosto 1: " << nimi_1 << endl; cout << "hakkeriryhmätiedosto 2: " << nimi_2 << endl; // FIXME // 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; } // FIXME: Vaihepalautus 1 tulostaYleisasetukset(pelitilanne.asetukset); tulostaHakkerit(pelitilanne.ryhmat); // FIXME 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; } return EXIT_SUCCESS; }