Puzzle oyununa ait tasarım kısmını paneller yardımıyla gerçekleştirmiştik. Her bir panelin içinde hangi nesnelerin yer alacağını ve değerlerini belirlemiştik. Artık kodlama işlemine geçebiliriz. Öncelikle oyun başladığında oyun ekranının tamamen boş olması gerekir. Bu işlemleri gerçekleştirirken seviye olarak Kolay kısmını dikkate alacağız. Hadi başlayalım kodlamaya.
Adım 1: Resimlerin 4 parçaya bölündüğü pnlGameArea bölümünde yer alan resimlerin başlangıçta ekranda görünmemesi gerekir. Bu işlemi gerçekleştirmek için Formun Load olayını tanımlamamız gerekir. Bunun için formun boş bir yerinde farenin sol tuşuna iki defa bazabiliriz. Ya da form seçiliyken Properties panelinde yer alan şimşek simgesini seçelim. Burada listelenen olaylardan Load olayına gelelim. Boş kutuda ENTER tuşuna ya da farenin sol tuşuna iki defa basalım.
private void frmPuzzle_Load(object sender, EventArgs e)
{
}
Adım 2: Formun Load olayının içinde PictureBox nesnelerinin tamamını gizleyelim. Projeyi kaydedip çalıştıralım. Resimlerin gizlendiğini görürsünüz.
private void frmPuzzle_Load(object sender, EventArgs e)
{
img1.Visible = false;
img2.Visible = false;
img3.Visible = false;
img4.Visible = false;
}
Adım 3: pnlScore panelinde adım sayısı ve geçen süreyi göstermek amacıyla iki adet Label kullanmıştık. Burada yer alan nesneler sürekli değişeceğinden Text değerlerini silelim. Öncelikle adım işlemlerini gerçekleştirmek için int tipinde bir değişken tanımlayalım. Daha sonra lblStep nesnesinin Text özelliğini yeniden tanımlayalım.
int step;
..................................
step = 0;
lblStep.Text = "Adım : " + step;
Adım 4: Şimdi de geçen süreyi belirlemek için string tipinde bir değişken tanımlayalım. Daha sonra lblTime nesnesinin Text özelliğini yeniden tanımlayalım.
string zaman;
..................................
zaman = "00:00";
lblTime.Text = zaman;
Adım 5: Resmin orijinal kısmının gösterildiği pnlDisplayImage kısmında yer alan PictureBox nesnesini gizleyelim.
imgOriginal.Visible = false;
Adım 6: Oyunun seviyesini belirlediğimiz pnlGameSelect kısmına gelelim. Burada oyun başladığında başlangıçta seviyeyi kolay olarak belirleyelim. Kullanıcının bu seviyelerden birini seçmesini sağlayalım.
rdbEasy.Enabled = true;
rdbMiddle.Enabled = true;
rdbHard.Enabled = true;
rdbEasy.Checked = true;
Adım 7: Şu ana kadar oyun başladığında varsayılan olarak temel ayarları gerçekleştirdik. Kullanıcı her oyunu başlattığında bu ayarlar sıfırlanacaktır. Her defasında bu ayarları tekrar yazmak yerine ayarlar() isminde bir fonksiyon oluşturalım. Bu kodları buraya yazalım. Daha sonra bu fonksiyonu formun Load olayından çağıralım.
private void frmPuzzle_Load(object sender, EventArgs e)
{
ayarlar();
}
private void ayarlar()
{
img1.Visible = false;
img2.Visible = false;
img3.Visible = false;
img4.Visible = false;
step = 0;
lblStep.Text = "Adım : " + step;
zaman = "00:00";
lblTime.Text = zaman;
imgOriginal.Visible = false;
rdbEasy.Enabled = true;
rdbMiddle.Enabled = true;
rdbHard.Enabled = true;
rdbEasy.Checked = true;
}
Adım 8: Artık oyuna başlayabiliriz. btnStart butonunun Click olayını oluşturalım. Bunu yapmanın iki yolunu daha önce açıklamıştık. Burada kullanıcı oyuna başladığında eğer oyunu bitirmek isterse diye aynı butonda oyunu bitirme işlemini de gerçekleştirmeliyiz. Bu işlemi gerçekleştirmek için butonun Text özelliğinden yararlanacağız. Ayrıca butonun text rengini duruma göre beyaz ve sarı yapalım.
private void btnStart_Click(object sender, EventArgs e)
{
if (btnStart.Text == "Oyuna Başla")
{
btnStart.Text = "Oyunu Bitir";
btnStart.ForeColor = Color.Yellow;
} else { btnStart.Text = "Oyuna Başla";
btnStart.ForeColor = Color.White;
} }
Adım 9: Kullanıcı eğer oyunu bitirmek isterse yeni oyuna başlayabilmesi için oyuna ait tüm ayarların sıfırlanması gerekir. Bu işlemleri gerçekleştirmek için ayarlar() metodunu tanımlamıştık.
private void btnStart_Click(object sender, EventArgs e)
{
if (btnStart.Text == "Oyuna Başla")
{
btnStart.Text = "Oyunu Bitir";
btnStart.ForeColor = Color.Yellow;
}
else
{
btnStart.Text = "Oyuna Başla";
btnStart.ForeColor = Color.White;
ayarlar();
}
}
Adım 10: Oyunda hangi resme ait puzzle oluşturulacağı oyunun seviyesine göre belirleniyordu. Seviye işlemlerini RadioButton yardımı ile kullanıcıdan alıyorduk. Bu işlemi belirlemek için CheckedChanged() olayını her üç radio düğmesi için tanımlayalım. Kullanıcının hangi seviyeyi seçtiğini belirlemek için int tipinde bir değişken tanımlayalım. Daha sonra hangi radyo düğmesini sectiyse o radyo düğmesine ait değeri değişkene aktaralım.
int sec;
private void rdbEasy_CheckedChanged(object sender, EventArgs e)
{
sec = 1;
}
private void rdbMiddle_CheckedChanged(object sender, EventArgs e)
{
sec = 2;
}
private void rdbHard_CheckedChanged(object sender, EventArgs e)
{
sec = 3;
}
Adım 11: Kullanıcının seçtiği seviyeyi btnStart düğmesine tıklandığında ekranda görüntüleyelim.
private void btnStart_Click(object sender, EventArgs e)
{
if (btnStart.Text == "Oyuna Başla")
{
btnStart.Text = "Oyunu Bitir";
btnStart.ForeColor = Color.Yellow;
MessageBox.Show("Seçiminiz : " + sec);
}
else
{
btnStart.Text = "Oyuna Başla";
btnStart.ForeColor = Color.White;
ayarlar();
}
}
Adım 12: Şimdi bu seçime göre işlemleri gerçekleştireceğiz. Seçim 1 ise kolay, 2 ise orta, 3 ise zor olacaktır. Sayısal olarak 3 durum söz konusu olduğu için if cümleciği yerine switch deyimini kullanacağız. Bu deyim yardımıyla sayısal değerler üzerinde kontrol işlemini yapabilirsiniz.
private void btnStart_Click(object sender, System.EventArgs e)
{
if (btnStart.Text == "Oyuna Başla")
{
btnStart.Text = "Oyunu Bitir";
btnStart.ForeColor = Color.Yellow;
switch (sec)
{
case 1:
MessageBox.Show(sec.ToString());
break;
case 2:
MessageBox.Show(sec.ToString());
break;
case 3:
MessageBox.Show(sec.ToString());
break;
default:
MessageBox.Show("Oyunun Seviyesini Belirleyiniz.");
break;
}
}
else
{
btnStart.Text = "Oyuna Başla";
btnStart.ForeColor = Color.White;
ayarlar();
}
}
Adım 13: Hatırlarsanız deneme işlemlerini kolay seçimine göre gerçekleştiriyorduk. Kullanıcı oyunun seviyesini belirledikten sonra oyuna başladığında artık oyunun seviyesini değiştirmesini istemiyoruz. Bunun Click olayını aşağıdaki gibi düzenleyelim.
private void btnStart_Click(object sender, System.EventArgs e)
{
if (btnStart.Text == "Oyuna Başla")
{
rdbEasy.Enabled = false;
rdbMiddle.Enabled = false;
rdbHard.Enabled = false;
btnStart.Text = "Oyunu Bitir";
btnStart.ForeColor = Color.Yellow;
switch (sec)
{
case 1:
MessageBox.Show(sec.ToString());
break;
case 2:
MessageBox.Show(sec.ToString());
break;
case 3:
MessageBox.Show(sec.ToString());
break;
default:
MessageBox.Show("Oyunun Seviyesini Belirleyiniz.");
break;
}
}
else
{
btnStart.Text = "Oyuna Başla";
btnStart.ForeColor = Color.White;
ayarlar();
}
}
Adım 14: Kullanıcı seviye olarak kolayı seçtiğinde resmin orijinalini ekranda göstermemiz gerekir. Buna ait kodumuzu yazalım.
private void btnStart_Click(object sender, System.EventArgs e)
{
if (btnStart.Text == "Oyuna Başla")
{
rdbEasy.Enabled = false;
rdbMiddle.Enabled = false;
rdbHard.Enabled = false;
btnStart.Text = "Oyunu Bitir";
btnStart.ForeColor = Color.Yellow;
switch (sec)
{
case 1:
imgOriginal.Visible = true;
MessageBox.Show(sec.ToString());
break;
case 2:
MessageBox.Show(sec.ToString());
break;
case 3:
MessageBox.Show(sec.ToString());
break;
default:
MessageBox.Show("Oyunun Seviyesini Belirleyiniz.");
break;
}
}
else
{
btnStart.Text = "Oyuna Başla";
btnStart.ForeColor = Color.White;
ayarlar();
}
}
Projeyi kaydedip çalıştırdığımızda kodların düzgün bir şekilde çalıştığını görürsünüz. Parçalara bölünmüş resmin rastgele dağıtıldığı işlemleri bir sonraki makalede anlatacağız.

Uygulamanın bu aşamasına ait kodları buradan indirebilirsiniz.
|