Kutu Patlatma Oyunu C#

Merhaba arkadaşlar bu makalemde sizler için hazırladığım kutu patlatma oyunu anlatacağım. Elimden geldiği kadar basit kodlar kullanmaya gayret gösterdim. Yeni başlayan arkadaşların kodları incelerken zorlanmamaları için. Oyun resimde görüldüğü gibi 8x8 ölçülerinde oynanıyor siz bunu geliştirebilirsiniz. İlk olarak forma 2 adet label 2 adet te listbox eklemelisiniz ekranda görüldüğü yerlere eklerseniz butonların üstüne gelmemiş olur. Dikkat edin button eklemiyoruz. Buttonlarımızı kod ile ekleyeceğiz. Form load olayına aşağıdaki kodu yazıyoruz buttonlarımızı oluşturmak için.
private void Form1_Load(object sender, EventArgs e)
        {
            label2.Text = "0";
            int En = 40, Boy = 40;
	    int x = 0, y = 0, sayac = 1;

            Button tb;
            Random rastgele = new Random();
            for (int i = 1; i < 9; i++)
            {

                tb = new Button();
                tb.Name ="b"+ i.ToString() + sayac.ToString();
                tb.Text = "b"+i.ToString() + sayac.ToString();
                tb.Font = new Font(tb.Font.Name, 1); 

                int rastgeleSayi = rastgele.Next(0, 4);

                if (rastgeleSayi == 0)
                    tb.BackColor = Color.Yellow;
                else if (rastgeleSayi == 1)
                    tb.BackColor = Color.Red;
                else if (rastgeleSayi == 2)
                    tb.BackColor = Color.Blue;
                else if (rastgeleSayi == 3)
                    tb.BackColor = Color.Pink;

                tb.Click += new System.EventHandler(ButtonClick);
                tb.Size = new System.Drawing.Size(En, Boy);
                Point p = new System.Drawing.Point(x, y);
                tb.Location = p;
                this.Controls.Add(tb);
                x = x + 40;
                if (i == 8)
                {
                    i = 0;
                   x = 0;
                    y = y + 40;
                    sayac++;
                }
                if (sayac == 9)
                    break;
            }
        }
Formload Açıklaması : Buradaki kod 40px 40px ölçülerinde 8 satır 8 sütundan oluşan buton listemizi eklemek için kullanıldı. İlk olarak en, boy ve x,y koordinatlarını tanımladık ve tb adında birde buton nesnesi oluşturduk. For döngüsü ile sütunları oluştururken sayac değişkeni ile de satırları hesaplıyoruz. Yani butonlarımızı soldan sağa yukarıdan aşağıya doğru oluşturuyoruz. Butonlarımıza sırası ile b11 b21 b31 b41 .... b12 b22 b32 b42 .... b13 b23 b33 b43 ... ..... isimler veriyoruz. Sayaç değişkenimiz 9 olduğunda yani 8 satır a da 8 adet buton eklediğimizde break ile döngüyü kesiyoruz. Random fonksiyonu ile butonlara 4 adet renk veriyoruz. 3 adet renk verdiğimizde oyunun bitmesi çok uzun sürebilir. 5 adet renk verdiğimizdede oyun çok kısa sürüyor. Eğer butonları arttırsanız renkleri çoğaltabilirsiniz. Point ve location ile buttonların koordinatlarını veriyoruz. Bir buton oluşturduğumuzda x değerine 40 vererek bir sonraki butonun sağ tarafa gelmesini sağlıyoruz ve 8 adet buton oluştuğunda x i 0 layıp başa alırken y yi 40 yaparak bir alt satıra geçmeyi sağlıyoruz.
tb.Click += new System.EventHandler(ButtonClick);
Butonların hepsine aynı click olayını atadık. ButtonClick olayı Açıklamaları kodun içerisine yazdım.
 private void ButtonClick(object sender, System.EventArgs e)
        {
            /// listboxlar da butonları kontrol edicez bu yüzden 
            /// içlerini her butona basıldığında temizlemeliyiz
            listBox2.Items.Clear();
            listBox1.Items.Clear();

            /// eğer 3 lü bir buton grubuna tıklanmadıysa 
            /// aşağıdaki yazıyı yazdırdık
            label1.Text = "eşleşme yok";
            /// tıklanan butonun ismini buton değişkenimize atadık kontroller için
            string buton= sender.ToString().Substring(35);

            /// aşağıdaki kodu bir çok kez kullandım burda butonu nasıl
            /// bulduğunu anlatıcam diğer foreachlerde bunu anlatmıcam
            /// forumdaki tüm nesneleri tek tek geziyoruz
            foreach (Control c in this.Controls)
            {
                /// eğer nesne butonsa aşağıdaki işlemleri yap
                if (c is Button)
                {
                    /// forumda bulunan buton ile tıklanan butonun adı aynı ise aşağıdaki
                    /// işlermleri yap
                    if (((Button)c).Name == buton)
                    {
                        /// uclumu fonksiyonu ile tıklanan butonun dikey ve yatay olarak
                        /// aynı renkli 2 buton ile temas edip etmediğini kontrol ediyoruz
                        if (Uclumu(((Button)c)))
                        {
                            /// eğer 3 lü ise patlat fonksiyonu ile butonları patlatıyoruz
                            Patlat(((Button)c));
                        }
                    }
                }
            }

        }
Üçlümü Fonksiyonu Bu fonksiyon ile tıkladığımız butonun aynı renk 2 buton ile dikey veya yatay olarak temas edip etmediğini buluyoruz. 1- Tıklanan buton solundaki iki buton ile aynı renk mi ? 2- Tıklanan buton sağındaki iki buton ile aynı renk mi? 3- Tıklanan buton üstündeki iki buton ile aynı renk mi ? 4- Tıklanan buton altındaki iki buton ile aynı renk mi ? 5- Tıklanan buton solundaki ve sağındaki butonlar ile aynı renk mi ? 6- Tıklanan buton üstündeki ve altındaki buton ile aynı renk mi ? Fonksiyon bu işlemleri sıra ile yapmakta 3 lü buton u bulduğu anda fonksiyonu bitirip true değerini döndürüyor. Eğer bulamazsa false değerini döndürüyor ve hiç bir işlem yapılmıyor.
                private bool Uclumu(Button basilanButon)
        {

            int birinciBasamak = Convert.ToInt32(basilanButon.Text.Substring(1, 1));
            int ikinciBasamak = Convert.ToInt32(basilanButon.Text.Substring(2, 1));

            bool sonuc = false;

            Color renk = basilanButon.BackColor;

            // sola doğru kontrol
            if (ikinciBasamak >= 3)
            {
                string b1 = "b" + birinciBasamak.ToString() + (ikinciBasamak - 1).ToString();
                string b2 = "b" + birinciBasamak.ToString() + (ikinciBasamak - 2).ToString();
                if ((RenkBul(b1) == RenkBul(b2)) && (basilanButon.BackColor == RenkBul(b2)))
                {
                    return true;
                }
            }

            // sağa doğru
            if (ikinciBasamak = 2)
            {

                string b1 = "b" + birinciBasamak.ToString() + (ikinciBasamak + 1).ToString();
                string b2 = "b" + birinciBasamak.ToString() + (ikinciBasamak - 1).ToString();
                if ((RenkBul(b1) == RenkBul(b2)) && (basilanButon.BackColor == RenkBul(b2)))
                {
                    return true;
                }

            }

            // aşağıya doğru kontrol
            if (birinciBasamak = 3)
            {

                string b1 = "b" + (birinciBasamak - 1).ToString() + ikinciBasamak.ToString();
                string b2 = "b" + (birinciBasamak - 2).ToString() + ikinciBasamak.ToString();
                if ((RenkBul(b1) == RenkBul(b2)) && (basilanButon.BackColor == RenkBul(b2)))
                {
                    return true;
                }

            }

            // ortadan yukarı ve aşağıya bakarak
            if (birinciBasamak = 2)
            {

                string b1 = "b" + (birinciBasamak - 1).ToString() + ikinciBasamak.ToString();
                string b2 = "b" + (birinciBasamak + 1).ToString() + ikinciBasamak.ToString();
                if ((RenkBul(b1) == RenkBul(b2)) && (basilanButon.BackColor == RenkBul(b2)))
                {
                    return true;
                }

            }

            return sonuc;
        }
Patlat Fonksiyonu Eğer tıklanan butonun etrafında aynı renk 2 buton varsa aşağıdaki Patlat fonksiyonu çalışıyor.
 private void Patlat(Button basilanButton)
        {
            listBox1.Items.Add(basilanButton.Name);
            for (int i=1; ;i++ )
            {
                if (i > listBox1.Items.Count)
                {
                    break;
                }
                EtrafiniKontrolEt(listBox1.Items[i - 1].ToString());                
            }

            foreach (string deger in listBox1.Items)
            {
                Beyazlastir(deger);
            }

            foreach (string deger in listBox1.Items)
            {
                int birinciBasamak = Convert.ToInt32(deger.Substring(1, 1));

                if (listBox2.Items.IndexOf(birinciBasamak) == -1)
                    listBox2.Items.Add(birinciBasamak);
             }

            Kaydir();
        }
Tıklanan butonu listbox1 e ekliyoruz.
listBox1.Items.Add(basilanButton.Name);
Tıklanan butonun çevresindeki aynı renk butonları kontrol ediyoruz. Bu kontrol işlemini etrafını kontrol et fonksiyonu ile yapıyoruz. For döngüsünün ne zaman sonlanacağını bilmediğimiz için kontrol alanını boş bıraktık. Siz bu işlemi while ile de yapabilirsiniz. Foreach kullandığınızda hata verecektir. Çünkü listbox1 e buton eklemeye devam ediyoruz. Etrafında aynı renk butonları buldukça listbox1 e ekliyoruz. Kısaca b45 nolu butona tıkladık ve bunun etrafındaki b44 b46 b35 b55 adlı butonlarıda kontrol ediyoruz. Bunlardan aynı renk olanları listbox a ekliyoruz diyelim sadece b46 aynı renk. listbox a b45 ten sonra b46 yı ekliyoruz ve b46 nın etrafını kontrol ettiriyoruz. Tabi b46 nın çevresindeki :) b47 nin aynı renk olması lazım yoksa fonksiyon buraya gelemezdi. b47 , b36, b56 butonlarınıda sırası ile listbox a eklediğini düşünürsek listbox a eklenen bu butonların etrafıda sırası ile kontrol edilecektir. Listbox bittiğinde fonksiyonda bitecektir.
            for (int i=1; ;i++ )
            {
                if (i > listBox1.Items.Count)
                {
                    break;
                }
                EtrafiniKontrolEt(listBox1.Items[i - 1].ToString());                
            }
listbox1 e eklenen butonların tümünü beyaz yapıyoruz. Beyaz olan butonların hepsini patlatacağız. Yani aynı renk olanları.
            foreach (string deger in listBox1.Items)
            {
                Beyazlastir(deger);
            }
Bütün sutünları kontrol etmemek için aşağıdaki döngü ile sadece sütun numaralarını alıyoruz ve listbox2 ye ekliyoruz.
            foreach (string deger in listBox1.Items)
            {
                int birinciBasamak = Convert.ToInt32(deger.Substring(1, 1));

                if (listBox2.Items.IndexOf(birinciBasamak) == -1)
                    listBox2.Items.Add(birinciBasamak);
             }
Aşağıdaki fonksiyon ile beyaz olan butonları silip yerlerine yeni butonları koyuyoruz üsttekileri aşağıya doğru kaydırarak.
Kaydir();
EtrafiniKontrolEt Fonksiyonu Bu fonksiyon ile tıklanan butonun etrafındaki aynı renk butonları ve etrafında bulunan ayı renk butonların etrafındaki butonları kontrol ediyoruz. Eğer bulunan buton aynı renk ve daha önce listbox1 e eklenmemişse o butonu listbox1 e ekliyoruz.
private void EtrafiniKontrolEt(string b1)
        {
            int birinciBasamak = Convert.ToInt32(b1.Substring(1, 1));
            int ikinciBasamak = Convert.ToInt32(b1.Substring(2, 1));
            // solunu kontrol ediyoruz
            if (ikinciBasamak - 1 > 0)
            {
                foreach (Control c in this.Controls)
                {
                    if (c is Button)
                    {

                        if (((Button)c).Name == b1)
                        {
                            if (RenkBul(b1) == RenkBul("b" + birinciBasamak.ToString() + (ikinciBasamak - 1).ToString()))
                                if (listBox1.Items.IndexOf("b" + birinciBasamak.ToString() + (ikinciBasamak - 1).ToString()) == -1)
                                    listBox1.Items.Add("b" + birinciBasamak.ToString() + (ikinciBasamak - 1).ToString());
                        }
                    }
                }
            }
            // sağı kontrol ediyoruz
            if (ikinciBasamak + 1 > 0)
            {
                foreach (Control c in this.Controls)
                {
                    if (c is Button)
                    {
                        if (((Button)c).Name == b1)
                        {
                            if (RenkBul(b1) == RenkBul("b" + birinciBasamak.ToString() + (ikinciBasamak + 1).ToString()))
                                if (listBox1.Items.IndexOf("b" + birinciBasamak.ToString() + (ikinciBasamak + 1).ToString()) == -1)
                                    listBox1.Items.Add("b" + birinciBasamak.ToString() + (ikinciBasamak + 1).ToString());
                        }
                    }
                }
            }
            // üstünü kontrol ediyoruz
            if (birinciBasamak - 1 > 0)
            {
                foreach (Control c in this.Controls)
                {
                    if (c is Button)
                    {
                        if (((Button)c).Name == b1)
                        {
                            if (RenkBul(b1) == RenkBul("b"+(birinciBasamak-1).ToString()+ikinciBasamak.ToString()))
                            if (listBox1.Items.IndexOf("b" + (birinciBasamak - 1).ToString() + ikinciBasamak.ToString()) == -1)
                            listBox1.Items.Add("b"+(birinciBasamak-1).ToString()+ikinciBasamak.ToString());
                        }
                    }
                }
            }
            // altını kontrol ediyoruz
            if (birinciBasamak + 1 > 0)
            {
                foreach (Control c in this.Controls)
                {
                    if (c is Button)
                    {
                        if (((Button)c).Name == b1)
                        {
                            if (RenkBul(b1) == RenkBul("b" + (birinciBasamak + 1).ToString() + ikinciBasamak.ToString()))
                                if (listBox1.Items.IndexOf("b" + (birinciBasamak + 1).ToString() + ikinciBasamak.ToString()) == -1)
                                    listBox1.Items.Add("b" + (birinciBasamak + 1).ToString() + ikinciBasamak.ToString());
                        }
                    }
                }
            }
        }
