Programcıların Dikkatine: Tavla Turnuvası Başlıyor…

4 Eylül 2007 tarihli, Programlama köşesine ait yazı.

AçıkBilgi.com Tavla Turnuvası

Sadece eğlenmek için kod yazmaya ne dersiniz? Gelin siz de tavla oynayan bir fonksiyon yazıp gönderin, algoritmalarımızı kapıştıralım :)

Güncelleme: Doküman tamamlandı, TavlaOyuncusu.java dosyasını indirip hemen yazmaya başlayabilirsiniz. Özel durum testlerini yakın zamanda ekleyeceğim.

Tahtanın Görünümü ve Numaralandırma

24lü Tavla Numaralandırma SistemiŞanslıyız ki tavlada dünya çapında kabul edilen bir numaralandırma sistemi ve notasyon mevcut. Yanda görüldüğü gibi beyaz oyuncu için en uzaktaki pulun numarası 24. Kırmızı için ise aynı şekilde yine en uzaktaki pulunun numarası 24.

Oyuncular arasında pozisyon tercümesini kolayca şöyle yapabiliriz: Beyaz için 5 numaralı bölüm kırmızı için 25-5=20 numaradır.

Oyundaki hamleleri ise (pulun bulunduğu yer)/(gittiği yer) şeklinde ifade ediyoruz. Örnek olarak 24/23 hamlesi en uzak pulumuzdan 1 oynadığımızı gösterir. Oyun başında (3 1) attıysak, muhtemel oyunumuz 6/5 8/5 olacaktır.

Oyunda hangi renk pula sahip olursanız olun hamleler büyük sayıdan küçük sayıya doğrudur! Siz de oyun sırasında buna uygun outputlar göndereceksiniz.

Standart notasyonda kullanılan zarları toplayarak oynama kuralını (mesela 24/13) kolaylık sağlamak ve belirsizlikten kaçınmak için kullanmayacağız. Ayrıca pulunuz kırılıp çıktığınızda 25 numaradan oynuyormuş gibi varsayın, yani 1 atıp çıkma hamlesi 25/24‘tür. Benzer şekilde pulunuzu almak için de 0 noktasına taşımanız gerekir.

Programlama Dili Tercihi

Tavla oynayan algoritmamızı implement ederken kullanacağımız programlama dilinin C, C++ veya Java olabileceğini düşünüyorduk. Aşağıdaki nedenlerden Java olmasına karar vermiş bulunuyorum:

  • Her platformda aynı şekilde çalışabilir,
  • İleride algoritmaları karşılaştıracağımız kodları ve kullanıcı arabirimini ben ve arkadaşlarım yazacağından yabancı olmadığımız bir dil olması gerekir,
  • İstediğiniz algoritmayla site üzerinden single player oynamak için kolay bir applet yazılabilir,
  • Temiz kod olur :)

Java değil de C ve C++’a alışkın olanlar için çok sorun olmasa gerek, kodunuzu birkaç modifikasyonla java’da çalışır hale getirebilirsiniz. Tabii ki set, list, map, queue gibi class’lara aşina olmanız yararınıza.

Zaten yakın zamanda fonksiyonu içeren örnek bir class ve deneme yapabilmeniz için bir de driver class sağlayacağım. Belki özel durumları test eden bir de test class’ı yazarım.

Kurallar

Tavla oyunundaki kurallar aslında bildiğiniz gibi, pek farklı bir durum yok:

  1. Oyunun amacı rakibinizden önce tüm pulları toplamaktır.
  2. Oyuna büyük zarı atan başlar. Bu oyuncu ilk hamle için tekrar zar atmaz. Karşılaşmanın geri kalanında oyuncular sırayla ikişer zar atarlar, çift zar atan 4 kez oynar.
  3. Kırmak, kapı almak, gele atmak, mars etmek, vurup kaçmak, çıkıp kırmak, Zeki Müren kapısı, Yıldo kapısı, Mahmut Tuncer kapısı, vs. vs. herşey oyun dahilindedir.
  4. Oyuncu her iki zarı da oynayabiliyorsa oynamalıdır. (özel durumlar kısmındaki örneklere bakınız)
  5. Geçersiz bir hamle tespit edildiğinde oyuncu diskalifiye olur, gerekirse pozisyon incelenir.

