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.