Kaydir Fonksiyonu
        private void Kaydir()
        {
            foreach (int deger in listBox2.Items)
            {

                string sutun = deger.ToString();
                for (int i = 8; i > 0; )
                {
                    if (Renklimi("b" + sutun + i.ToString()) == false)
                    {
                        for (int x = i; x > 0; x--)
                        {
                            if (x != 1)
                            {
                                Color renk = RenkBul("b" + sutun + (x - 1).ToString());
                                foreach (Control c in this.Controls)
                                {

                                    if (c is Button)
                                    {

                                        if (((Button)c).Name == "b" + sutun + x.ToString())
                                        {
                                            ((Button)c).BackColor = renk;
                                        }
                                    }
                                }
                            }
                            else
                            {
                                foreach (Control c in this.Controls)
                                {

                                    if (c is Button)
                                    {

                                        if (((Button)c).Name == "b" + sutun + x.ToString())
                                        {
                                            ((Button)c).BackColor = Color.Black;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        i--;
                    }
                }
            }

            int kactanePatladi = 0;
            Random rastgele = new Random();
            foreach (Control c in this.Controls)
            {

                if (c is Button)
                {
                    if (((Button)c).BackColor == Color.Black)
                    {
                        kactanePatladi++;
                        int rastgeleSayi = rastgele.Next(0, 4);

                        if (rastgeleSayi == 0)
                            ((Button)c).BackColor = Color.Yellow;
                        else if (rastgeleSayi == 1)
                            ((Button)c).BackColor = Color.Red;
                        else if (rastgeleSayi == 2)
                            ((Button)c).BackColor = Color.Blue;
                        else if (rastgeleSayi == 3)
                            ((Button)c).BackColor = Color.Pink;

                    }
                }
            }

            /// puanlama
            if (kactanePatladi > 10)
                label2.Text = ((kactanePatladi * 10) + Convert.ToInt32(label2.Text)).ToString();
            else if (kactanePatladi > 7)
                label2.Text = ((kactanePatladi * 7) + Convert.ToInt32(label2.Text)).ToString();
            else if (kactanePatladi > 5)
                label2.Text = ((kactanePatladi * 5) + Convert.ToInt32(label2.Text)).ToString();
            else if (kactanePatladi > 3)
                label2.Text = ((kactanePatladi * 3) + Convert.ToInt32(label2.Text)).ToString();
            else
                label2.Text = ((kactanePatladi) + Convert.ToInt32(label2.Text)).ToString();

        }
Kaydır fonksiyonu ile listbox2 ye eklediğim sütunları aşağıdan yukarıya doğru kontrol ediyoruz. Diyelim 1. sütun eklenmiş. ilk olarak b18 nolu butonu kontrol ediyoruz eğer b18 nolu buton beyaz ise b17 deki rengi b18 e b16 deki rengi b17 e b15 teki rengi b16 ya alarak devam ediyoruz. ve b11 bolu butonu siyah yapıyoruz. ve b18 i yeniden kontrol ediyoruz çünkü bir üstündeki butonunda beyaz olma ihtimali var eğer b17 de beyazsa b18 yeniden beyaz olacak ve bu işlemi yeniden yapıcaz ve b12 ile b11 siyah olacak. b18 i yeniden kontrol edicez eğer b18 beyaz değil başka bir renkse b17 yi kontrol ediyoruz. b17 de renkli ise b16 yı b15 b14 ü kontrol ediyoruz b14 beyaz ise yukarıdaki işlemi tekrar edecektir. b13 -> b14 b12 -> b13 b11 -> b12 b11 siyah yaparak işlemi devam ettiriyoruz. Sonunda 1 nolu sütündaki tüm beyaz butonların yerlerine bir üstteki renkli butonun rengini aktarmış oluyoruz ve bu sütunda kaç adet beyaz buton varsa diyelim 3 adet beyaz buton vardı sırası ile b11 b12 b13 siyah oluyor bunu listbox2 ye ekli olan diğer butonlar içinde kullanıyoruz.
int kactanePatladi = 0;
            Random rastgele = new Random();
            foreach (Control c in this.Controls)
            {

                if (c is Button)
                {
                    if (((Button)c).BackColor == Color.Black)
                    {
                        kactanePatladi++;
                        int rastgeleSayi = rastgele.Next(0, 4);

                        if (rastgeleSayi == 0)
                            ((Button)c).BackColor = Color.Yellow;
                        else if (rastgeleSayi == 1)
                            ((Button)c).BackColor = Color.Red;
                        else if (rastgeleSayi == 2)
                            ((Button)c).BackColor = Color.Blue;
                        else if (rastgeleSayi == 3)
                            ((Button)c).BackColor = Color.Pink;

                    }
                }
            }
yukarıdaki kod ile siyah yaptığımız bütün butonları rast gele 4 renk ile renklendiriyoruz. kactanePatladi değişkeni ile kaç adet butonun renklendiğini yani oyundan silindiğini sayarak aşağıdaki puanlama işlemini yaptırıyoruz.
        /// puanlama
            if (kactanePatladi > 10)
                label2.Text = ((kactanePatladi * 10) + Convert.ToInt32(label2.Text)).ToString();
            else if (kactanePatladi > 7)
                label2.Text = ((kactanePatladi * 7) + Convert.ToInt32(label2.Text)).ToString();
            else if (kactanePatladi > 5)
                label2.Text = ((kactanePatladi * 5) + Convert.ToInt32(label2.Text)).ToString();
            else if (kactanePatladi > 3)
                label2.Text = ((kactanePatladi * 3) + Convert.ToInt32(label2.Text)).ToString();
            else
                label2.Text = ((kactanePatladi) + Convert.ToInt32(label2.Text)).ToString();
label2 ye oyunun başında 0 değerini vermezseniz hata alırsınız. eğer batlayan butonlar 10 dan çok ise 10 ile çarpıyoruz. 8-9-10 ise 7 ile çarpıyoruz. 6-7 ise 5 ile çarpıyoruz. 4-5 ise 3 ile çarpıyoruz 3 tane buton patlamışsa 3 puan veriyoruz. Bu şekilde ne kadar fazla aynı renk buton patlatılırsa o kadar fazla puan alınmasını sağlıyoruz. Renklimi Fonksiyonu Bu fonksiyon ile butonların beyaz olup olmadıklarını kontrol ediyoruz.
private bool Renklimi(string b1)
        {
            bool dondur = false;
            foreach (Control c in this.Controls)
            {

                if (c is Button)
                {

                    if (((Button)c).Name == b1)
                    {
                        if (((Button)c).BackColor != Color.White)
                            dondur = true;
                    }
                }
            }

            return dondur;
        }
Beyazlaştır Fonksiyonu Patlaması gereken butonları beyaz yapıyoruz.
private void Beyazlastir(string b1)
        {

            foreach (Control c in this.Controls)
            {

                if (c is Button)
                {

                    if (((Button)c).Name == b1)
                    {
                        ((Button)c).BackColor=Color.White;
                    }
                }
            }
Renkbul Fonksiyonu Bir üstteki butonun rengini bulmak için yazıldı.
        private Color RenkBul(string b1)
        {
            Color renk = Color.White;

            foreach (Control c in this.Controls)
            {

                if (c is Button)
                {

                    if (((Button)c).Name == b1)
                    {
                        renk = ((Button)c).BackColor;
                    }
                }
            }
            return renk;
        }
Aşağıdaki kodu
tb.Font = new Font(tb.Font.Name, 1);
Açıklama satırı yaparsanız
//tb.Font = new Font(tb.Font.Name, 1);
Kodları yayımlarken sitemizi kaynak gösterirseniz sevinirim. Kodlar Özcan BAYĞUŞ tarafından yazılmıştır. Exe dosyasını indirmek için tıklayın Proje dosyasını indirmek için tıklayın
© 2018, Csharp Kitabı. Tüm Hakları Saklıdır.