C# Mayın Tarlası Oyunu

C# Mayın Tarlası Oyunu

Üniversite yıllarının başlarında yapmış olduğum mayın tarlası oyununu sizlerle paylaşmak istiyorum.Oyunun kaynak kodlarını aşağıda paylaşacağım.Kaynak kodlarına geçmeden önce, oyundaki sayıların ne anlama geldiğini açıklayalım.Ayrıca C# Mayın Tarlası Oyunu'nun dosyasını aşağıdaki linke tıklayarak indirebilirsiniz.

Mayın Tarlasında Sayıların Anlamı Nedir?

Mayın tarlası oyunu, küçük kutulardan oluşur.Bu kutuların bazılarının içinde bomba, bazılarının içinde sayı olabilir yada bazı kutuların içi boş olabilir.Kutunun içinde yazan sayılar, o kutunun etrafında bulunan toplam bomba sayısını gösterir.


Kaynak Kodlar
Design kısmına sadece menuStrip ekliyoruz.Geriye kalan tüm nesneleri kod ile oluşturacağız.

Burada ilk olarak dizileri, nesneleri, değişkenleri tanımladık.Ardından panel oluşturduk ve oluşturulan panel içerisinde 9x9 olacak şekilde butonlarımızı oluşturduk.

// 9x9' luk Buton dizisi oluşturduk
        Button[,] btn = new Button[9, 9];

        // Buton indeks kontrollerini edeceğiz,yani bombamı, sayımı yada boş mu olduğunu öğrenmemizi sağlayacak.
        int[,] indeks = new int[9, 9];

        //Bomba etrafında butonların, bomba sayısını gösterecek.
        int[,] sayilar = new int[9, 9];

        Random rndm = new Random();

        // Oyunda toplamda 9 bomba olacak, bunu toplamBombaSayisi değişkeni ile belirledik.
        int yerlestirilenBombaSayisi = 0, toplamBombaSayisi = 9;

        //Yeni Oyuna Tıklandığında Gerçekleşek olan İşlemler
        Panel panel = new Panel();
        private void YeniOyunToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // Panel oluşturduk
            panel.Name = "panel1";
            panel.Size = new Size(600, 660);
            panel.BackColor = Color.Transparent;
            //Paneli formda ortaladık.
            float x = (Convert.ToInt32(this.Width) - Convert.ToInt32(panel.Width)) / 2;
            float y = (Convert.ToInt32(this.Height) - Convert.ToInt32(panel.Height)) / 2;
            panel.Location = new Point(Convert.ToInt32(x), Convert.ToInt32(y));
            this.Controls.Add(panel);
            //
            //Buton oluşturduk
            //
            int H = 60, sayac = 1;
            for (int j = 0; j < 9; j++)        // satır sayısı
            {
                for (int i = 0; i < 9; i++)    // sütun sayısı
                {
                    btn[j, i] = new Button();
                    btn[j, i].Name = "button" + sayac.ToString();
                    btn[j, i].Size = new Size(60, 60);
                    btn[j, i].FlatStyle = FlatStyle.Popup;
                    btn[j, i].FlatAppearance.BorderSize = 0;
                    btn[j, i].Location = new Point(i * 60, H);
                    btn[j, i].BackColor = Color.MediumBlue;
                    btn[j, i].ForeColor = Color.White;
                    btn[j, i].Font = new Font("Arial", 20.0f,FontStyle.Bold);
                    btn[j, i].Text = "";
                    btn[j, i].Enabled = true;
                    btn[j, i].Click += Form1_Click;
                    panel.Controls.Add(btn[j, i]);
                    sayac++;

                    // 1: Boşluk
                    // 0: Bomba
                    //-1: Sayılar
                    indeks[j, i] = 1;
                    sayilar[j, i] = 0;
                }
                H += 60;
            }
            BombalariYerlestir();
            SayilariYerlestir();
        }


Burada bombaları ve sayıları yerleştirdik.

// Bomba indekslerini random(rastgele) ata
private void BombalariYerlestir()
{
    int x, y;
    for (int i = 0; i < toplamBombaSayisi;)
    {
        x = rndm.Next(1, 8);
        y = rndm.Next(1, 8);
        if (indeks[x, y] == 1)
        {
            indeks[x, y] = 0;
            i++;
            yerlestirilenBombaSayisi++;
         }
     }
}

private void SayilariYerlestir()
{
    for (int x = 1; x < 8; x++)
    {
        for (int y = 1; y < 8; y++)
        {
            if (indeks[x, y] == 0)
            {
                // y + 1 , y - 1
                if (indeks[x, y + 1] != 0 && y != 8)
                {
                    sayilar[x, y + 1]++;
                    indeks[x, y + 1] = -1;
                }
                if (indeks[x, y - 1] != 0 && y != 0)
                {
                    sayilar[x, y - 1]++;
                    indeks[x, y - 1] = -1;
                }

                // x + 1, x - 1
                if (indeks[x + 1, y] != 0 && x != 8)
                {
                     sayilar[x + 1, y]++;
                     indeks[x + 1, y] = -1;
                }
                if (indeks[x - 1, y] != 0 && x != 0)
                {
                     sayilar[x - 1, y]++;
                     indeks[x - 1, y] = -1;
                }

                //y + 1 ---- x+1,x-1
                if (x < 8 && y < 8)
                {
                    if (indeks[x + 1, y + 1] != 0)
                    {
                         sayilar[x + 1, y + 1]++;
                         indeks[x + 1, y + 1] = -1;
                    }
                }
                if (x > 0 && y < 8)
                {
                    if (indeks[x - 1, y + 1] != 0)
                    {
                         sayilar[x - 1, y + 1]++;
                         indeks[x - 1, y + 1] = -1;
                    }
                }

                // y - 1 ---- x+1,x-1
                if (x < 8 && y > 0)
                {
                    if (indeks[x + 1, y - 1] != 0)
                    {
                        sayilar[x + 1, y - 1]++;
                        indeks[x + 1, y - 1] = -1;
                    }
                }
                if (x > 0 && y > 0)
                {
                    if (indeks[x - 1, y - 1] != 0)
                    {
                        sayilar[x - 1, y - 1]++;
                        indeks[x - 1, y - 1] = -1;
                    }
                }
            }
        }
    }
}


Burada butonların ortak click methodu olan Form1_Click methodunu oluşturduk.

private void Form1_Click(object sender, EventArgs e)
{
    Button btnBasilan = (sender as Button);
    int sayac = 1;
    for (int i = 0; i < 9; i++)
    {
        for (int f = 0; f < 9; f++)
        {
            if (btnBasilan.Name == "button" + sayac)
                BombaKontrol(i, f);
            sayac++;
        }
    }
}


Herhangi bir butona tıklandığında bombamı, boşmu yada sayımı olduğunu öğrenmek için kontrol yapıyoruz.Boş ise boşaç methoduna gönderiyoruz eğer sayı ise etrafında kaç adet bomba olduğunu yazıyoruz.

private void BombaKontrol(int i, int j)
{
    try
    {
        if (indeks[i, j] == 1)
        {
            BosAc(i, j);
        }
        else if (indeks[i, j] == 0)
        {
            btn[i, j].BackgroundImage = Image.FromFile(@"images\bomb.png");
            btn[i, j].BackgroundImageLayout = ImageLayout.Stretch;
            SoundPlayer ses = new SoundPlayer
            {
                SoundLocation = @"ses\bomb.wav"
            };
            ses.Play();
            MessageBox.Show("Oyunu Kaybettiniz!");
            panel.Controls.Clear();
        }
        else if (indeks[i, j] == -1)
        {
            btn[i, j].Enabled = false;
            btn[i, j].BackColor = Color.White;
            btn[j, i].ForeColor = Color.Blue;
            btn[i, j].Text = sayilar[i, j].ToString();
            indeks[i, j] = 4;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    OyunBittiKontrol();
}

/* Recursive bir yapı ile eğer basılan buton boş ise(Yani bomba ya da sayı değil ise) sayı görene kadar butonları her yönde aç */
private void BosAc(int i, int j)
{
    if (indeks[i, j] == 1)
    {
        btn[i, j].Enabled = false;
        btn[i, j].BackColor = Color.White;
        indeks[i, j] = 4;

        //jjjjjjj
        if (j < 8)
        {
            BosAc(i, j + 1);
        }
        if (j > 0)
        {
            BosAc(i, j - 1);
        }
        //iiiiiiii
        if (i < 8)
        {
            BosAc(i + 1, j);
        }
        if (i > 0)
        {
            BosAc(i - 1, j);
        }
        //iiiiiii----jjjjjjjjjj
        if (i > 0 && j < 8)
        {
            BosAc(i - 1, j + 1);
        }
        if (i < 8 && j < 8)
        {
            BosAc(i + 1, j + 1);
        }
        if (i < 8 && j > 0)
        {
            BosAc(i + 1, j - 1);
        }
        if (i > 0 && j > 0)
        {
            BosAc(i - 1, j - 1);
        }
    }
    else if (indeks[i, j] == 0)
    {

    }
    else if (indeks[i, j] == -1)
    {
        btn[i, j].Enabled = false;
        btn[i, j].BackColor = Color.White;
        btn[j, i].ForeColor = Color.Blue;
        btn[i, j].Text = sayilar[i, j].ToString();
        indeks[i, j] = 4;
     }
}


Son olarak bu methodu ise oyunun bitip bitmediğini kontrol ediyor.Eğer bomba bulunan butonlar hariç diğer tüm butonlar açıldıysa oyunun bittiğine dair bir mesaj verilmesini sağlıyoruz.

int acilanAlanSayisi = 0;
// Oyunun Başarı ile bitip bitmediğini kontrol et
private void OyunBittiKontrol()
{
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 9; j++)
        {
            if (btn[i, j].Enabled == false)
            {
                acilanAlanSayisi++;
            }
        }
    }

    if (acilanAlanSayisi == 72)
    {
        acilanAlanSayisi = 0;
        MessageBox.Show("Oyun Bitti, Kazandınız!!!");
        panel.Controls.Clear();
    }
    else
    {
        acilanAlanSayisi = 0;
    }
}


Kodlar bu şekilde arkadaşlar açık ve net yazmaya çalıştım.Umarım işinize yarar.
İyi Kodlamalar!

  • 0 Blogger
  • Google+
  • Facebook
  • Disqus

Henüz Yorum Yok

Yorum Gönder

comments powered by Disqus

Yayın Üstü Sponsor Reklam

Yayın Ortası Sponsor Reklam

Yayın Ortası Sponsor Reklam 2

Yayın Altı Sponsor Reklam


Bu Makaleyi Beğendinizmi ?