İlginizi Çekebilir
  1. Ana Sayfa
  2. C Sharp
Trendlerdeki Yazı

C# Mayın Tarlası Yapımı – C# Mayın Tarlası Kodları

C# Mayın Tarlası Yapımı – C# Mayın Tarlası Kodları
+ - 0

C# Mayın Tarlası Yapımı – C# Mayın Tarlası Kodları dersim ile C# eğitim setime devam ediyorum. Bu dersimizde genellikle okullarda proje ödevi olarak verilen C# Mayın Tarlası Oyunu yapımına bakacağız. Tahmin edersiniz, C# eğitim setim için artık yazacak çok fazla konu bulamıyorum. Zaman içinde karşıma çıkan hatalar üzerinden ya da daha önce uğraşmamış olduğum bir konu üzerinde çalışmaya başladığım zaman ilgili konular ekliyorum. Örneğin XML dersleri gibi… Bazen bana gelen sorular üzerine dersler ekliyorum. C# mayın tarları oyunu dersini yazmamda bana gelen isteklerden dolayı oldu.

Bu yazıda c# da mayın tarlası oyunu nasıl yapılır?  sorusuna cevap vermiş olacağım. Giriş kısmını daha fazla uzatmadan gelin nasıl yapılacağına bir bakalım.

C# Mayın Tarlası Yapımı – C# Mayın Tarlası Kodları

C# Mayın Tarlası Yapımı

Giriş kısmında da belirttiğim gibi bu konu genellikle okullarda proje ödevi olarak verildiğini biliyoruz.  Covid-19 pandemi sebebi ile de okullar sınavları da proje ödevi olarak verdiğinden dolayı bana da gelen sorular arasında yerini almış oldu. Bu sebeple bende bu konuda bir çalışma yapayım ve yayınlayayım istedim.

Mayın tarlası oyununun nasıl olduğunu bilirsiniz. Ekrandaki karelerin içerisinde yer alan mayına tıklamadan mayınlı olmayan tüm karelere tıklanması gerekir.

Mayın tarlası oyununu yapmak için formumuza bir TableLayoutPanel, bir groupbox, üç radiobutton iki label ve bir button ekliyoruz. En güzel görüntüyü alabilmek için forma eklediğimiz TableLayoutPanel nesnesinin Height ve Width özelliklerinin 600×600 şeklinde olmasını özen göstermeliyiz.

Form tasarımı aşağıdaki gibidir.

C# Mayın Tarlası Yapımı

Burada TableLayoutPanel içerisine dinamik olarak 100 tane button ekleyeceğiz. Zorluk seviyelerine göre bu 100 button içindeki mayın sayıları değişecek. Kolayda 10 mayın, ortada 25 mayın, zorda ise 40 mayın olacak. Mayınlı butona tıkladığımızda oyun sona erecek. Tıklanan butonda mayın yok ise puan olarak 1 ile mayın sayısı arasında rastgele bir sayı verilecek. Mayınlı butona tıklamadan tüm butonlar açılırsa Kazandınız, bir mayınlı butona tıklanırsa da Kaydettiniz diye uyarı alacağız ve elde edilen puanı göstereceğiz.

Tıklanmayan buttonların arkaplan rengi gri olacak. Arkaplan rengi önemli. Çünkü sadece arkaplan rengi gri olan buttonlara tıklanabiliyor olması gerekiyor.

Tıklanan buttonda mayın yoksa buttonun arkaplan rengini yeşil yapacağız. Bu bizim için tanımlayıcı bir etken olacak. Çünkü eğer tıklanmış ve puan alınmış bir mayına bir daha tıklanmasını istemiyoruz.

Tıklanan buttonda mayın varsa buttonun arkaplan rengini kırmızı yapacağız. Ancak biz mayınlı buttonlarda mayın resmi göstereceğiz. bu sebeple kırmızı arkaplan görünmeyecek ancak yine de bizim için belirleyici bir etken olacak.

Şimdi gelelim c# da mayın tarlası oyunu nasıl yapılır? sorunun cevabı olan kodlarımızı vermeye…

C# Mayın Tarlası Kodları – Mayınları Üret

