C# Mayın Tarlası Oyunu

KodcuReis

Yeni üye
23 Ocak 2019
12
0
İzmir Aydın
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.

mayin-tarlasi.png


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.
Kod:
// 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 **** 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.******** = 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].******** = 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.
Kod:
// Bomba indekslerini random(rastgele) ata
private **** 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 **** 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.
Kod:
private **** 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.
Kod:
private **** 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
            {
                Sound******** = @"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 **** 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.
Kod:
int acilanAlanSayisi = 0;
// Oyunun Başarı ile bitip bitmediğini kontrol et
private **** 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!
 
Moderatör tarafında düzenlendi:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.