26 Ocak 2014 Pazar

Dört İşlem Oyunu...

Yeni bir oyun daha. Dört işlem üzerinde zeka geliştirici bir uygulama. Oyunumuzda rastgele dört işlemden bir tanesi geliyor. Sayılar da rastgele geliyor. Oyunumuzda levellar var. Önce basit işlemler geliyor. Daha sonra iki basamaklı sayılarla yavaş yavaş zorlaşıyor. Oyun için 5 Level tasarladık. Çok basit bir şekilde istenirse bu level sayıları artırılabilir. 

Yine oyunumuzda can hakları var. 3 can ile oyuncu oyuna başlıyor. Her Leveli geçtiğinde bir can alıyor. Aynı zamanda her 100 Puanda bir can alıyor. Her yanlış bilmede 1 can gidiyor. Aynı zamanda süre kısıtlamamız var. Zaman dolmadan cevap vermek gerekiyor. Zaman dolarsa bir can hakkı gidiyor. 

Leveller ilerledikçe sorular zorlaştığı gibi aynı zaman da her soruya verilen puan artırıyor. Bir soruya verilen zaman süresi de artıyor. Çarpım işlemleri daha zor olduğu için iki katı zaman verdik.

Oyuna ara vermek istersek bir tane de durdurma ve tekrar başlatma butonumuz var. Dört işlemin hepsini yaptırıyoruz. Yalnız bölme işlemlerinde virgülden sonraki sayılarla uğraşmamak için tam kısmını cevap olarak aldık. Örneğin 9 /4 için cevap 2 olacaktır... 

Programın çalışmasından bir kaç örnek görüntü verelim... 

































Bölme işleminden bir örnek.

Seviye geçişlerinden bir örnek gösterim.

Açıkcasını itiraf etmek gerekirse özellikle 4. ve 5. levellerdeki işlemler gerçekten zor... Tabii bu oyuna daha kolay veya daha zor olacak şekilde ilaveler yapılabilir.

Şimdi gelelim kod kısmına... İlk olarak kullandığımız global değişkenlere bakalım...
        public int islem; // +-*/ için kullanılacak operatör...
        public int ilk_sayi;
        public int ikinci_sayi;
        public int can = 3;
        public int sure = 15;
        public int gecis = 0; // Bir sonraki levele geçmek için lazım olan değişken...
        public bool cevap = false; // Doğru cevap kontrolü...
        public int skor = 0;
        public int sonuc = 0; // İşlem sonuçlarını saklayacağımız değişkenimiz.

        // Aşagıdaki değişkenler 1. Level değerlerini alıyorlar...
        public int oyunsuresi = 15;
        public int oyunpuani = 7;
        public int seviyeatla=1;
        public int a1 = 5, a2 = 10, b1 = 1, b2 = 10;
        public int canvermepuani = 100;

Değişkenlerin yanlarında gerekli açıklamalar yapılmakta... Arayüz kısmına her hangi bir açıklama getirmedim. Çünkü onu zaten resimlerden çok rahat bir şekilde nasıl tasarlayacağınızı anlamışsınızdır.

Formun girişindeki kodlardan itibaren başlayalım açıklamaları yapmaya...
private void Form2_Load(object sender, EventArgs e)
        {
            timer1.Start(); // Zamanlama için kullandığımız Timer ı başlatıyoruz... 
            label7.Text = "Kalan Süre = " + sure.ToString(); // Süreyi yarışmacıya gösteriyoruz... 
            degergoster();
        }

Formun hemen girişinde zamanlamayı başlatıyoruz. Çünkü oyuncu verilen sürede soruya cevap vermeye bilir. Yukarıda kullandığımız bir tane metod var.  degergoster() metodu aşağıdaki gibidir.
void degergoster()
        {
            textBox1.Clear();
            sure = oyunsuresi;
            label4.Text = "Kalan Can = " + can.ToString();
            label8.Text = "Skorunuz : " + skor.ToString();
            label7.Text = "Kalan Süre  = " + sure.ToString();
            sayiatama();
        }

Şimdi degergoster() metodu her çağrıldığında neler yapılıyor bir bakalım.

  • Öncelikle textbox1 in içeriği temizleniyor.
  • Sure değişkenimize oyunsuresi değişkeninden gelen değer aktarılıyor. oyunsuresi değişkeni levellera göre değişiklik gösteriyor. bu sebeple her dogru veya yanlış cevaptan sonra kendini yenilemesinde fayda var.
  • Label 4,7 ve 8 de oyun ile ilgili genel durum bilgileri veriliyor.
  • En son olarak sayiatama() metoduna gidiliyor. Bu şu demek. Metod içerisinden başka bir metodun içerisine yönlendirme yapılıyor ve program dallanıyor. Peki sayiatama() metodunda ne var. Tahmin edeceğiniz gibi sayılar ve yapılacak olan işlem belirleniyor. Bu metoda bakalım.

void sayiatama()
        {
            char[] aritmetik = {'+', '-','*','/'};//4 İşlem Değişken Tanımı

            Random rnd = new Random();
            //İşlem seçimi yapılıyor...
            islem = rnd.Next(0, 4);
            label2.Text = aritmetik[islem].ToString();
            if (islem == 2) // Çarpma işleminin zorluğundan dolayı süreyi uzun tutuyoruz...
                sure = sure * 2;
         
            // Sayı atamaları yapılıyor...
            ilk_sayi = rnd.Next(a1, a2);//ilk sayı
            label1.Text = ilk_sayi.ToString();
            ikinci_sayi = rnd.Next(b1, b2);//ikinci sayi
            label3.Text = ikinci_sayi.ToString();
        }
Bu metod ile ilgili söylenebilecek çok bir şey yok. Fark ettiğiniz gibi işlem seçimi yapılıyor ve rastgele sayılar atanıyor. Tek farklı durum burada çarpma işlemi seçim olarak gelirse süreyi iki katı vermek oluyor.

Peki ilk bu işlemden sonra ne yapılması gerekiyor. Artık oyun başladı ve sayı atamaları yapıldı demektir. Oyuncunun cevabı yazması ve butona basması artık rahatlıkla beklenebilir. Peki oyuncu doğru cevabı verip butona basarsa ne olacak. Cevapla butonunun içerisine bakalım.
private void button1_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            sonucukontrolet();
        }

İlk bakışta belli oluyor. Çok kısave net. Timer durduruluyor hemen ve sonucukontrolet() adındaki metod çalıştırılıyor. Çünkü girilen sayı ile bilgisayarın sonucu kontrol edilmesi lazım. Bakalım sonucukontrolet() metodunda neler oluyor.
void sonucukontrolet()
        {  // Madde1:
            if (can!=0 && textBox1.Text !="") //can 0'a eşit olmadığı sürece Yapacağı İşlemler
            {
                // Madde2:
                //İslem işarete göre yapılıyor... Sonuc ile Giris kıyaslanıyor...
                int giris = int.Parse(textBox1.Text);
                if (islem == 0)
                    sonuc = (ilk_sayi + ikinci_sayi);
                else if (islem == 1)
                    sonuc = (ilk_sayi - ikinci_sayi);
                else if (islem == 2)
                    sonuc = (ilk_sayi * ikinci_sayi);
                else if (islem == 3)
                    sonuc = (ilk_sayi / ikinci_sayi);
                if (sonuc == giris) cevap = true; //  Cevabın doğru olup olmadığını bu if ile anlıyoruz.

                // Madde3:
                if (cevap == true) // Doğru cevap verildiyse
                {
                    gecis++; // Bir level da toplam 7 soru sorduruyoruz. Bu değişken toplam soru sayısını tutuyor.
                    MessageBox.Show("Doğru Cevap Verdiniz... Sıradaki Sorunuz Geliyor...");
                    timer1.Start();
                    skor = skor + oyunpuani; // Oyuncuya puanı ekleniyor.

                    // Madde4:// Bir sonraki seviyeye geçiş kontrol ediliyor...
                    if (gecis>=7)
                    {
                        timer1.Stop();
                        seviyeatla++;
                        if (seviyeatla >= 6) // Son level ise oyunda toplanan skor oyuncuya gösteriliyor.
                        {
                            MessageBox.Show("Oyun Bitti Tebrikler... Skorunuz:" + skor);
                            Application.Restart(); // Her şey bitirilip tekrar program başlatılıyor.
                        }
                        MessageBox.Show(seviyeatla + ". Seviyeye Geçmeye Hak Kazandınız...\n"+(seviyeatla-1).ToString()+". Seviye Skorunuz : "+skor.ToString());
                        MessageBox.Show("+1 Can Geldiiiii..."); //Her level geçişinde 1 can veriliyor.
                        can++;
                        gecisyap(seviyeatla);
                        gecis = 0;

                    }
                    puankontrolet(); // Bu metod her 100 puanda bir can vermek için skoru kontrol eden bir metoddur.
                    degergoster(); // Son durumlar gösteriliyor aynı zamanda yeni sayılar atanıyor...
                }
                // Madde5:
                else if (cevap==false) // Cevap yanlışsa bu kısım işliyor.
                {
                    gecis++;
                    MessageBox.Show("Yanlış Cevap Verdiniz. 1 Canınız Eksiliyor. Dogru Cevap " + sonuc.ToString() + "olmalıydı");
                    surekontrolvecanazalt();
                    timer1.Start();
                }
                cevap = false;
            }
         
            else if (can==0)//can 0'a eşit olduğunda yapacağı İşlem... Oyun bitiyor...
            {
                MessageBox.Show("Hakkınız Tükenmiştir... Oyun Skorunuz:" + skor);
                Application.Restart();
            }
        }