Öncelikle bize gereken değişkenler ve nesneler şunlardır.

        Random rnd = new Random();
        List<int> mayın = new List<int>();
        int puan, dtiklanan = 0, mayinsayisi = 0, kutu = 0;

Radiobutton’lara tıkladığımızda bir labele mayın sayısını yazacağız.

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton1.Checked == true)
                label1.Text = "Mayın Sayısı 10";
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton2.Checked == true)
                label1.Text = "Mayın Sayısı 25";
        }

        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton3.Checked == true)
                label1.Text = "Mayın Sayısı 40";
        }

Başla butonuna tıkladığımızda TableLayoutPanel nesnesinin her hücresine buttonları ekleyeceğiz.

        private void btn_oyna_Click(object sender, EventArgs e)
        {
            if (radioButton1.Checked == true)
                Oyna("kolay");
            else if (radioButton2.Checked == true)
                Oyna("orta");
            else if (radioButton3.Checked == true)
                Oyna("zor");
            else
                MessageBox.Show("Zorluk Seçin");
        }

Oyna butonuna tıkladığımızda seçilen zorluğa göre Oyna adındaki metodumuzu çalıştıracağız. Bu metodumuz buttonları ve ve mayınları ayarlayacak. Sonrasında da üretilen dinamik buttonlara bir Click Event ataması yapacak.

      public void Oyna(string mod)
        {
            tableLayoutPanel1.ColumnStyles.Clear();
            tableLayoutPanel1.RowStyles.Clear();
            tableLayoutPanel1.Controls.Clear();
            mayın.Clear();
            dtiklanan = 0;
            mayinsayisi = 0;
            kutu = 0;
            puan = 0;
            label4.Text = "PUAN: 0";

            tableLayoutPanel1.ColumnCount = 10;
            tableLayoutPanel1.RowCount = 10;

            if (mod == "kolay") mayinsayisi = 10;
            else if (mod == "orta") mayinsayisi = 25;
            else if (mod == "zor") mayinsayisi = 40;

            for (int i = 0; i < tableLayoutPanel1.ColumnCount; i++)
            {
                tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));

                for (int x = 0; x < tableLayoutPanel1.RowCount; x++)
                {
                    if (i == 0)
                    {
                        tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
                    }
                    Button cmd = new Button();
                    cmd.BackColor = Color.Gray;
                    cmd.Dock = DockStyle.Fill;
                    cmd.Name = kutu.ToString();
                    tableLayoutPanel1.Controls.Add(cmd, i, x);
                    kutu++;
                }
            }
            int randomsayi;
            for (int i = 0; i < mayinsayisi; i++)
            {
                do
                {
                    randomsayi = rnd.Next(1, (tableLayoutPanel1.ColumnCount * tableLayoutPanel1.RowCount) - 1);

                } while (mayın.Contains(randomsayi));

                mayın.Add(randomsayi);
            }

            ButtonClickAyarla();
        }
        private void ButtonClickAyarla()
        {
            foreach (Control ctl in this.tableLayoutPanel1.Controls)
            {
                ctl.MouseClick += new MouseEventHandler(Form1_MouseClick);
            }
        }

Kodları açıklamak gerekirse;

  • Temizlenmesi gereken nesneleri ve değişkenleri temizliyoruz.
  • TableLayoutPanel nesnesi içerisine 10 satır ve 10 kolon olacağını belirtiyoruz. Böylece 100 hücreli bir tablo elde ediyoruz. Bu C# mayın tarlası oyununda tablodaki hücre sayısı değil mayın sayısı değişecek.
  • İlk for döngüsü içerisinde TableLayoutPanel nesnesine kolon ekliyoruz. Kolon eklendikten sonra ikinci bir for ile de bu eklenen kolona satırlar ekliyoruz.
  • Hücrelerin eşit boyutlarda olması için ilk kolona eklenen satırları yüzde olarak ekliyoruz. Ayrıca ilk kolona satır eklendiğinde diğer kolonlara ekleme gereği duymuyoruz.
  • İkinci for içerisinde satır eklendikten sonra dinamik olarak bir button üretiyoruz ve o anda içinde olduğumuz hücreye ekliyoruz.
    • Oradaki kutu değişkeni, buttonun sıra numarası oluyor.
  • Üçüncü fora geldiğimizde , zorluk seviyesinden gelen mayın sayısı kadar mayın üretiyoruz. Bu mayınları da bir List<T> içerisine alıyoruz. Burada TableLayoutPanel nesnesine eklediğimiz buttonların index sıralarına eşleşecek şekilde Random sayı üretiyoruz. Burada üretilen sayılar mutlaka bir buttona denk gelecektir. Bu List<T> sayesinde tıklanan butonun mayınlı olup olmayacağını bu listedeki eleman ile TableLayoutPanel içindeki buttonun indexleri eşitlenerek belirlenecek.
  • Son olarak, bir foreach döngüsü ile de TableLayoutPanel nesnesi içindeki tüm buttonlara bir Click Event ataması yapıyoruz.

Şimdi sıra geldi buttonların click eventine…

C# Mayın Tarlası Kodları – Mayınları Bul

Yukarıdaki kodlarda gördüğünüz Form1_MouseClick eventi ile devam edelim. Burada yine bir metot kullanıyoruz.

    void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            Event(sender);
        }

Burada tıklanan buttonda mayın var mı yok mu kontrol edeceğiz.

private void Event(object sender)
        {
            if (sender.GetType().Name == "Button")
            {
                Button tiklanan = (Button)sender;
                if (tiklanan.BackColor != Color.Green && tiklanan.BackColor != Color.Red)
                {
                    string isim = tiklanan.Name;
                    if (mayın.IndexOf(Convert.ToInt32(isim)) != -1) // Yandın
                    {
                        tiklanan.BackColor = Color.Red;
                        tiklanan.Image = Image.FromFile(System.Windows.Forms.Application.StartupPath + "\\mayin.PNG");
                        HepsiniAc();
                        MessageBox.Show("Kaybettiniz. \nToplam Puan: " + puan);
                    }
                    else // Kazandın
                    {
                        tiklanan.BackColor = Color.Green;
                        Random rnd = new Random();
                        int tikpuan = rnd.Next(1, mayinsayisi);
                        puan += tikpuan;
                        tiklanan.Text = tikpuan.ToString();
                        label4.Text = "PUAN: " + puan.ToString();

                        if (dtiklanan == ((tableLayoutPanel1.ColumnCount * tableLayoutPanel1.RowCount) - 1) - mayinsayisi)
                        {
                            HepsiniAc();
                            MessageBox.Show("Kazandınız \nToplam Puan: " + puan);
                        }
                        else
                        {
                            dtiklanan++;
                        }
                    }
                }
            }
        }

Kodları açıklamak gerekirse;

  • İlk olarak tıkladığımız nesnenin ne olduğunu öğrenmeye çalışıyoruz. Eğer tıkladığımız şeyin adı Button ise kodlarımıza devam ediyoruz.
  • Tıkladığımız şeyin button olduğunu anladığımız için artık üretilen dinamik buttonu ele alabiliriz. Eğer if ile kontrol etmeden direk bu satırdan devam etseydik, eğer tıkladığımız şey button değilse  C# InvalidCastException hatası alırdık.
  • Eğer tıklanan butonun arkaplan rengi yeşil veya kırmızı değil ise işlemlere devam edeceğiz. Çünkü buttonun arkaplanı yeşil ise daha önce tıklanmış ve puanı alınmıştır. Eğer kırmızı ise mayın çıkmıştır ve oyun bitmiştir. Oyna butonuna tıklanana kadar yeni oyun başlatmadığımız için oyunun durması gerekecek. Yani oyuncunun butonlara tıklayamaması gerekiyor.
  • Bir değişkene tıklanan butonun adını alıyoruz Hatırlarsanız butonların Name özelliklerine eklendikleri index sıra numarasını vermiştik.
  • List<T> ‘in IndexOf metodu ile tıklanan butonun mayın listesinde olup olmadığını kontrol ediyoruz. Eğer metoddan dönen değer -1 ise mayın listesinde tıklanan butonun adı yani index numarası vardır. Buda tıklanan butonda mayın olduğu anlamına gelir. BKZ. C# String İşlemleri İndexOf
  • Tıklanan butonda mayın varsa otun bitiyor ve HepsiniAc() metodumuz çalışıyor. Böylece diğer tüm mayınları görüyoruz.
  • Tıklanan butonda mayın yoksa,
    • Tıklanan butonun arkaplan rengini yeşil yapıyoruz
    • Puan için Random bir sayı üreteceğiz.
    • Tıklama için puan veriyoruz. Verilecek puan 1 ile mayın sayısı arasında olacak.
    • Tıklamadan gelen puanı, puan değişkenine atıyoruz.
    • Puanı Label’e yazıyoruz.
    • Eğer tıklanan button mayınsız olan son button ise, yani mayınsız tüm buttonlar tıklanmış ise, geri kalan mayınların hepsini gösteriyoruz ve Kazandınız mesajını veriyoruz.
    • Mayınsız son button değil ise tıklanmış olan button sayısını arttırıyoruz.

