2048 Oyunu Algoritması

By | 23 Ağustos 2016

Uzun zamandır cep telefonu ve tabletlerimizde oynadığımız 2048 oyunu, ilk bakışta çok basit görülse de oynadıkça hırs yaptığımız ve daha yüksek skorlara erişmek için uğraştığımız bir oyun oldu. Bu konu anlatımında size basit bir 2048 oyunu nasıl yapılır, 2048 oyunu algoritmasının adımları nelerdir, bunları anlatmaya çalışacağım. Sadece algoritmik bir anlatım yapacağım için herhangi bir dil üzerinden anlatmıyorum.

Temel Algoritma

Programda rakamların birleşmesi üzerine biraz mantık yürütelim. Aşağıda soldaki tablo başlangıç durumu olsun. Sağdaki tablo ise sola doğru kaydırma sonrası oluşan durum olsun.

1 1
2 2 2
4 2 2
4 4 4 4
2
4 2
4 4
8 8

Örneğimizdeki hareketi sola doğru yaptığımız için tabloyu satırlara göre incelememiz gerekir. Eğer yukarı veya aşağı hareket yapsaydık sütunlara göre inceleme yapacaktık. Satırları tek tek inceleyelim.

İlk satırda aralarında boşluk olan 2 adet 1 rakamı solda birleşmiş. İkinci satırda 3 adet 2 rakamından soldaki ilk 2 adedi birleşmiş. Diğeri tek kalmış. Üçüncü satırda sondaki 2 adet 2 rakamı birleşmiş ve 4 oluşmuş fakat oluşan 4 ile önceki 4 birleşmemiş. Son satırda ise 4 tane 4 değeri kendi içinde 2 adet 8 oluşturmuş ama 8 rakamları birleşmemiş. İşte bunlar hep karşımıza çıkacak olasılıklardan bazıları. Şimdi bunların hepsini kapsayacak temel bir algoritma tanımlayacağım.

Rakam Birleştirme Algoritması

Tek bir satır için aşağıdaki işlemleri yaptığımızda rakam birleştirme işlemini doğru bir şekilde gerçekleştirmiş oluruz. Üstelik bütün olası durumlar için bu metot doğru çalışır. Yine varsayılan yön olarak sola yaslandığını kabul edelim.

Örnek satır:

2 2 2

Adım-1: Hareket yönümüzü sol olarak belirlediğimiz için öncelikle bütün rakamları sola yaslarız. Burada herhangi bir kural yok. Normal bir şekilde sola yaslayın.

2 2 2

Adım-2: Soldan ilk kareyi pas geçip ikinci kareden başlarız. Aşağıda kırmızı ile seçildi. Bu karenin değeri ile bir solundaki karenin değeri aynı mı diye kontrol ederiz.

2 2 2

Adım-3: Yukarıdaki iki yeşil karenin değeri aynı olduğu için soldakinin değeri 2 ile çarpılır. Diğerinin değeri sıfır yapılır. İşlem bitti. Bir sonraki seçim için üçüncü kareye geliriz. Aşağıdaki kırmızı kare.

4 2

Adım-4: Yukarıdaki iki yeşil karenin değeri farklı olduğu için herhangi bir işlem yapılmaz. Seçim işlemi sağa doğru ötelenir. Diğer kareye geçeriz. Son kare boş olduğundan herhangi bir eşitlik oluşmayacaktır.

4 2 0

Adım-5: Tüm tarama işlemi bittikten sonra en başta yaptığımız sola yaslama işlemini tekrarlarız. Bütün rakamları koşulsuz olarak sola yaslarız.

4 2

Her bir satır için yukarıdaki adımları tekrarladığınızda rakam birleştirme işlemini 2048 oyununda olduğu gibi gerçekleştirmiş olursunuz.

Her Yön İçin Ortak Kod Yazmak

Yukarıda hep sol yöne göre anlatım yaptım. Siz kodunuzu oluştururken sola doğru tarama işlemine göre kod yazdınız diyelim. Peki yukarı yön için ayrı, sağ yön için ayrı, aşağı yön için ayrı kodlar mı yazalım? Aynı kontrolleri sadece yön değişiyor diye tekrarlayalım mı? Tabiki hayır. Ama burada bir zorluk var. Sola yaslama ile sağa yaslama arasında bile döngülerin ters çalışması söz konusu. Yani birinde sütun değişkenini 1-2-3-4 olarak oluştururken diğerinde 4-3-2-1 olarak oluşturmanız gerekir. Üstelik dik harekete geçersek bu sefer sütun değil satır saydırmamız gerekecek? İşte burada kendi oluşturduğum bir fikri paylaşacağım. Matrisin (tablonun) transpozesini alacağız.

Yani bizim rakam yaslama kodumuz tek bir yön için (mesela yukarıdaki gibi sola) çalışacak. Biz hareket yönüne göre tabloyu döndüreceğiz. Mesela, yukarı yaslama yapılmak isteniyorsa tabloyu önce -90 derece yan yatırıp sola yaslama işlemi yapacağız. Sonra +90 derece çevirip normal yönüne alacağız. Sağa yaslama yapılmak istenirse tabloyu 180 derece çevir, sola yaslama yap, 180 derece çevir, normal haline getir. Üstelik transpoze kodu yazmak çok zor değil. İçi içiçe iki tane for-next döngüsüne bakar.

Sonuç

Önemli olan bir oyunun veya bir işin mantığını öğrenmekse yukarıdaki anlatımın işinize yarayacağını düşünüyorum. Hazır kod isteyenler, copy-paste çözümler peşinde koşanlar için tatmin edici değil, bunu biliyorum. Zaten ben de bu hazırcılar için yayın yapmıyorum. Bu işi gerçekten öğrenmek isteyenlere kendi deneyimlerimi anlatmaya çalışıyorum. Umarım merak eden herkese yararlı olur. Kolay gelsin :)

2 thoughts on “2048 Oyunu Algoritması

  1. neslihan

    Öncelikle paylaşımınız için çok teşekkürler. Ben bir ödev hazırlıyorum sol sağ ve yukarı için tanımlamaları yapmışsınız, acaba aşağı yön için matrisi ne yönde kaç derece döndürmek gerekir

    Reply
    1. ugokhan Post author

      Her 90 derecelik dönüşle yukarı, sağa, aşağı, sola hareketlerini oluşturabilirsiniz. Yukarı için -90, Sağ için -180 veya +180, Aşağı için -270 veya +90 çevirmelisiniz. Gerekli yaslama işlemlerini yaptıktan sonra tam tersi açıda döndürüp eski haline getirebilirsiniz.

      Reply

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir