10 Aralık 2011 Cumartesi

(Sayı Sırala - 1) Hazırlık


Uygulamanın bitmiş halinin görüntüsü
Bu uygulamayı indir

İlk örnek projemiz basit bir sayı sıralama oyunu olsun. Öncelikle uygulamanın küçük bir algoritmasını çıkaralım.

Seviye Seçimi (Ana Ekran)
Oyuncu basit(3x2), orta(3x3) ya da özel bir zorluk derecesi seçebilmeli. Özel seçildiğinde oyuncudan sütün ve satır sayısın girilmesi istenmeli ve bu değerlere göre oyun tahtası hazırlanmalı.

Zamanla Yarışma:
Oyuncunun oyunu ne kadar zamanda bitirdiğini gösterebilmek için bir timer nesnesi ile oyunda geçirilen süre hesaplanmalı.

Oyun Tahtasının Hazırlanması:
Bu uygulamada oyun tahtası olarak GridView, sayılar içinde Buton elemanlarını kullanacağız... Her yeni oyunda sayılar yani butonlar rastgele sıralanmalı.

Sayı Adedinin Tespiti:
Belirtilen satır ve sütün sayısının çarpımının bir eksiği kadar sayımız olacak. Neden bir eksiği çünkü arada sayıları hareket ettirebilmek için bir boşluğa ihtiyacımız olacak.

Yani 3x2 lik bir tahta için sayı sayısı 3 x 2 - 1 = 5 olmalı. Yani şu şekilde



Sayı Hareketleri:
Boşluk hariç kaç tane sayımızın olacağını belirledik, şimdide bu sayıların nasıl hareket edeceğini belirleyelim.

Not: 1.sayının konumu yani indeksi 0’dır. 2. sayının konumu 1’dir… n. sayının konumu n-1’dir.

1) Sayının üstüne bakmak :


Burada 4 sayısına tıkladığımızı varsayarsak, 4’ün üstüdeki sayının konumunu bulmak için söyle bir formül kullanabiliriz.

Tıklanan Sayının Konumu – Sütün Sayısı = Tıklanan Sayının Üstündeki Elemanın Konumu

Yani
4 sayısının konumu 4 tür. Sütün sayısı = 3 ise

4 - 3 = 1 o halde 4 sayısının üstündeki sayının konumu yani indeksi 1'dir. O zaman 1. konumdaki elemanı kontrol edeceğiz. Eğer orada bir sayı yoksa 4 sayısını oraya taşıyacağız aksi halde hiçbir şey yapmayacağız.


Tabii sınır dışına çıkmamak için tüm bunları bir if bloğu içerinde yapmalıyız. if bloğunun koşulu ise şöyle olmalı:

(Üsteki Sayının Konumu – Sütün Sayısı) >= 0

 ise bu işlemler yapılmalı. Yani 1 sayısına tıklandığını düşünün 1- 3 = -2 olup uygulamanın -2. indeksteki sayıya bakmasına yani dizi sınırının dışına çıkmasına ve hata vermesine sebep olur.

Kod olarak yazalım

//1) Sayının üstüne bakmak 
if ( ((tiklananKonum - sutunSayisi) >= 0) ) {
   
 btnBosluk = butonlar.get(tiklananKonum - sutunSayisi);
 if (btnBosluk.getText().equals(""))
 boslukKonum = (tiklananKonum - sutunSayisi);

}

2) Sayının altına bakmak :



Burada 2 sayısına tıkladığımızı varsayarsak, 2’ün altındaki elemanın konumunu bulmak için söyle bir formül kullanabiliriz.

(Tıklanan Sayının konumu + Sütün Sayısı) = Tıklanan Sayının Altındaki Elemanın Konumu

Yani 2 sayısının konumu 2 dir. Sütün sayısı = 3 ise 2+3=5 o halde 2 sayısının altındaki elemanın konumu yani indeksi 5 dir. O zaman 5. sıradaki sayıyı kontrol edeceğiz. Eğer orada bir sayı yoksa 2 sayısını oraya taşıyacağız aksi halde hiçbir şey yapmayacağız.

Yine sınır dışına çıkmamak için tüm bunları bir if bloğu içerinde yapmalıyız. if bloğunun koşulu ise şöyle olmalı.

(Alttaki Sayının Konumu + Sütün Sayısı) < Sayı Sayısı

ise bu işlemler yapılmalı. Yani 5 sayısına tıklandığını düşünün 5 + 3 = 8 olup uygulamanın 8. indeksteki sayıya bakmasına yani dizi sınırının dışına çıkmasına ve hata vermesine sebep olur. Çünkü
toplam sayı sayısı boşlukla beraber 6'dır.

Kod olarak yazalım

//2)Sayının altına bakmak:
if ( (tiklananKonum + sutunSayisi) < butonlar.size()) {
   
 btnBosluk = butonlar.get(tiklananKonum + sutunSayisi);
 if (btnBosluk.getText().equals(""))
  boslukKonum = (tiklananKonum + sutunSayisi);
}

3) Bir Önceki Konuma Bakmak:



Burada 4 sayısına tıkladığını düşünürsek bir önceki konumu bulmak için şu formülü kullanabiliriz.

(Tıklana Sayının Konumu – 1) = Bir Önceki(Soldaki) Elemanın Konumu