Sizinde tahmin edeceğiniz gibi programın can alıcı noktası geldi. Burayı biraz irdeleyelim.
Madde1: Şimdi can yoksa ve kutuya değer girilmediyse kesinlikle cevap kontrolü yaptırmıyoruz. bu durumda can==0 if satırı ile oyunu bitiyoruz.
Madde2: İşlemleri yaptırdığımız kısım burası. Önce hangi dört işlem var ise onu belirleyip sayılara işlemleri yaptırıyoruz. Sonrada oyuncunun girdiği ile doğru olup olmadığını kontrol ediyoruz.
Madde3: Cevap doğru ise mesaj verdiriyoruz. Skoru ve soru sayısını artırıyoruz. Aynı zamanda her doğru cevapdan sonra toplam soru sayısı 7 yi geçti ise bir sonraki levela geçiş yaptırıyoruz.
Madde4: Geçiş içinözel bir şey demeye gerek yok. Sadece her geçişte  gecisyap(seviyeatla) adındaki metoda gitmemiz gerekiyor. Bu metoda seviye sayısını gönderiyoruz ve o bize yeni değerleri belirleyip oyuna devam ettiriyor. Bir de bu maddenin içeriğinin tamamı cevap yanlış ise de olması lazım. Ama biz eklemedik. Niye eklemedik. Bilmiyorum:)
Madde5: Şimdi burada da kullanılan bir metod var. O da  surekontrolvecanazalt(); metodu. Birazdan buna da bakacağız.

Şimdi yukarıdaki metodlara tek tek bakalım. gecisyap(seviyeatla); metodu:
void gecisyap(int seviye)
        {
            if (seviye ==2)
            {
                oyunsuresi = 20; // Leveldeki sorular için verilen süre...
                oyunpuani = 12; // Leveldeki her doğru cevap için verilen süre...
                a1 = 10; a2 = 99; b1 = 10; b2 = 20; // Sayı aralıkları burada belirleniyor...
                label6.Text = "Level 2";
            }
            else if (seviye == 3)
            {
                oyunsuresi = 25;
                oyunpuani = 18;
                a1 = 50; a2 = 150; b1 = 20; b2 = 50;
                label6.Text = "Level 3";
            }
            else if (seviye == 4)
            {
                oyunsuresi = 30;
                oyunpuani = 24;
                a1 = 50; a2 = 200; b1 = 20; b2 = 100;
                label6.Text = "Level 4";
            }
            else if (seviye == 35)
            {
                oyunsuresi = 30;
                oyunpuani = 30;
                a1 = 100; a2 = 250; b1 = 50; b2 = 100;
                label6.Text = "Level 5";
            }
            timer1.Start(); // Seviye geçişlerinden sonra süreyi tekrar başlatıyoruz...
        }
Bu metodun tek yaptığı iş gelen seviye değerine göre yeni kuralları belirlemek. Yeni level de oyun süresi ne kadar olacak, her doğru soruya kaç puan verilecek. Aynı zamanda sayı aralıkları ne kadar olacak.

Bir diğer metod. puankontrolet(); metodu:
void puankontrolet()
        {
            if (skor>=canvermepuani)
            {
                MessageBox.Show("+1 Can Geldiiiii...");
                can++;
                canvermepuani += 100;
            }
        }
Evet. Her 100 puana bir can veriyoruz. Bunun için skora bakıyoruz. Önce 100 puanı geçince bir can veriyoruz. Bir sonrakinde 200 puanı geçince bir can veriyoruz. Bu şekilde devam ediyor.

Son ve ne önemli metodlarımızdan birisi: surekontrolvecanazalt();
void surekontrolvecanazalt()
        {
            timer1.Stop();  // buraya geldiysek zaman durmalı.
            can = can - 1; // can muhakkak bir azalmalı. Çünkü ya zaman doldu, ya yanlış cevap verildi.
            sure = oyunsuresi; // Süre baştan yazılmalı. 
            skor = skor - 4; // Her hataya 4 puan düşüyoruz.
            degergoster(); // Değerleri yazdırdığımız gibi yeni soruyu da gönderiyoruz...
        }

Bu sayede cevapla butonun içerisinde olanlar yani sonucukontrolet metodunda olanları açıklamış olduk. Dikkatli bir takip ile buraya kadar anlattığımız her şey gayet rahat bir şekilde anlaşılmış olmalı dersek inanmayın. Hakikaten biraz karmaşık. Ama anlaşılmayacak bir durum değil. :)

Peki zaman azalacak, zamana bakılacak diyoruz da timer_tick de kod olarak ne yazılacak. bir de bu kısma bakalım. Burada timerın intervalini 1000 olarak ayarlamayı arayüzde özellikler kısmında unutmayalım.
private void timer1_Tick(object sender, EventArgs e)
        {
            sure--; // Verilen süreyi her seferinde bir azaltıyor...
            label7.Text = "Kalan Süre  = " + sure.ToString();
            if (sure == 0) // Süre sıfır oluncada dananın kuyruğu kopuyor... 
            {
                surekontrolvecanazalt();
                MessageBox.Show("Cevap Verme Süreniz Doldu. \n1 Can Kaybettiniz.");
                timer1.Start();
            }
        }

En son olarak da durdur butonunun kodlarına bakalım. Oyunun istediğimiz yerinde ara verebiliyoruz. Bir de ipucu. Soru çok zor ise durdurun ve yeniden başlayın. Ne de olsa bir kontrol yapmadık. Her durdurmada da soru değiştiğine göre :):)

        int baslatbutonu = 1; // Bu global değişken... Sakın unutmayın...
        private void button2_Click(object sender, EventArgs e)
        {
            baslatbutonu++; // Her butona basıldığında bir artırıyoruz... 
            if (baslatbutonu % 2 == 1)
            {
                button1.Enabled = true;
                timer1.Start();
                button2.Text = "DURDUR";
            }
            else if (baslatbutonu % 2 == 0)
            {
                timer1.Stop();
                button1.Enabled = false;
                button2.Text = "BAŞLAT";
            }

            degergoster();
        }

Buradaki amaç aynı buton üzerinde hem oyunu durdurmak, hem de yeniden başlatabilmek. Bunun için birbirinin tersi işlemini yapan iki if var burada. Eğer durdurmak istiyorsak, timerı durduruyoruz, cevapla butonunu pasif hale getiyoruz, butonun üzerindeki yazıyı Başlat olarak değiştiriyoruz. Başlatmak istiyorsak da bunların tam tersini yapıyoruz. Son olarak baslatbutonu değişkeni tek sayılarda başlatıyor, çift sayılarda durduruyor. Bu son yazdığım cümleyi anladıysanız programı anladınız demektir.

Bu oyuna o kadar çok ekleme yapılabilir ki... Onları da size bırakıyoruz...