2 Şub 2016

C#'ta At Yarışı Oyunu Nasıl Yapılır?


Uygulamamın form tasarımı için bir tane çim resmi, 2 tane at resmi ve 1 tane de finish çizgisi resmi buldum. Çim resmini Form'un BackGround Image'i olarak ayarladım. At ve Finish resimlerini ise pictureBox'ların içine attım ve bu pictureBox'ların isimlerini sırasıyla at1, at2 ve finish yaptım.
Program çalışınca kullanıcıdan önce 0 TL bulunan kasaya para yatırmasını bekliyor. Kullanıcı para yatırdıktan sonra. Listede göreceği oranlara göre atlardan birine oynamayı tercih ediyor ve oynamak istediği miktarı TextBox'a girip Oyna butonuna basıyor. Ardından yarış başlıyor ve finish çizgisine ilk ulaşacak olan at kazanıyor. Atların hızı random olarak belirlenen değerlere göre artış ya da azalış göstermektedir. Bu arada yarışın süresi Form'un üst kısmında sürekli artmaktadır. Oyunun kodları ve ekran görüntüsü aşağıda bulunmaktadır. İsteyenler buradan bilgisayarına da indirebilir. (Resimlerden dolayı dosya boyutu biraz yüksektir.)
Ekran Görüntüleri
Kodlar
 #region global değişkenler
        int at1kor, at2kor;
        int zaman = 0;
        int para = 0;
        int kazanilanPara = 0;
        int secilenOran;
        string atIsmi;
        int oynanacakPara = 0;
        DialogResult sonuc;
        #endregion
        private void Form1_Load(object sender, EventArgs e)
        {
            at1kor = at1.Left;
            at2kor = at2.Left;
            zaman = 0;
            lblZaman.Text = zaman.ToString();
            lblSunum.Text = "Başla";
            OranBelirle();
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            //Atların rastgele değerlerle ilerlemelerini sağlamak için Random Class'ını kullanarak rastgele sayı üreteceğim.
            Random rnd = new Random();
            int deger1 = rnd.Next(1, 30);
            int deger2 = rnd.Next(1, 30);
            //2 tane random sayı üretildi, deger1 ve deger2 degişkenlerine atandı
            at1.Left += deger1;
            at2.Left += deger2;
            //Hangi atin onde oldugu Right degerleri kullanilarak kontrol edilmelidir
            if (at1.Right > at2.Right) //at1 onde ise
            {
                lblSunum.Text = "1. at Onde Gidiyor";
            }
            else if (at2.Right > at1.Right)  //at2 onde ise
            {
                lblSunum.Text = "2. at Onde Gidiyor";
            }
            if (at1.Right >= finish.Left) //at1 finish cizgisine ulastiysa
            {
                timer1.Stop();
                timer2.Stop();
                lblSunum.Text = "Yarış bitti.";
                YarisBitti("at1");
            }
            else if (at2.Right >= finish.Left) //at2 finish cizgisine ulastiysa
            {
                timer1.Stop();
                timer2.Stop();
                lblSunum.Text = "Yarış bitti.";
                YarisBitti("at2");
            }
        } //bu timer atların random hareketlerini belirler ve yarışın bitip bitmediğini kontrol eder
        private void timer2_Tick(object sender, EventArgs e) //bu timer bizim için zamanı ayarlamaktadır
        {
            zaman++;
            lblZaman.Text = zaman.ToString();
        }
        private void btnYatir_Click(object sender, EventArgs e)
        {
            try
            {
                para += Convert.ToInt32(txtYatir.Text);
                lblKasa.Text = para.ToString("C");
                Temizle();
            }
            catch //Eğer textBox'a sayı girilmemişse hata almamak için try-catch yapısını kullandık.
            {
                MessageBox.Show("Para Giriniz!!");
            }
        }
        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            //listview dan seçilen satırdaki at adı ve oran alınarak değişkenlere atanır
            foreach (ListViewItem item in listView1.SelectedItems)
            {
                atIsmi = item.Text;
                secilenOran = Convert.ToInt32(item.SubItems[1].Text);
            }
        }
        private void btnOyna_Click(object sender, EventArgs e)
        {
            try
            {
                if(para > 0)
                {
                    oynanacakPara = Convert.ToInt32(txtYatir.Text);
                    if(oynanacakPara > para)
                    {
                        MessageBox.Show("Kasada bu kadar paranız bulunmamaktadır. En fazla " + para.ToString("C") + " kadar oynayabilirsiniz.");
                    }
                    else
                    {
                        para -= oynanacakPara;
                        lblKasa.Text = para.ToString("C");
                        lblAtAdi.Text = atIsmi;
                        lblMiktar.Text = oynanacakPara.ToString();
                        txtYatir.Enabled = false;
                        btnYatir.Enabled = false;
                        btnOyna.Enabled = false;
                        listView1.Enabled = false;
                        timer1.Start();
                        timer2.Start();
                    }
                }
                else
                {
                    MessageBox.Show("Kasada paranız bulunmamaktadır!");
                    Temizle();
                }
            }
            catch
            {
                MessageBox.Show("Miktar Giriniz!");
            }
        }
        #region Metotlar
        void YarisBitti(string atAdi)//Yarış bittiğinde olacaklar bu metoda yazıldı
        {
            if (atAdi == atIsmi)
            {
                kazanilanPara = secilenOran * oynanacakPara;
                para += kazanilanPara;
                lblKasa.Text = para.ToString("C");
                MessageBox.Show("Tebrikler, yarışı " + atAdi + " kazandı. Yarış " + zaman + " saniye sürdü. " + kazanilanPara.ToString("C") + " kadar para kazandınız.");
            }
            else
            {
                sonuc = MessageBox.Show("Kaybettiniz.");
            }            
        }   
        void OranBelirle() //rastgele oran belirleyip listView'i dolduran metot
        {
            listView1.Items.Clear();
            Random rnd = new Random();
            double oran1 = rnd.Next(1, 5);
            double oran2 = rnd.Next(1, 5);
            ListViewItem lvi1 = new ListViewItem();
            lvi1.Text = "at1";
            lvi1.SubItems.Add(oran1.ToString());
            listView1.Items.Add(lvi1);
            ListViewItem lvi2 = new ListViewItem();
            lvi2.Text = "at2";
            lvi2.SubItems.Add(oran2.ToString());
            listView1.Items.Add(lvi2);
        }
        void Temizle()  //Tüm textBox'ların içini temizleyen metot
        {
            foreach (var item in this.Controls)
            {
                if (item is TextBox)
                {
                    TextBox tb = item as TextBox;
                    tb.Clear();
                }
            }
        }
        #endregion

1 yorum: