Makale Özeti

Bu makalede son günlerin çok popüler oyunu var mısın yok musun oyununu adım adım yapacağız. Bu makalemdeki amaç oyun programlama yapmak için yanlış bir intiba olan çok üst seviyede yazılım bilgisine sahip olmak gerektiği izlemini silmek ve bir oyun programı için gerekli olan üst seviye dizi işlemleri, matematiksel fonksiyonlar, rastlantısal sayılar üzerine işlemler yapılarak bir oyun bir yapılabileceğini göstermektir.

Makale

Var Mısın Yok Musun

Bu makalede son günlerin çok popüler oyunu var mısın yok musun oyununu adım adım yapacağız. Bu makalemdeki amaç oyun programlama yapmak için yanlış bir intiba olan çok üst seviyede yazılım bilgisine sahip olmak gerektiği izlemini silmek ve bir oyun programı için gerekli olan üst seviye dizi işlemleri, matematiksel fonksiyonlar, rastlantısal sayılar üzerine işlemler yapılarak bir oyun bir yapılabileceğini göstermektir.

Var Mısın Yok Musun oyunu tamamen şans üzerine rastlantısal sayılar kullanılarak iskeleti oluşturulmuş bir oyundur. Oyunun amacı maksimum parayı kazanmaktır. Oyunda 24 tane kapalı kutu vardır. Her bir kutunun içerisinde 1 YTL'den başlayan ve 500.000 YTL ye kadar giden paralar mevcuttur. Bu paralar rastlantısal olarak kutuların içerisine yerleştirilmiştir. Oyun başlangıcında oyuncu 24 tane kutu içerisinden bir tanesini seçer kullanıcı bu kutunun içerisindeki parayı almaya hak kazanır. Fakat kullanıcı oyun bitene kadar kutusunda ne kadar para olduğunu bilmeyecektir. Daha sonra oyuncu geri kalan 23 kutudan sırayla seçimlerini yapar. Her bir kutu açıldığında içerisindeki para miktarını kullanıcı kaybetmiş olur. Oyunun belli adımlarında banker tarafından kullanıcıya açılmamış kutularda bulunan paralarının büyüklüğüne göre bir teklif yapılır. Oyuncu bu teklifi kabül eder ya da oyuna devam eder. Oyuncu alabileceği en yüksek parayı almak için karar vermek zorundadır ya bankerin teklif ettiği parayı alır ya da en son kutu yani oyunun ilk başında seçilen kutunun içerisindeki parayı alır. Teklif edilen teklifler kullanıcının sahip olduğu kutunun içerisindeki paradan daha yüksek olabilir. Burada oyuncu doğru kararı alarak oyunu maksimum parayla bitirmek zorundadır.

 

Yukarıda görülen ekranda aslında her bir kutu bir düğmedir her bir buton isimlendirme yapılırken btn1'den başlayıp btn24 e kadar sıralı olarak isimlendirilmiştir. Her bir etiket ise lbl1'den başlayarak lbl500000'e kadar sıralı olarak isimlendirme verilmiştir. Kodlar incelenirse bu tasarım tipi program içerisinde bize çok büyük esneklik sağlayacaktır.

 

Her bir butonun click event'ı ButtonClick fonksiyonunu çağırmaktadır. Her bir buton için ayrı ayrı fonksiyon yapmak yerine tek bir fonksiyon içerisinde event yakalanıp hangi buton üzerinden event geldiği bulunmaktadır.

private void ButtonClick(object sender, EventArgs e)

{

    Button b = new Button();

    b = (Button)sender;

    string secilenad = b.Name.Replace("btn", "");

    int secilensayi = Convert.ToInt32(secilenad);

}

