c# Desktop

Tetris Oyununu C# Dilini Kullanarak Form Sayfasında Kodlama1

Çocukluğumuzda oynadığımız oyunlardan biri de tetris oyunudur. Bu yazı dizisinde bu oyunun kodlamasını aşama aşama yapacağız. Bu oyunu öğrendiğimizde buna benzer 20 oyununda kodlamasını anlayabilirsiniz.

Adım 1: Kodlamaya başlamadan önce form tasarımını yapmalısınız. Bunun için paint programını kullanabilirsiniz.

Adım 2: Visual Studio programını açınız. Bunun için devenv komutunu kullanabilirsiniz.

Adım 3: Create a new project diyerek yeni bir proje oluşturunuz. Dil olarak c#, platform olarak Windows, ortam olarak Desktop seçiniz. Ekrana gelen şablonlardan Windows Forms App(.Net Framework) seçiniz.

Adım 4: Proje ismini TetrisOyunuForm olarak belirleyiniz. FrameWork olarak 4.5 tercih ediniz. Projenizi kullanacak son kullanıcıların bilgisayarlarındaki versiyonu dikkate alarak bu tercihi yapınız. Böylece projeniz daha fazla insan tarafından kullanılacaktır. Create diyerek işlemi tamamlayınız.

Adım 5: Ekrana gelen form sayfasını düzenleyelim. Form sayfası seçiliyken Properties panelinden gerekli değişiklikleri yapalım.
Name = frmTetris
MaximizeBox = False
MinimizeBox = False
Size = 420;600
StartPosition = CenterScreen
Text = Tetris Oyunu

Projeyi çalıştırıp uygulamayı deneyelim.

Adım 6: Solution Explorer penceresinde view Code simgesine tıklayınca frmTetris.cs sekmesi ve altında program kodlarının yazılacağı kısım gelir. Projeyi çalıştırıp uygulamayı deneyelim.

using System.Windows.Forms;
 
namespace TetrisOyunuForm
{
    public partial class frmTetris : Form
    {
        public frmTetris()
        {
            InitializeComponent();
        }
    }
}

Adım 7: Oluşturacağımız nesneleri önce burada tanımlıyoruz. Bu oyunlarda görünür ekranın arka planında oyunu kontrol eden bir sanal matrix ya da tablo olayı vardır. Oyunla ilgili tüm bilgiler bu matrixde yada sanal tablo dizisinde tutulur. Biz de dışarıdan karelerin hareketini ve tetris olunca yok olmasını izleriz. Tetris şekilleri karelerden meydana gelir. Tetris ekranının kaça kaç sanal tablodan oluşacağını belirleyelim. Bizim yapacağımız tetris ekranı 10 X 20 lik bir sanal tablodan oluşacaktır. Bu değerleri istediğiniz şekilde değiştirebilirsiniz. 10 X 20 lik tablo 10*20=200 sanal kareden oluşur. Bu diziyi şöyle tanımlarız. Projeyi çalıştırıp uygulamayı deneyelim.

        Label[] kare = new Label[201];

Adım 8: Tetrisimizi oluşturan karelerin boyutunu 25*25 piksel yapacağız. Her kare arasına 1 piksellik boşluk bırakacağız. Buna göre tetris panosunun boyutunu hesaplamamız gerekir. Yatay 10 kare olacağı için 1+(25+1)*10=261 piksel, dikey 1+(25+1)*20=521 piksel eder. Tetris Panosu 261*521 boyutunda olur. Tüm bunları formun tasarım modunu kullanmadan sadece kod bölümünde kod yazarak yapacağız. Oluşturacağımız nesneler şimdilik kare dizisi, pano olup hepsini Label kullanarak oluşturacağız. Şimdi bunları tanımlayalım. Projeyi çalıştırıp uygulamayı deneyelim.

using System.Windows.Forms;
 
namespace TetrisOyunuForm
{
    public partial class frmTetris : Form
    {
        Label[] kare = new Label[201];
        Label pano;
        int say;
        public frmTetris()
        {
            InitializeComponent();
        }
    }
}
Buradaki say değişkeni kare dizisi için kullanacağımız sayaç için gereklidir.

