AATTK - Anasayfa
AATTK

İnsanlara bilgi vermeyi amaçlayan bir blog.

2048 Oyunu Mantığı ve Örnek Kodu ( C programing)

2018-01-16 - #

Geçen dönem okul projesi olarak verilen bir C projesini bugün siz takipçilerimle paylaşmak istiyorum. Genel olarak proje verildiği zaman biraz internette bilgi arayışı içerisine girdim fakat sadece mantığından bahsediliyordu çoğu sitede. Birkaç site ise Java ve C++ örnek kodlarını paylaşmıştı tabi bu kodlar görsel tabanlıydı bu yüzden mantığını anlamak daha kolayıma geldi ve biraz uğraşarak kodları yazdım.Neyse lafı uzatmadan size ilk olarak mantığını anlatacağım daha sonra ise yazdığım kodu paylaşacağım. Aslında birkaç farklı yöntemle aynı işlemleri yapabilirsiniz.

MANTIK:

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.

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.
(Short algoritmaları diye arama yaparsanız bulabilirsiniz)

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

Adım-3: Eger aynıysa 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.

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

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.

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ş oluruz.

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? Aslında olabilir fakat gayet uzun. 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.
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. (1)

ÖRNEK KOD:

K1:https://www.gokhanca.com/2048-oyunu-algoritmasi