Python'la Satranç Yapay Zekâsı Kodlamak - Bölüm 1

aLivingDead

Bu yazıyı, okuyan kişinin temel seviyede Python bilgisine sahip olduğunu baz alarak yazdım.

Dosya ve Taslak Oluşturma

Fotoğraf 1
Fotoğraf 1

Öncelikle bir klasör ve onun altına bir Python dosyası oluşturuyoruz. (bkz. Fotoğraf 1) Bu dosya, yapay zekâmızın ana kodlarını kapsayacak.

Fotoğraf 2
Fotoğraf 2

Oluşturduğumuz dosyanın içerisine, fonksiyonlarımızı belirteceğimiz sınıfımızı ve temel __init__ fonksiyonumuzu kodlayalım. (bkz. Fotoğraf 2)

Fotoğraf 3
Fotoğraf 3

__init__ fonksiyonumuzaysa, 'game status'ü (oyun durumunu), 'lunge order'ı (hamle sırasını) ve 'chessboard'ı (satranç tahtasını) içeren değişkenlerimizi 'None' (Hiçbiri) olarak tanımlayalım. (bkz. Fotoğraf 3)

Satranç tahtası 8 satır ve sütundan oluşan 64 karelik bir nesne olduğundan, bir liste içerisine 8 ayrı liste ekleyerek ve her birine 8'er tane eleman tanımlayarak sanal bir tahta oluşturabiliriz. Bu, tahtadaki her kareye ulaşabilmemize yarayacak. Örneğin bir kareyi liste indeksleme yöntemiyle çağırmak istediğimizde, normal bir satranç tahtasına benzer olarak, belirteceğimiz ilk değer satırı, ikincisiyse sütunu (bir başka değişle o satırın x elemanını) ifade edecek.

En sol üstteki 'bC' nesnesine ulaşabilmemiz için chessboard[0][0] kodunu yazmalıyız. Yani 0. satırın, 0. sütunu (bir başka değişle belirtilen satırın 0 elemanı).

Tahtadaki boş kareleri boşlukla, dolu kareleri de, karede bulunan taşı temsil edecek harflerle doldurdum. Örneğin black castle (siyah kale) -> bC, ya da white queen (beyaz vezir) -> wQ şeklinde.

Fotoğraf 4
Fotoğraf 4

Devamında, döngüyü başlatmamıza (loop), oyun durumunu kontrol etmemize (check_game_status), hamle sırası verisini içeren değişkenimizi değiştirmemize (change_turn) ve hamle yapmamıza (lunge) olanak tanıyacak fonksiyonları kodluyoruz. (bkz. Fotoğraf 4)

Fotoğraf 5
Fotoğraf 5

Şimdi de, döngüyü başlatıp sürdürecek olan loop fonksiyonumuzun içerisinde, fonksiyon çalışmaya başladığında yürütülecek döngü taslağını kodlayalım. (bkz. Fotoğraf)

  • Döngü while döngüsüyle yenilecek ve başlangıca her dönüşünde oyun durumunu belirten değişkenin değerini kontrol edecek. Durum eğer 'None'dan farklıysa döngü duracak, aksi halde yürütülmeye devam edecek. (Detay için bkz. son madde)
  • while koşulu sağlandığında öncelikle mevcut hamle sırası verisi değişecek. (Başlangıçta none'dan beyaz, sonrasındaysa beyazdan siyah olabilmesi için.)
  • Değişen hamle sırası verisinden sonra sıra kimdeyse o tarafın hamle yapabilmesi adına lunge fonksiyonu oynatılacak.
  • Hamle yapıldıktan sonraysa, döngü başa dönmeden hemen önce mevcut oyun durumunu kontrol edip oyun durum bilgisini barındıran değişkeni güncellemesi için check_game_status fonksiyonu çağrılacak.
Fotoğraf 6
Fotoğraf 6

Geri kalan fonksiyonları tamamlamamız gerekirse:

check_game_status

Bu, öncesinde tanımlanması gereken birçok fonksiyon ve değişkenden sonra yazılabilecek bir fonksiyon. Bu sebeple bu bölümde pas geçeceğim.

change_turn

True beyazı, False siyahı, None hiçbir şeyi temsil ediyor.

Hamle sırasını 'None' olarak tanımlamıştık. Döngü başında sırayı beyaza vermemiz gerektiği fikrini de işin içine katarak; 'None' veya 'False' koşullarında sıranın 'True'a dönmesini, aksi halde 'False'un tanımlanmasını istiyoruz. (bkz. Fotoğraf 6)

lunge

Aslında bu fonksiyonu yazabilmemiz için de öncelikle elimizde, tanımlanmış taşlara ihtiyacımız var. Bunu bu bölümde yapmayacak da olsak, fonksiyonunu tanımlayabiliriz. define_moves fonksiyonun, içerisinde hamleleri barındırdığı bir liste döndürdüğünü düşünerek taslağımızı tanımlayacağız.

(Fonksiyonun döndürdüğü örnek liste ->[ ( (0, 1), (2, 0) ), ( (1, 1), (3, 1) ) ])

Bir süre, elde ettiğimiz listeden bir elemen seçebilmek için random modülünün choice fonksiyonunu kullanacağız. Bu fonksiyon, verilen listeden rastgele bir değer seçer ve bu değer belirtilen değişkene atanır.

Elde ettiğimiz listenin ( (0, 1), (2, 0) ) olduğunu varsaydığımızda pieIndex ve movIndex olarak belirttiğimiz değişkenlerin sırayla (0, 1) ve (2, 0) olacağını görebiliriz.

Bu değişken verileriyle, satranç tahtamızdaki (chessboard) verileri değiştirebiliriz. Yapmamız gereken (0, 1) indekslerindeki karede buluna taşı (2, 0) indekslerindeki kareye taşımak. Bunu basit bir şekilde değişken atama yöntemiyle yapacağız. chessboard'ın 0. indeksindeki listenin 1. indeksindeki eleman değerini (taşı), yine chessboard'ın 2. indeksindeki listenin 0. elemanına (kareye) atıyoruz. (bkz. Fotoğraf 6)

Sonuç

Sonuç olarak, elimizdeki kod şu an için çalışmıyor da olsa taslağımızı oluşturmayı başardık. Bu kod dosyası, kenarda köşede oluşturduğunuz klasör içerisinde kalabilir ve ben yeni bölüm yayınlayana değin bizleri bekleyebilir diye düşünüyorum. :)

Görüşmek üzere!

Python'la Satranç Yapay Zekâsı Kodlamak - Bölüm 1
4
4
Görüşünü yaz
4Kız Görüşü
4Erkek Görüşü

Bi’Bot Seçimi

Çok Süper Görüş
  • bebeto13

    Emeğinize sağlık bunu pycharm editöründe daha verimli çalıştırabilir miyiz?

    Ya da Anaconda ile?

    Bir de bu oyunu nesne yönelimli olarak nasıl yapabiliriz? Classlar ve interface ile?

    Örnek : Mesela her taşın fonksiyonu farklı oluyor. Fil mesela L çiziyor... vb

    Tekrar teşekkürler böyle güzel kodları paylaştığınız için. İşte burada matematik gene devreye giriyor: vektörler, analitik geometri ve matrisler

    Yorumla
    Görüş hala geçerli mi?

Diğer Görüşler İçin Aşağı Kaydır

Kızlar & Erkekler Ne Diyor?

43
  • Catutigernos

    Eline sağlık ama böyle bir kod yazılmaz. Taşları string olarak tanımlamışsın boardu da string matrix olarak. Object oriented bir tasarım söz konusu değil. Her bir taş için class tanımlamalısın. Stone adında base bir classın olur. Taşın rengi, taş oyunda mı değil mi ve o an ki konumu onun içinde barındırılır. Programlama stiline göre move komutunu ve olası hareket yönlerini tespit etmek için objenin içinde bir fonksiyon tanımlarsın boardu da parametre olarak gönderirsin. Ya da taş nesnesinde sadece data tutarsın GameManager boardu kendi içinde barındırır ve geri kalan işlemleri kendi yapar. GameEngine'nin içinde bir tane GameManager instance i tanımlarsın. GameEngine içindeki yapay zeka yapın GameManagerı kullaranarak hamleleri gerçekleştirir.

    Yardımcı 1 Kişi
    Yorumla
    • Bu denli bilgim olmadığı için bu kadar yapabildim. Bahsettiklerini anlamaya çalıştım ama aşına olmadığım şeyler var. Bir kısmını anladım ama hepsini anlamadan bütünü gerçekleştirmem zor olacaktır. Bahsettiklerini anlatan belirli kaynak önerilerin var mı?

    • python object oriented design diye aratırsan karşına kaynak çıkar. Python object oriented bir dil o yüzden özellikle Object Oriented nedir onu anlamaya çalış

    • Anladım, sağol.

      Paylaştığım bu bilgi tamamıyla hatalı mı yani? Amatör bir kodlama diyebiliriz gibi geliyor

    • Hepsini Göster
  • Sarı_Papatyam_benim

    emeğinize sağlık

    Sevdim 1 Kişi
    Yorumla
  • IAmarPresterAen

    Emeğinize sağlık

    Sevdim 1 Kişi
    Yorumla
  • Aysegul5341

    Emeğine sağlık

    Sevdim 1 Kişi
    Yorumla
  • özgürrkiizz

    Bunu ilk defa duyuyorum

    Yorumla
  • Barış_LonelyForever

    Faydalı bir paylaşım olmuş

    Yorumla
  • LoveBrid

    Güzel paylaşım , emeğine sağlık

    Yorumla
YÜKLENİYOR...