Adım 9: Bu nesneleri formumuzda oluşturmak için önce Solution Explorer penceresindeki frmTetris.cs dosyasına ya da kod yazdığımız pencerenin üst kısmındaki frmTetris.cs(Design) sekmesine tıklarsak formumuz görünür hale gelir. Form üzerinde mousumuzu çift tıklarsak tekrar kod penceresine döneriz. Fakat bu sefer formumuzla ilgili frmTetris_Load yordamının oluştuğunu görürüz. Projeyi çalıştırıp uygulamayı deneyelim.

        private void frmTetris_Load(object sender, System.EventArgs e)
        {
 
        }

Adım 10: Şimdi aşağıda verdiğim özelliklere göre forma bir Label ekleyelim. Projeyi çalıştırıp uygulamayı deneyelim. 

İsmi : kare1

Genişlik : 25

Yükseklik : 25

Arkaplan rengi : Mavi

Yazı Rengi : Beyaz

Soldan  26

Üstten : 26

İçerik : 1

Sırası : 1

Görünür olsun

Adım 11: Oluşturduğumuz karenin yanına 1 tane daha, verilen özelliklere göre, Label ekleyelim. Projeyi çalıştırıp uygulamayı deneyelim. 

İsmi : kare2

Genişlik : 25

Yükseklik : 25

Arkaplan rengi : Mavi

Yazı Rengi : Beyaz

Soldan  52

Üstten : 26

İçerik : 2

Sırası : 2

Görünür olsun

Adım 12: Henüz iki tane kare oluşturduk. Bu işlemler bile bayağı zaman aldı. Ancak bu uygulamada 10 x 20 = 200 tane kare oluşturmamız gerekli. Belli bir özelliğe sahip ve birbirleriyle ilişkili nesneleri statik olarak oluşturmak yerine dinamik bir şekilde oluşturabiliriz. Bu hem programın hızlı çalışmasını hem de bellekte az yer kaplamasını sağlar. Ayrıca kısa sürede nesnelerin istenilen özelliklerde daha çabuk oluşmasını sağlar. Tanımladığımız iki label nesnesini silelim. Öncelikle birinci label nesnesini kodlarla oluşturmaya çalışalım. Projeyi çalıştırıp uygulamayı deneyelim.
        private void frmTetris_Load(object sender, System.EventArgs e)
        {
                    kare[1] = new Label();
                    kare[1].Location = new System.Drawing.Point(26, 26);
                    kare[1].Name = "kare1";
                    kare[1].Size = new System.Drawing.Size(25, 25);
                    kare[1].BackColor = Color.Blue;
                    kare[1].ForeColor = Color.Yellow;
                    kare[1].Text = say.ToString();
                    kare[1].TabIndex = say;
                    Controls.Add(this.kare[1]);
                    kare[1].Visible = true;
        }

Adım 13: Şimdi ikinci label nesnesini kodlarla oluşturmaya çalışalım. Projeyi çalıştırıp uygulamayı deneyelim.  

        private void frmTetris_Load(object sender, System.EventArgs e)
        {
                    kare[2] = new Label();
                    kare[2].Location = new System.Drawing.Point(52, 26);
                    kare[2].Name = "kare2";
                    kare[2].Size = new System.Drawing.Size(25, 25);
                    kare[2].BackColor = Color.Blue;
                    kare[2].ForeColor = Color.Yellow;
                    kare[2].Text = say.ToString();
                    kare[2].TabIndex = say;
                    Controls.Add(this.kare[2]);
                    kare[2].Visible = true;
        }

Adım 14: Dikkat ettiniz mi, yine aynı işlemleri yapıyoruz. Uygulama yine zaman alıyor. Kodlar çoğaldıkça hata yapma ihtimali de çoğalıyor. Label nesnelerinin özelliklerine dikkat ettiyseniz, konumu, adı, değeri ve sırası hariç, diğer özellikleri aynı. Bu tip aynı özelliklere sahip nesneleri oluşturmak için for döngüsünü kullanabiliriz. Döngümüzde satır sayısı 20, sütun sayısı 10 olacaktır. Buna göre döngülerimizi oluşturalım. Projeyi çalıştırıp uygulamayı deneyelim.

        private void frmTetris_Load(object sender, System.EventArgs e)
        {
            for (int j = 1; j <= 20; j++)
            {
                for (int i = 1; i <= 10; i++)
                {
                }
            }
        }

Adım 15: Label nesnemizin adını, değerini ve sırasını kontrol etmek için say değişkenini tanımlamıştık. Bu değişkene ilk önce 1 değerini girelim. Döngü içinde sürekli artmasını sağlayalım. Projeyi çalıştırıp uygulamayı deneyelim.

        private void frmTetris_Load(object sender, System.EventArgs e)
        {
            say = 1;
 
            for (int j = 1; j <= 20; j++)
            {
                for (int i = 1; i <= 10; i++)
                {
                    say += 1;
                }
            }
        }

Adım 16: Artık label nesnelerine ait özellikleri kullanarak 200 adet kare şeklini form sayfasında oluşturabiliriz. Projeyi çalıştırıp uygulamayı deneyelim.

        private void frmTetris_Load(object sender, System.EventArgs e)
        {
            say = 1;
 
            for (int j = 1; j <= 20; j++)
            {
                for (int i = 1; i <= 10; i++)
                {
                    kare[say] = new Label();
                    kare[say].Location = new System.Drawing.Point(26 * i, 26 * j);
                    kare[say].Name = "kare" + say;
                    kare[say].Size = new System.Drawing.Size(25, 25);
                    kare[say].BackColor = Color.Blue;
                    kare[say].ForeColor = Color.Yellow;
                    kare[say].Text = say.ToString();
                    kare[say].TabIndex = say;
                    Controls.Add(this.kare[say]);
                    kare[say].Visible = true;
                    say += 1;
                }
            }
        }

Şimdi bu kodu inceleyelim. Burada 10*20'lik matrisi oluşturmak için iç içe iki tane for döngüsü kullanılmıştır. Dıştaki döngü yukarıdan aşağı satırları, içteki döngü ise soldan sağa sütunları oluşturur. Döngü içindeki kod satırlarına bakalım.

kare[say] = new Label();
Her kare oluşturulurken mutlaka New Label()'le onun bir Label nesnesi olduğu tanımlanır.
kare[say].Location = new System.Drawing.Point(26 * i, 26 * j);
Bu kod oluşacak her karenin tablo üzerindeki konumunu belirler.
kare[say].Name = "kare" + say;
Her kareye kare1, kare2 .. kare200 gibi isimler verilir. Gerçi bu isimleri programda pek kullanmadık ama bilgi olarak burada bulunsun.
kare[say].Size = new System.Drawing.Size(25, 25);
Karelerin boyutlarının 25'er piksel olmasını sağlar.
kare[say].BackColor = Color.Blue;
Karelerin içini mavi renge veya istediğimiz herhangi bir renge boyar.
kare[say].ForeColor = Color.Yellow;
Kare içine yazılacak yazının rengini belirler. Burada sarıdır.
kare[say].Text = say.ToString();
Kare içine yazı yazılmasını sağlar. Burada karelere 1'den 200'e kadar numaralar yazılır. Bu iki satır normalde programda yoktur. Ben sadece bu sanal matrix ve tablo olayını ileride şekilleri oluşturuken, şekillerin kaymalarının ya da dönmelerinin nasıl olduğunu anlamanız için geçici olarak koydum. İşiniz bitince bu iki satırı siliniz.
kare[say].TabIndex = say;
Her kareye baştan itibaren 1'den 200'e kadar tabIndex numarası verir. Sadece bilgi olarak var.
Controls.Add(kare[say]);
Bu komut çok önemlidir. Karenin tüm özelliklerini tanımladıktan sonra ancak bu komutla kare formumuza eklenir.
kare[say].Visible = True;
Bu komut karenin görülmesini(True) ya da görülmemesini(False) sağlar. Programın bel kemiği bu komuttur. Bu komut sayesinde yerinde duran kareler sanki hareket ediyormuş ve dönüyormuş gibi gözükürler. Bu komut normalde burada False konumundadır. Deminde dediğim gibi kareleri incelebilmeniz bu komutun True olması gerekir. İncelemeniz bitince bu komutu False yaparsınız.
say += 1;
Her döngüde say değişkeni 1 artarak sayaç görevini yerine getirir. Böylece 200 tane kare şeklinde label oluşmuş oluyor.
Şimdi programı kaydedin. Projeyi çalıştırıp sonucu görelim. 
Çok hoş değil mi. 200 tane label, kare şeklinde 10*20 matrisine uygun şekilde ve içlerinde indis numaraları olduğu halde ekrana geldi. Bu görüntüyü kafanızda iyi canlandırın. Tetrisin çalışma sistemi bu matris yapıya göre yapılanacaktır. Formun üst sağ tarafındaki X işaretini tıklayarak kapatınız.

