|
Tic Tac Toe (veya XOX), bildiğiniz gibi 3 X 3 'lük küçük bir karede iki kişi tarafından oynanabilen bir oyun. Oyun zekadan çok hız ve dikkate dayanıyo diyebiliriz. Oyunun amacı yatay,dikey veya çapraz olarak 3 adet kendi taşını ardışık biçimde sıralamak. Sanırım işin buray kadar olan kısmını herkes biliyordur. Bundan sonrası, bu oyun için bir yapay zeka geliştirmekle ilgili. Google'da "Tic Tac Toe AI" diye arattığınız da yeterli miktarda bilgiye erişebileceğinize inanıyorum. Genel olarak özetlemek gerekirse TTT AI için kullanılan en genel yöntem NegaMax adı verilen, recursive bir şekilde yapılan her hamlenin rakip için ne kadar kıymetli olduğunu hesaplayıp, rakip için en kötü hamleyi seçen bir yöntem. Bu sayfada bulabileceğiniz örnekte ise bu algoritma kullanılmadı. Onun yerine Internet'te bulduğum farklı bir algoritmayı denedim. İlk başta çok başarılı sonuçlar vermese de, sonradan benim eklediğim ufak bir değişiklikle mükemmel hale geldi diyebilirim. Peki TTT için mükemmel ne demek? Bildiğiniz gibi oyunda iki tarafta hiç hata yapmazsa oyun berabere bitiyor. AI bu haliyle kendi ile oynadığı zaman tüm oyunlar berabere bitiyor. (Pek çok AI için bu geçerli değil). Bu da oyunun hata yapmadığını gösterebilir. Ayrıca herhangi bir hatanızı da çok hızlı değerlendiriyor. Bu algoritma hakkında detaylı bilgiyi şu adreste bulabilirsiniz: http://www.mvps.org/EDais/Tutorials/TTTAI/ Ancak genel olarak özetlemek gerekirse, bu algoritma oyunun o anki durumuna göre her kareye bir puan veriyor, ve en yüksek puanlı karelerden birini ragele seçerek hamle yapıyor. Kareleri puanlarken rakip'in ve kendisinin o hat (yatay,dikey,çapraz üçlü) üstündeki gücünü değerlendiriyor. Benim bu algoritmaya eklediğimi şu oldu. Tahtadaki kareleri 0-8 şeklinde şu şekilde numaralandırırsak:
Görülebileceği üzere 4 numaralı kareden 4 hat, 0-2-6-8 nolu karelerden 3'er hat 1-3-5-7 nolu karelerden 2'şer hat geçiyor. Bu da bize bir önem sırası veriyor. Yani şöyle bir önem piramidimiz var 4 Ben en yüksek puanlı karelerden rasgele birini seçerken, piramidin mümkün olan en üst basamağından bir karenin seçilmesini sağladım diyebilirim. Şimdi gelelim kodun yapısına, kod iki parçadan oluşuyor 1.VB kısmı: Bu kısım bir arayüz sağlamaktan öteye gitmiyor. TTT_AI hakkında bir kaç kısa açıklama gerekebilir, notlar halinde sıralayayım: 1.getMove ile başlayan fonksiyonların hepsi farklı zorluk
seviyelerinde AI'ler içeriyor, hepsi yukarıdaki algoritmayı içermiyor.
getMove3(): Tek hamlede galibiyet varsa onu yapıyor, yoksa tek hamlede rakip galibiyetini engelliyor, o da yoksa rasgele hamle yapıyor. getMove35(): Bu üsttekine ek olarak, bir sonraki hamle için 2 hattın tehdit edilip edilemeyeceğini araştırıyor, ayrıca piramide göre rasgele kare seçiyor. getMove4():Yukarıdaki algoritma. getMove5():Yukarıdaki algoritmaya, piramide göre rasgele seçim eklenmiş kod.
|