Python'da XOX oyunu için minimax algoritmasına alpha-beta budaması eklemek

Merhaba arkadaşlar,

Ben pytonda 7x7 lik bir XOX oyunu yaptım ve buna minmax algoritmasını ekledim. Oyun ilerleyişinde seçenekler çok olduğu için bu minmax algoritmasını alpha beta budaması yapmam gerekiyor

Bu konnu hakkında yardımcı olabilirmisiniz

minmax algoritması:

def minimax(self, isMaximazing):
    if self.who_wins_for_sanal() == "-1":
        return -1

    elif self.who_wins_for_sanal() == "1":
        return 1

    elif self.who_wins_for_sanal() == "0":
        return 0

    if isMaximazing == 1:
        # Aİ CHOOİCE
        bestscore = -10
        for i in range(7):
            for j in range(7):

                if self.push_list[i][j].text() == "":
                    self.push_list[i][j].setText("O")
                    self.push_list[i][j].setEnabled(False)
                    score = self.minimax(isMaximazing=0)
                    self.push_list[i][j].setText("")
                    self.push_list[i][j].setEnabled(True)
                    print(bestscore, score)
                    if score > bestscore:
                        bestscore = score
        return bestscore

    if isMaximazing == 0:
        bestscore = 10

        for i in range(7):
            for j in range(7):
                if self.push_list[i][j].text() == "":
                    self.push_list[i][j].setText("X")
                    self.push_list[i][j].setEnabled(False)
                    score = self.minimax(isMaximazing=1)
                    self.push_list[i][j].setText("")
                    self.push_list[i][j].setEnabled(True)
                    print(bestscore, score)
                    if score < bestscore:
                        bestscore = score
        return bestscore

Iki tarafin da bestscore’larini tutup, asagi, recursive minimax fonksiyonuna paslayip siralari degistigi anda bakmayi birakabilirsin.

Minimizing oyuncunun skoru -1 ise maximizing oyuncu bundan daha yuksek bir degere gelemeyecektir, yani ne yapsa yapsin oyunu kaybedecektir. Bu noktada asagidaki 49 harekete ve onlarin alt hareketlerine bakmaya gerek yok, loop’u kirabiliriz.

Wikipedia makalesinde ornek kod da var.

2 Beğeni

Evet bestscore erken döndürmem sonuç verdi ama sadece kendi kazanamasına oynuyor mesela diyelimki 3 tane yan yana X var ve kendi hamlesinden 2 tane yan yana X i engellemek yerine kendi hanesine kazanması için bir tane daha ekliyor burda dediğin gibi yaparsak peki bilgisayarın oyuncuyu engellemesi için ne yapmam gerek çünkü sadece 4 tane yan yana dikine ve çapraz bir araya getirmeye çalışıyor

Bu son yazdigin bana mi? Hic bir sey anlamadim.

1 Beğeni

Kodu şöyle değiştirdim işe yaradı demek istediğim bu ve sadece bilgisayar kazanmak için oynuyor benim hamlelerimi engellemeye çalışmıyor

def minimax(self, isMaximazing):
    if self.who_wins_for_sanal() == "-1":
        return -1

    elif self.who_wins_for_sanal() == "1":
        return 1

    elif self.who_wins_for_sanal() == "0":
        return 0

    if isMaximazing == 1:
        # Aİ CHOOİCE
        bestscore = -1000
        for i in range(7):
            for j in range(7):
                if self.push_list[i][j].text() == "":
                    self.push_list[i][j].setText("O")
                    self.push_list[i][j].setEnabled(False)
                    score = self.minimax(isMaximazing=0)

                    self.push_list[i][j].setText("")
                    self.push_list[i][j].setEnabled(True)
                    if score > bestscore:
                        bestscore = score
                        return bestscore

    if isMaximazing == 0:
        bestscore = 1000

        for i in range(7):
            for j in range(7):
                if self.push_list[i][j].text() == "":
                    self.push_list[i][j].setText("X")
                    self.push_list[i][j].setEnabled(False)
                    score = self.minimax(isMaximazing=1)

                    self.push_list[i][j].setText("")
                    self.push_list[i][j].setEnabled(True)
                    if score < bestscore:
                        bestscore = score
                        return bestscore

alpha ile betayi nerede tutuyorsun?

onun için fonksiyon yazmıştım ama çalılmayınca sildim şuan elimde yok