Bu yazıda bir dönem oldukça popüler olan bir sayı bulma oyununun C++ ile kodlanması anlatılmaktadır. Oyunda temel olarak bilgisayar 4 haneli bir sayı tutmakta ve kullanıcı bu sayıyı tahminlerle bulmaya çalışmaktadır. Genel olarak algoritma aşağıdaki gibi açıklanabilir:
- Bilgisayar rasgele 4 haneli bir sayı tutar (Sayının rakamları birbirinden farklı olmalı ve ilk basamağı 0 olmamalıdır.)
- Kullanıcı 4 haneli bir tahmin söyler. (Tahminin rakamları birbirinden farklı olmalı ve ilk basamağı 0 olmamalıdır. )
- Bilgisayar tuttuğu sayı ile kullanıcının tahminini karşılaştırır. İki sayıdaki aynı rakamlar işleme alınır. Basamağı ve değeri aynı olan her rakam için ekrana bir adet “+”, basamağı farklı ancak değeri aynı olan her rakam için ekrana bir adet “-” yazdırılır.
Örneğin bilgisayarın tuttuğu sayı 5670 olsun.
Oyuncunun ilk tahmini 5916 olsun. Burada oyuncu 5 rakamını basamak yeri ile beraber doğru bildiği için ekrana “+” yazılır. Ayrıca oyuncu 6 rakamını da bilmiştir ancak basamak yeri doğru değildir. Bu durumda da ekrana bir adet “-” yazdırılır. Yani 5916 tahmini sonucunda ” + – ” sonucu alınır.
Oyuncunun ikinci tahmini 5607 olsun. Burada oyuncu 5 ve 6 rakamlarını basamak yeri ile beraber bilmiştir. 0 ve 7 rakamlarını da bulmuştur ancak basamak yeri doğru değildir. Bu durumda ekrana “+ + – -” yazdırılacaktır.
Sonuç olarak oyuncu, tahminlerine karşılık bilgisayardan aldığı “+” ve “-” cevaplarına göre bilgisayarın tuttuğu sayıyı belirli bulmaya çalışacaktır. Oyuncunun tahmin hakkı sınırlıdır.
- Eğer kullandığınız derleyici srand() fonksiyonu ile ilgili hata verirse #include<stdlib> ve #include<ctime> satırlarını silerek bu kütüphaneleri devre dışı bırakınız.
#include<iostream> #include<cstdlib> #include<ctime> / using namespace std; // Bilgisayarın 4 haneli sayı tutmasını sağlayan fonksiyon void SayiTut(int *ptr) // 4 haneli rasgele sayi üret { srand (time(NULL)); for (int i=0; i<4; i++) { // Dizinin sıradaki rakamını rasgele tut ve belleğe yaz *(ptr+i) = rand() % 9; // Eğer 1. rakam 0 seçilmişse, farklı bir rakam seçilene kadar tekrar dene while((i == 0) && (*ptr == 0)) { *ptr = rand() % 9; } // Eğer seçilen rakam, bundan önceki rakamlardan biriyle aynı ise farklı bir rakam seçilene kadar tekrar dene for (int j = i; j>=0; j--) { while ((i!=j) && (*(ptr+i) == *(ptr+j))) { *(ptr+i) = rand() % 8 + 1; } } } } // Kullanıcının tahmin girmesini sağlayan fonksiyon int TahminAl(int *TahminPtr, int *no, int *SayiPtr) { bool hata = false; char *key; // Kullanıcının tahmin yazacağı dinamik diziyi oluştur key = new char[4]; cout<<endl<<*no<<". tahmininizi giriniz: "; cin>>key; for (int i=0; i<4; i++) { *(TahminPtr+i) = key[i]-48; } delete [] key; // Dinamik diziyi sil // Alınan tahminin kurallara uygun olup olmadığını kontrol et // Tahminin ilk rakamı 0 olamaz if (*TahminPtr == 0) { cout<<"Tahminin ilk rakamı sıfır olamaz."<<endl; hata = true; } for (int i=0; i<4; i++) { // Tahminde eksik tuşlama yapılamaz if ((!hata) && ((*(TahminPtr+i) == -48))) { cout<<"Girdiğiniz sayı 4 haneli olmalıdır."<< endl; hata = true; } // Tahminde rakam dışında bir tuşlama yapılamaz if ((!hata) && ((*(TahminPtr+i) <0) || (*(TahminPtr+i) >9))) { cout<<"Yalnızca rakam tuşlayınız."<< endl; hata = true; } for (int j=i; j>=0; j--) { if ((!hata) && (i!=j) && (*(TahminPtr+i) == *(TahminPtr+j))) { // Tahminde aynı rakam 2 defa kullanılamaz cout<<"Aynı rakam birden fazla girilemez."<< endl; hata = true; } } } // Eğer tahminde hata yoksa + ve - leri hesaplayıp ekrana yazdır if(!hata) { for (int i=0; i<4; i++) // Önce + olan sayıları bul { for (int j=0; j<4; j++) { if ((i==j) && (*(SayiPtr+i) == *(TahminPtr+j))) cout<<"+ "; } } for (int i=0; i<4; i++) // Sonra - olan sayıları bul { for (int j=0; j<4; j++) { if ((i!=j) && (*(SayiPtr+i) == *(TahminPtr+j))) cout<<"- "; } } return 1; // Hata yoksa 1 döndür } else return 0; // Hata varsa 0 döndür } int main() { int *Sayi; Sayi = new int[4]; // Bilgisayarın tuttuğu sayıyı dinamik dizi ile oluştur int TahminNo = 1; // Oyuncu kaçıncı tahminini yapıyor? int TahminHak = 10; // Oyuncunun toplam tahmin hakkı SayiTut(Sayi); cout<<"Sayi tutuldu. Kullanılan bellek adresi aralığı: "<<Sayi<<" - "<<Sayi+4<<endl; while (1==1) { // Tahmin her alındığında yeni bir dinamik dizi oluştur, karşılaştırma yaptıktan sonra sil int *Tahmin; Tahmin = new int[4]; TahminNo = TahminNo + TahminAl(Tahmin, &TahminNo, Sayi); // Oyuncu sayıyı buldu if ((Tahmin[0]==Sayi[0]) && (Tahmin[1]==Sayi[1]) && (Tahmin[2]==Sayi[2]) && (Tahmin[3]==Sayi[3])) { cout<<"Tebrikler. Bilgisayarın tuttuğu sayıyı "<<TahminNo-1<<" tahminde buldunuz: "<<Sayi[0]<<Sayi[1]<<Sayi[2]<<Sayi[3]<<endl; break; } // Oyuncu verilen tahmin haklarını kullanarak sayıyı bulamadı, oyunu kaybetti if (TahminNo > TahminHak) { cout<<"Bilemediniz. Bilgisayarın tuttuğu sayı: "<<Sayi[0]<<Sayi[1]<<Sayi[2]<<Sayi[3]<<endl; break; } delete [] Tahmin; } delete [] Sayi; return 0; }
Kod çalıştırıldığında örnek bir oyun ekranı aşağıdaki gibidir:
Oyuncu tahminlerini yaptı ancak sayıyı bulamadıysa aşağıdaki gibi bir ekran ile karşılaşacaktır:
Oyuncu tahmin yaparken kural dışı tahmin yaparsa, yani; rakam dışında bir karakter tuşlarsa, ilk rakamı 0 olan bir sayı tuşlarsa veya iki veya daha fazla rakamı aynı olan bir sayı tuşlarsa, bu durum oyuncuya bir hata mesajı ile bildirilmektedir.