Adım 17: Şimdi buna bir pano ve onun da etrafına çizgiler ekleyeceğiz. Yukarıdaki program kodunun altına aşağıdaki özellikler dikkate alınarak bir label ekleyelim. Projeyi çalıştırıp uygulamayı deneyelim.

Soldan : 25

Üstten : 25

İsmi : pano

Genişlik : 261

Yükseklik : 521

Arkaplan Rengi Çiyan

            pano = new Label();
            pano.Location = new System.Drawing.Point(25, 25);
            pano.Name = "pano";
            pano.Size = new System.Drawing.Size(261, 521);
            pano.BackColor = Color.Cyan;
            Controls.Add(pano);

Bu kodları açıklamama gerek yok sanırım. Tetris kareleri altında 261*521 büyüklüğünde Cyan renginde bir pano oluştu. Bu tetrisin zeminini oluşturur. Programı tekrar çalıştırarak bu panoyu izleyebilirsiniz.

Adım 18: Şimdi programı tekrar çalıştırıp çizgileri görün. Programın yavaş çalıştığını görürsünüz. Karelerin Visible değerleri False yapın. Yukarıda silinmesi gereken komut satırlarını silin ve programı tekrar çalıştırın. Şimdi sadece pano ve çizgiler gözükür. Ayrıca programın da daha hızlı çalıştığını görürsünüz.

Şimdilik bu kadar. Bir sonraki makalede görüşmek üzere hoşça kalın.

Uygulamayı buradan indirebilirsiniz.


İlgili Makaleler
Basit Veri Bağlama (Simple Data Binding)
Veri Girişi Doğrulama (Input Validation)
c# Programında Bigpara Sayfasından Borsa Verilerini Selenium Kütüphanesini Kullanarak Çekme
TabControl Panelini Kullanarak Lokantalar İçin Müşteri Siparişi Alan c# Form Uygulaması
Kompleks Veri Bağlama (Complex Data Binding)
Veri Girişi Maskeleme (MaskedTextBox)
Yıkıcı Metotlar (Destructors)
2020 TYT Matematik Ortakatlı Kuralıyla İlgili Sorunun Çözümünü c# Diliyle Kodlama
Konsol Ekranında Kod Yazma ve Çalıştırma
Form Sınıfı
Form Sınıfına Ait Bazı Olayların ve Özelliklerin Kullanılmasına Ait Örnek Uygulama
Kaçan Buton Oyununu Yapan c# Uygulaması
Verilen İki Matrisi Çarpan Programı c# Dilinde Form Ortamında Yapınız
Metodu Sonlandırma
c# Console Uygulamalarında Ping Nasıl Kullanılır, Ping Atma
Rastgele Seçilen Bir Sayıyı Basamaklarına Ayıran, Basamak Değerini ve Sayı Değerini Bulan c# Console Uygulaması
Kredi Kartı Taksitlendirme İşlemini Yapan c# Uygulaması
Yapıcı Metotlar (Constructors)
Yazı Tura Oyunu Yapan c# Uygulaması
Faktöriyel Hesabı Yapan c# Windows Form Uygulaması

Yorum Ekle
   
Kötü
İyi