#include "duzey.h" #include "gerec.h" #include #include #include #include using namespace std; // Her bir dusunce duzeyinin (seceneginin) nasil // yazdirilacagini belirler ostream & operator<< (ostream & cikis, Duzey const & duzey) { static char const * const goruntuler[] = { "Size sorsun", "Rastgele kagit atsin", "Yeri almayi bilsin", "Valeyle almayi ve degerini bilsin", "Solundakinin almadiklarina dikkat etsin", "Kagit saysin", "Kagit degerine onem versin", "Degerli kagit eslerine onem versin", "Uzman" }; assert(toplamOge(goruntuler) == toplamDuzey); return cikis << goruntuler[duzey]; } // Her dusunce yetenegine karsilik bir karakter // bulunuyor. // // Ornegin bu aciklamanin yazildigi siralarda '1' karakteri, // 'Rastgele kagit atsin' dusunce secegine karsilik // geliyordu. char dusunceSecenegiKarakteri(int duzey) { return static_cast(duzey + dusunceSecenegiBasi); } // Verilen karakter secimine karsilik bir duzey degeri // dondurur Duzey dusunceYap(char secenek) { return Duzey(secenek - dusunceSecenegiBasi); } // Bilgisayarin en iyi oynadigi duruma karsilik gelen // secenekler string uzmanDusunceSecenekleri() { string secenekler; int const haricler[] = { Duzey_insanaSoran, Duzey_rastgeleAtan, Duzey_uzman }; return dusunceSecenekleriOlustur(haricler); } string insanDusunceSecenekleri() { // Uzman secenegine insan secenegini ekliyoruz. Insan // secenegi en sonda olmali. Boylece 'yardim' olanaginin // uzman duzeyinde olmasini saglamis oluyoruz. string secenekler = uzmanDusunceSecenekleri(); secenekler += dusunceSecenegiKarakteri(Duzey_insanaSoran); return secenekler; } // Ornek bir secenek karakter dizisi olusturur string ornekDusunceSecenegi() { string secenekler; secenekler.push_back( dusunceSecenegiKarakteri(Duzey_tutanKagitci)); secenekler.push_back( dusunceSecenegiKarakteri(Duzey_valeci)); secenekler.push_back( dusunceSecenegiKarakteri(Duzey_soldakineDikkatEden)); return secenekler; } bool dusunceSecenekleriniDogrula(string const & secenekler) { for (size_t i = 0; i != secenekler.size(); ++i) { Duzey const duzey = dusunceYap(secenekler[i]); if ((duzey < Duzey_ilk) || (duzey >= Duzey_son)) { cerr << "HATA: " << secenekler[i] << " secenegini tanimiyorum\n"; return false; } } return true; } // Dusunce menusunun ne kadar girintili olacagini belirler char const * const dusunceBilgisiGirintisi = " "; void dusunceBilgiSatiri(char karakter) { Duzey const duzey(dusunceYap(karakter)); cout << dusunceBilgisiGirintisi << karakter << ": " << duzey; // Uzman duzey seceneginin hangi dusunceleri icerdigini // de parantez icinde yaziyoruz if (duzey == Duzey_uzman) { cout << " (" << uzmanDusunceSecenekleri() << ')'; } cout << '\n'; } void tekCizgiCek(ostream & os, size_t uzunluk) { fill_n(ostream_iterator(os), uzunluk, '-'); } void dusunceBilgiBasligi() { char const baslik[] = "Dusunce secenekleri"; cout << dusunceBilgisiGirintisi; tekCizgiCek(cout, sizeof(baslik) - 1); cout << '\n' << dusunceBilgisiGirintisi << baslik << '\n' << dusunceBilgisiGirintisi; tekCizgiCek(cout, sizeof(baslik) - 1); cout << '\n'; } void dusunceSecenekleriniBildir() { dusunceBilgiBasligi(); for (char i = dusunceSecenegiBasi; i != dusunceSecenegiBasi + toplamDuzey; ++i) { dusunceBilgiSatiri(i); } cout << dusunceBilgisiGirintisi << "(Secenekleri birlesik olarak yazabilirsiniz; Ornek: " << ornekDusunceSecenegi() << ")\n\n"; } string dusunceSeceneginiOku(string const & oyuncuAdi, string const & yer) { static bool bilgiVerildi = false; if (!bilgiVerildi) { dusunceSecenekleriniBildir(); bilgiVerildi = true; } ostringstream dizgi; dizgi << yer << ": " << oyuncuAdi << " - Nasil dusunsun"; string secenekler; bool girisDogru = false; while (!girisDogru) { secenekler = giristenOku(dizgi.str()); char const insanSecenegi = dusunceSecenegiKarakteri(Duzey_insanaSoran); char const uzmanSecenegi = dusunceSecenegiKarakteri(Duzey_uzman); girisDogru = dusunceSecenekleriniDogrula(secenekler); if (secenekler.find(insanSecenegi) != string::npos) { secenekler = insanDusunceSecenekleri(); assert(dusunceSecenekleriniDogrula(secenekler)); } else if (secenekler.find(uzmanSecenegi) != string::npos) { secenekler = uzmanDusunceSecenekleri(); assert(dusunceSecenekleriniDogrula(secenekler)); } } return secenekler; }