Şimdi gelelim HepsiniAc() Metodumuza

        private void HepsiniAc()
        {
            for (int i = 0; i <= (tableLayoutPanel1.ColumnCount * tableLayoutPanel1.RowCount) - 1; i++)
            {
                Button btn = (Button)tableLayoutPanel1.Controls[i];
                if (mayın.IndexOf(Convert.ToInt32(btn.Name)) != -1)
                {
                    btn.BackColor = Color.Red;
                    btn.BackgroundImageLayout = ImageLayout.Stretch;
                    btn.BackgroundImage = Image.FromFile(System.Windows.Forms.Application.StartupPath + "\\mayin.PNG");
                }
                else
                {
                    btn.BackColor = Color.Green;
                }
            }
        }

Kodları açıklamak gerekirse;

  • TableLayoutPanel içindeki tüm nesnelerin sayısı kadar bir döngü oluşturuyoruz.
  • TableLayoutPanel içindeki tüm nesnelerin bir button olduğunu ifade ediyoruz.
  • Sıradaki buttonun mayınlı olup olmadığını, buttona verdiğimiz isimden kontrol ediyoruz.
  • Eğer sıradaki button mayınlı ise,
    • Buttonun arkaplan rengini kırmızı yapıyoruz.
    • Buttonun arkaplan resmine bir mayın resmi koyuyoruz.
      • Buradaki System.Windows.Forms.Application.StartupPath kısmı bize projemizin EXE dosyasının yer aldığı klasörün yolunu vermektedir.
  • Eğer sıradaki button mayınlı değilse, arkaplan rengini yeşil yapıyoruz.
    • Burada puanları her tıklama anında verdiğimizden oyun bittiğinde açtığımız buttonlar için puan vermiyoruz. Zaten burada, tıklamadan açılan buttonlara puan vermekte pek mantıklı olmayacaktır.

Oyunun ekran görüntüsü aşağıdaki gibidir.

C# Mayın Tarlası Yapımı - C# Mayın Tarlası Kodları

Böylece c# da mayın tarlası oyunu nasıl yapılır? soruna cevap vermiş olduk.


C# Mayın Tarlası Yapımı – C# Mayın Tarlası Kodları dersimizde bu kadardı arkadaşlar. Diğer proje derslerimizde görüşmek üzere.

C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız. Derslerime özel olarak hazırladığım Github Projeme bu bağlantıdan ulaşabilirsiniz… Bu projede Github platformunda yerini almıştır. Oradan indirip kullanabilirsiniz. Github kullanıyorsanız beni oradan da takip (Follow) edebilirsiniz.

Sağlıcakla ve takipte kalın. ?

Bu yazıya tepkiniz ne oldu?

Yazar Hakkında

Lise Ağ Sistemleri ve Yönetimi bölümü, üniversite Bilgisayar Programcılığı bölümü Ön Lisans, Yönetim Bilişim Sistemleri Lisans öğrenimi aldım. Askerlik görevimi tamamladım. Uzmanlık alanım; C# ve SQL Programlama dilleri ile müşteri odaklı, kullanıcı dostu ERP ve CRM gibi sistemleri geliştirmektir. Ayrıca şuanda PHP ve MYSQL alanında projeler geliştirmekteyim. C++, Phyton, Xamarin, MVC gibi konuları öğrenmek ve kendimi geliştirme çabası içerisindeyim. Discord için: https://discord.gg/FBxZeHu9

Değerli yorumlarınızı bekliyorum. :)