Örnek Hamleler, Özel Durumlar

İki zarın da oynanması gereken durumİki zarın da oynanması gereken durum
İki zarın da oynanması gereken durumlar vardır. Örnek olarak yanda (6 4) atan beyaz oyuncu güvenli olsun diye 13/7 oynayıp 4′ü bırakamaz! Bu durumda önce 24/6, daha sonra da 18/14 oynamalıdır.

İki zarın da oynanması gereken durum 2İki zarın da oynanması gereken durum 2
Yukarıdaki durum taşlarınızı toplarken de geçerlidir. Yine (6 4) zarla başta 6/0 yaptığınız takdirde 4′ü oynayabileceğiniz bir yer kalmaz. Ancak geçerli hamle 6/2 ve sonrasında 5/0‘dır.

Oynanabilen zar tercihiOynanabilen zar tercihi
Beyaz oyuncu (6 4) attığında yalnızca 24′ten ve sadece bir zar oynayabiliyor. Oyuncu isterse 24/18 oynayabilir, ya da daha iyisi 24/20 ile kırmızı taşı kırabilir.

Güvenli hamleGüvenli hamle
Beyaz oyuncunun (4 1) attığını düşünelim. 4/0 2/1 hamlesi oyuncu marsa bu kadar yakınken kötü bir tercih. Bu durumda 4/3 3/0 hamlesi hem geçerli hem de mantıklı bir tercih olacaktır. Tabii ki bunu gibi mantıksız hamleler de geçerlidir.

Mantıklı hamleMantıklı hamle
Beyaz oyuncu (5 4) attığı zaman 6/1 3/0 oynanabilir. Ancak 4′ü önce oynayarak 6/2 3/0 oynamak daha akıllıca bir seçenektir. Bunu bile düşünen bir algoritma yazdıysanız helal olsun…

Fonksiyon Parametreleri

Üzerinde hayli düşündük: bir tavla algoritması sonraki hamleler için (>1) bir search tree çıkarması gerekir mi?

Tavla bildiğiniz gibi şans oyunu; rakibinize gelecek zara, nasıl oynayacağına, ve sonrasında size gelen zara göre her hamlede pozisyonu tekrar kontrol etmeli, karar vermelisiniz. Bir pulunuzu açık bırakacağınızda rakibinizin vurma ihtimalini azaltmaya çalışırsınız, yani bir hamle sonrasını düşünürsünüz.

Bu yüzden fonksiyonumuz verilen pozisyona ve atılan zarlara göre tek sonuç çıkarmalı, o pozisyona nasıl gelindiğinin sonraki hamlelere karar bazında etkisi olmamalı.

Yukarıdaki class yazmanız gereken fonksiyonu içeriyor. Şimdi bu fonksiyonu inceleyelim:

public String oyna(int[] durum, int zar1, int zar2)
  • durum array’i: Size oyundaki durumu veren 28′li bir int[]‘dir.
    durum[0]: topladığınız pul sayısı
    durum[1-24]: yukarıdaki numaralandırma sistemine göre bölümlerde bulunan pul sayısı (artı değerler sizin pulunuz, eksi değerler rakibin pulu olduğunu gösterir, 0’sa o bölümde pul yoktur)
    durum[25]: kırık pul sayınız
    durum[26]: rakibin kırık pul sayısı
    durum[27]: rakibin topladığı pul sayısı

    Örnek olarak tavlanın durumu ilk başta şu şekildedir:
    [0 -2 0 0 0 0 5 0 3 0 0 0 -5 5 0 0 0 -3 0 -5 0 0 0 0 2 0 0 0]

  • zar1 ve zar2: Rastgele oluşturulmuş zarlar.
     
  • return değeri: Bu tavla pozisyonuna ve zarlara göre oynadığınız hamledir.
    null veya “”: Oynayacak pulunuz olmadığını gösterir.
    “8/5 6/5″: başlangıçta (3 1) attıysanız yapacağınız muhtemel hamle.
    “24/18 24/18 13/7 13/7″: başlangıçta (6 6) attıysanız yapacağınız hamlelerden biri.