Yani
2 – 1 = 1
demek ki 1. konumdaki elemanı kontrol edeceğiz. Eğer boşluk ise 4 sayısını sola hareket ettireceğiz aksi halde hiçbir şey yapmayacağız.


Sınır dışına çıkmamak için ve tıklanan sayısının ikinci satırın başında olup ta birinci satırın sonundaki boşluğa atlamasını engellemek için yukarıdaki formülü iki koşullu bir if bloğu içerisine almalıyız.
 A - Sınır dışına çıkmamak için if bloğunun ilk koşulu şöyle olmalı : 1 sayısına tıklandığını düşünün formülü uygularsak 0-1 = -1 uygulama -1. konumdaki elemana bakacak yani dizinin sınırının dışına çıkılmış olacak. Bunu engellemek için koşulumuz şöyle olmalı:

(Tıklana Sayının Konumu – 1) >= 0

B - Tıklanan sayısının ikinci satırın başında olup ta birinci satırın sonundaki boşluğa atlamasını engellememiz gerek. (Aşağıdaki resme bak)


3 sayısına tıklandığını düşünün, formülü uygulayalım 3-1 = 2 yani 2 konumdaki elemana bakacağız evet orada boşluk var o zaman 3 sayısı oraya taşınacak. Ama bu bir hatadır. İşte bu hatayı engellemek içinde diğer koşulumuzda şöyle olmalı.

(Tıklana Sayının Konumu - Tıklana Sayının Bulunduğu Satır X Sütun Sayısı) != 0

[ (3 – 1 X 3) != 0 ] = False

İşlem sonucu sıfırdır. Koşul uymaz ve taşıma işlemi gerçekleşmez. Yani burada herhangi bir satırın en başındaki sayısının bir üstteki satırın sonundaki boşluğa taşınmasını engelledik.

Not: Birinci satırın indeksi 0, ikinci satırın indeksi 1, …n. satırın indeksi n-1’dir.

Kod olarak yazalım


//3) Bir Önceki Konuma Bakmak:

if ((tiklananKonum - 1 ) >= 0 && ((tiklananKonum - bulunduguSatir * sutunSayisi) != 0) ){ 

 btnBosluk = butonlar.get(tiklananKonum - 1);
 if (btnBosluk.getText().equals(""))
  boslukKonum = (tiklananKonum - 1); 

}

3) Bir Sonraki Konuma Bakmak:

Burada 3 sayısına tıkladığını düşünürsek bir sonraki konumu bulmak için şu formülü kullanabiliriz.

(Tıklana Sayının Konumu + 1) = Bir Sonraki(Sağdaki) Elemanın Konumu

Yani 3 + 1 = 4 demek ki 4. konumdaki elemanı kontrol edeceğiz. Eğer boşluk ise 3 sayısını sağa hareket ettireceğiz aksi halde hiçbir şey yapmayacağız.

Sınır dışına çıkmamak ve tıklanan sayısının birinci satırın sonunda olup ta ikinci satırın başındaki boşluğa atlamasını engellemek için yukarıdaki formülü iki koşullu bir if bloğu içerisine almalıyız.
 A - Sınır dışına çıkmamak için if bloğunun ilk koşulu şöyle olmalı : 2 sayısına tıklandığını düşünün formülü uygularsak 5+1 = 6 uygulama 6. konumdaki elemana bakacak yani dizi dışına çıkılmış olacak. Çünkü en son elemanın indeksi 5’dir ve dizi dışına çıkılmıştır. Bunu engellemek koşulumuz şöyle olmalı:

(Tıklana Sayının Konumu + 1) < Sayı Sayısı

B - Tıklanan sayısının birinci satırın sonunda olup ta ikinci satırın başındaki boşluğa atlamasını engellememiz gerek. (Aşağıdaki resme bak)


4 sayısına tıklandığını düşünün, formülü uygulayalım 2+1 = 3 yani 3. konumdaki elemana bakacağız evet orada boşluk var o zaman 4 sayısı oraya taşınacak. Ama bu bir hatadır. İşte bu hatayı engellemek içinde diğer koşulumuzda şöyle olmalı.

(Tıklana Sayının Konumu – (Tıklana Sayının Bulunduğu Satır X Sütun Sayısı) + 1 ) != Sütun Sayısı

[ (2 – (0 X 3) + 1) != 3 ] = False


İşlem sonucu 3’dür. Koşul uymaz ve taşıma işlemi gerçekleşmez. Yani burada herhangi bir satırın en sonundaki sayısının bir alttaki satırın başındaki boşluğa taşınmasını engelledik.

Not: Birinci satırın indeksi 0, ikinci satırın indeksi 1, …n. satırın indeksi n-1’dir.

Kod olarak yazalım
//4)Bir Sonraki Konuma Bakmak:

if ( ((tiklananKonum + 1 ) < butonlar.size()) && (((tiklananKonum - (bulunduguSatir * sutunSayisi) + 1) != sutunSayisi)) ){

 btnBosluk = butonlar.get(tiklananKonum + 1);
 if (btnBosluk.getText().equals(""))
  boslukKonum = (tiklananKonum + 1);

}

Her Sayı Hareketinde Kontrol
Oyuncunun her sayı hareketinden sonra sayılar doğru bir şekilde sıralanmış mı kontrol edilir. Sıralama doğru ise timer nesnesi durdurulup oyuncuya oyunun ne kadar zamanda bitirildiği söylenip oyun sonlandırılır.

Hiç yorum yok:

Yorum Gönder