Yine seçilen kutulardaki para miktarlarını gösteren labelların şekilden de anlaşılacağı gibi arka plan renginin kırmızı olması için her bir label için ayrı ayrı kontrol yapılmak yerine Label kontrolü lbl ön eki kullanılarak ve seçilen rakamı ön eke ekleyerek bu label kontrülu bulunup arka plan rengi değiştirilmiştir.

    Label lb_ = (Label)(this.Controls.Find("lbl" + arr[secilensayi - 1], false)[0]);

    lb_.BackColor = Color.Red;

Program sırasında tüm alt yapılar diziler üzerinden yapılmaktadır. Kullanıcının kazanabileceği para miktarları bir dizi üzerinde sıralı olarak tanımlıdır. Fakat her oyunda para miktarları aynı kutularda değişik rastlantısal seçilmiş kutular içerisine konulması gerekmedir. Burada ana problemimiz sıralı olarak verilen bir dizinin rastlantısal olarak dağıtılmasıdır. Bu problem aşağıdaki fonksiyon ile aşılmıştır. Aşağıdaki fonksiyon integer değerler taşıyan bir dizi almaktadır. Bu dizi üzerinde dizi boyutu kadar derinlikte rastlantısal sayılar (Random sınıfı kullanılarak) üretilmektedir. Sıra ile tüm dizi elemanları rastlantısal üretilen sayı indisindeki dizi değeri ile yer değiştirmektedir. Böylece dizimiz karışmış olmaktadır.

private static int[] Suffle(int []arr)
{

      Random
r = new Random();
       for (int i = 0; i < arr.Length; i++)
        {

              int
swap = r.Next(arr.Length);
            if (swap != i)
            {

              int
temp = arr[i];
            arr[i] = arr[swap];
            arr[swap] = temp;
            }
          }

    return
arr;
}

public static int TeklifVer(int[] arr) {
    int sum=0;
    int count=0;
    for (int i = 0; i < arr.Length;i++ )
    {
        if (arr[i] != 0)
        {
            count++;
            sum += arr[i];
        }
    }
    return sum / (count + 1);
}

Oyun sırasında bankerin verdiği teklif ise yine dizisel işlemlerle belirlenmektedir. Bu teklifler 8. 15. 21. ve 22. kutu açılımlarında kullanıcıya teklif edilmektedir. Bu sıraların takibi için global değişkenler yoğun olarak kullanılmıştır. Görüldüğü gibi sadece diziler üzerinde işlemler yaparak ve matematiksel fonksiyonlar kullanarak Varmısın Yokmusun oyununu yapabildik. Oyunun ilerisi için yüksek çıkan değerlerde ve düşün çıkan değerlerde farklı ses dosyalarının çalımı ile kullanıcıya haber verimi, görsel efeklerin kullanılması ve formların dizaynlarında iyileştirmeler yapılabilir. Makale ya da kodlarda bulunan hatalar ya da sorularınız için mehmetaliecer@gmail.com adresinden bana ulaşabilirsiniz. İyi çalışmalar.

Mehmet Ali ECER

www.mehmetaliecer.com

IvirZivir.cs

using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace VarMisinYokMusun
{
    static class IvirZivir
    {
    public static int[] KutuAta()
    {
        int []tempArr ={ 1, 2, 5, 10,50,100,150,200,250,300,400,500,1000,2000,5000,7500,10000,25000,40000,50000,75000,100000,250000,500000 };
        return Suffle(tempArr);
    }
    private static int[] Suffle(int []arr)
    {
        Random r = new Random();
        for (int i = 0; i < arr.Length; i++)
        {
            int swap = r.Next(arr.Length);
            if (swap != i)
            {
                int temp = arr[i];
                arr[i] = arr[swap];
                arr[swap] = temp;
            }
        }
        return arr;
    }
    public static int TeklifVer(int[] arr) {
        int sum=0;
        int count=0;
        for (int i = 0; i < arr.Length;i++ )
        {
        if (arr[i] != 0)
        {
            count++;
            sum += arr[i];
        }
        }
    return sum / (count + 1);
    }
}}

 

 

 

 

Kaynak dosya