Yazdığınız class’ı derlemek için konsoldan javac TavlaOyuncusu.java demeniz, oyunun başında random atılan zara göre nasıl oynadığını test etmek için java TestEt yazmanız yeterlidir. Tabii ki kendi testinizi yazabilirsiniz.

Anlaşılmayan Nokta?

Hemen yorum olarak ekleyin, anlaşılmayan, net olmayan ne varsa düzeltelim. Bunun dışında herkese başarılar. Yeni test case’leri ekler eklemez siteye yazacağım.



Yorumlar - Başa Dön

egedik
19 Eylül 2007

merhabalar klasik tavla oyununda eskiden beri bildigimiz,pullari toplarken varsa once buyuk toplanir veya sallanir,sonra kucuk toplanir veya sallanir.verdiginiz ornekde toplarken 6-4 ve 4-1 versiyonunda once kucukde oynanabilir demissiniz.bunun bir aciklamasi olmali.yoksa bizmi yanlis biliyoruz,tesekkurler.

hasan
9 Aralık 2007

Toplarken guvenli hamle yapmak diger oyuncuya haksizlik omaz mi? Buyuk gelen zar pulu disari alabiliyorsa once kucuk zari oynayip sonra buyuguyle pulu disari almak zarin 6-4 gelmesi durumunda 10 bosluk a hamle yapmak yerine 8 bosluga hamle yapmak sonucunu dogurur.Bu da gelen zarin bir kisminin bosa harcanmasi anlamina gelir.oysa tek zarin oynanabildigi durumlarda buyuk zarin oynanma zorunlulugu bize tavla oyununun gelen zarin mumkun olan en doyurucu sekliyle oynanmasi gerektigini ifada eder; 4-3 attiginiz durumda yalniz birini oynayabiliyorsaniz 4 oynamak zorundasinizdir.Bu da zar toplamina en yakin hamleyi-atlanacak boslukyada blot sayisiyla-yapmamiz gerektigini anlatir.Yada iceriye girerken buyuk zarla oynamak zorunda olmamiz ayni anlama gelmez mi? Yahut da zarlari toplarken 6 nolu zarin alaninda alinacak pul kalmamissa sonraki en buyuk numarali bosluktan pul almak zorunda kaliyor olmamiz -yani 1 numarali bosluk degil de 5 numarali bosluktan pul almak zorunda kalmamiz- zararin gelen zarin toplamina mumkun olan en yakin sekilde oynamimiz gerektigini ifade etmez mi?

Tavla
21 Haziran 2008

bu sanırım client kısmı.
oyunun server tarafı nerde?

Kerem
15 Şubat 2009

Üstadım siteni yeni keşettim, gerçekden harika bilgiler var, Umarım devamını getirirsiniz :)

cengiz
26 Ağustos 2009

Arkadaşım verdiğin çok yararlı bilgiler ışığında kendi tavla programımı geliştirdim program bütün özel durumlara uygun hareket ediyor sadece yapay zekasında biraz geliştirme ihtiyacı var ama neyazıkki programı java bilmediğim için dark basic adında bir oyun programları geliştirmeye çok uygun olan bir dil ile yazdım programım çalışma ilkesi çok şahane olduğunu söyleyebilirim bu nedenle yapay zekayı üst seviyeye çıkarmak için sadece bir kaç parametre değiştirmem yetecek program tamamlanınca indirmek için bir link eklemeyi düşünüyorum ve çalışmalarınızda başarılar diliyorum.



Yorum Yazın

(gerekli)

(gerekli)


Yorum yapacaklar için bilgi:
Verdiğiniz mail adresi sitede asla görüntülenmeyecektir. Sonraki yorumlarınız için isim, e-posta gibi bilgiler cookie olarak bilgisayarınızda saklanacaktır.



Önizleme: