"Enter"a basıp içeriğe geçin

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 9×9 olacak şekilde butonlarımızı oluşturduk.


// 9x9luk 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 & lt; 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 & lt; 8; x++)
{
        for (int y = 1; y & lt; 8; y++)
{
            if (indeks[x, y] == 0)
            {
                // y + 1 , y - 1
                if (indeks[x, y + 1] != 0 & amp; & y != 8)
{
                    sayilar[x, y + 1]++;
                    indeks[x, y + 1] = -1;
                }
                if (indeks[x, y - 1] != 0 & amp; & y != 0)
{
                    sayilar[x, y - 1]++;
                    indeks[x, y - 1] = -1;
                }

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

                //y + 1 ---- x+1,x-1
                if (x & lt; 8 & amp; & y & lt; 8)
{
                    if (indeks[x + 1, y + 1] != 0)
                    {
                        sayilar[x + 1, y + 1]++;
                        indeks[x + 1, y + 1] = -1;
                    }
                }
                if (x & gt; 0 & amp; & y & lt; 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 & lt; 8 & amp; & y & gt; 0)
{
                    if (indeks[x + 1, y - 1] != 0)
                    {
                        sayilar[x + 1, y - 1]++;
                        indeks[x + 1, y - 1] = -1;
                    }
                }
                if (x & gt; 0 & amp; & y & gt; 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şturdu

private void Form1_Click(object sender, EventArgs e)
{
    Button btnBasilan = (sender as Button);
    int sayac = 1;
    for (int i = 0; i & amp; amp; lt; 9; i++)
{
        for (int f = 0; f & amp; amp; lt; 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] == -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!

İndir

Yazıyı Paylaşmak İster misin?
Share on Facebook
Facebook
Pin on Pinterest
Pinterest
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Share on Tumblr
Tumblr
Share on Reddit
Reddit
    Bir cevap yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir