Minimax ile tictactoe (xox)

Arkadaşlar minimaxı kullanarak bir xox oyunu yazdım. Genel olarak sıkıntı yok ama oyuna sol alt köşe ile başlayınca bilgisayar ortaya oynuyor. ben sağ üste oynuyorum bu sefer bilgisayar orta üste oynuyor. Kaybetmeyi engellemek için mecburen orta alta oynamam lazım ama orta alta oynayınca sıra bilgisayara geçmiyor. orta alt oynamak için “2” ye basıyorum. Başka şekilde oynayınca "2"ye basınca bu problem oluşmuyor. Bunun nedeni nedir sizce?

Çok uzun olduğu atmak istemedim ama isteyen için kodlar:

import sys

class Oyun():

    def __init__(self):

        print("Oyun Başlasın!\n")
        self.tahta()
        self.girdi()
        self.oyun()

    def tahta(self):

        self.s1 = ["-", "-", "-"]
        self.s2 = ["-", "-", "-"]
        self.s3 = ["-", "-", "-"]
        self.tablolar = [self.s1, self.s2, self.s3]

    def tahta_guncelle(self):

        print("""
        {} {} {}
        {} {} {}
        {} {} {}        
        """.format(self.s1[0], self.s1[1], self.s1[2], self.s2[0], self.s2[1], self.s2[2], self.s3[0], self.s3[1], self.s3[2]))

    def max(self):

        sonuc = self.bitti_mi()

        puanmax = -2

        i1 = None
        j1 = None

        if sonuc == "X":

            return -1, 0, 0

        elif sonuc == "O":

            return +1, 0, 0

        elif sonuc == "B":

            return 0, 0, 0

        for i in range(0, 3):

            for j in range(0, 3):

                if self.tablolar[i][j] == "-":

                    self.tablolar[i][j] = "O"

                    (m, mini, minj) = self.min()

                    if m > puanmax:

                        puanmax = m

                        i1 = i
                        j1 = j

                    self.tablolar[i][j] = "-"

        return (puanmax, i1, j1)

    def min(self):

        puanmin = 2

        i2 = None
        j2 = None

        sonuc = self.bitti_mi()

        if sonuc == "X":

            return -1, 0, 0

        elif sonuc == "O":

            return +1, 0, 0

        elif sonuc == "B":

            return 0, 0, 0

        for i in range(0, 3):

            for j in range(0, 3):

                if self.tablolar[i][j] == "-":

                    self.tablolar[i][j] = "X"

                    (m, maxi, maxj) = self.max()

                    if m < puanmin:

                        puanmin = m
                        i2 = i
                        j2 = j

                    self.tablolar[i][j] = "-"

        return (puanmin, i2, j2)

    def oyuncu(self, hamle):

        if hamle == "7":

            self.s1[0] = "X"
            self.tahta_guncelle()

        elif hamle == "8":

            self.s1[1] = "X"
            self.tahta_guncelle()

        elif hamle == "9":

            self.s1[2] = "X"
            self.tahta_guncelle()

        elif hamle == "4":

            self.s2[0] = "X"
            self.tahta_guncelle()

        elif hamle == "5":

            self.s2[1] = "X"
            self.tahta_guncelle()

        elif hamle == "6":

            self.s2[2] = "X"
            self.tahta_guncelle()

        elif hamle == "1":

            self.s3[0] = "X"
            self.tahta_guncelle()

        elif hamle == "2":

            self.s3[1] = "X"
            self.tahta_guncelle()

        elif hamle == "3":

            self.s3[2] = "X"
            self.tahta_guncelle()

    def kontrol(self, denetleyici):

        if denetleyici == "7":
            if self.s1[0] == "-":

                return True

            else:

                print("Hatalı hamle")
                self.oyun()

        elif denetleyici == "8":

            if self.s1[1] == "-":

                return True

            else:

                print("Hatalı hamle")
                self.oyun()

        elif denetleyici == "9":

            if self.s1[2] == "-":

                return True

            else:

                print("Hatalı hamle")
                self.oyun()

        elif denetleyici == "4":

            if self.s2[0] == "-":

                return True

            else:

                print("Hatalı hamle")
                self.oyun()

        elif denetleyici == "5":

            if self.s2[1] == "-":

                return True

            else:

                print("Hatalı hamle")
                self.oyun()

        elif denetleyici == "6":

            if self.s2[2] == "-":

                return True

            else:

                print("Hatalı hamle")
                self.oyun()

        elif denetleyici == "1":

            if self.s3[0] == "-":

                return True

            else:

                print("Hatalı hamle")
                self.oyun()

        elif denetleyici == "2":

            if self.s3[1] == "-":

                return True

            else:

                print("Hatalı hamle")
                self.oyun()

        elif denetleyici == "3":

            if self.s3[2] == "-":

                return True

            else:

                print("Hatalı hamle")
                self.oyun()

    def bitti_mi(self):

        #OYUNCU
        if self.s1[0] == self.s1[1] == self.s1[2] == "X" or self.s2[0] == self.s2[1] == self.s2[2] == "X" or self.s3[0] == self.s3[1] == self.s3[2] == "X":

            return "X"

        if self.s1[0] == self.s2[0] == self.s3[0] == "X" or self.s1[1] == self.s2[1] == self.s3[1] == "X" or self.s1[2] == self.s2[2] == self.s3[2] == "X":

            return "X"

        if self.s1[0] == self.s2[1] == self.s3[2] == "X" or self.s1[2] == self.s2[1] == self.s3[0] == "X":

            return "X"

        #BİLGİSAYAR
        if self.s1[0] == self.s1[1] == self.s1[2] == "O" or self.s2[0] == self.s2[1] == self.s2[2] == "O" or self.s3[0] == self.s3[1] == self.s3[2] == "O":

            return "O"

        if self.s1[0] == self.s2[0] == self.s3[0] == "O" or self.s1[1] == self.s2[1] == self.s3[1] == "O" or self.s1[2] == self.s2[2] == self.s3[2] == "O":

            return "O"

        if self.s1[0] == self.s2[1] == self.s3[2] == "O" or self.s1[2] == self.s2[1] == self.s3[0] == "O":

            return "O"

        for i in range (0, 3):

            for j in range(0, 3):

                if self.tablolar[i][j] == "-":

                    return None

        return "B"

    def oyun(self):

        self.tahta_guncelle()

        while True:

            if self.bitti_mi() != None:

                if self.bitti_mi() == "X":

                    print("Kazandınız :)")
                    sys.exit()

                elif self.bitti_mi() == "O":

                    print("Bilgisayar kazandı...")
                    sys.exit()

                elif self.bitti_mi() == "B":

                    print("Berabere :|")
                    sys.exit()

            hamle = input("Bir hamle giriniz: ")

            if hamle == "1":

                if self.kontrol("1") == True:

                    self.oyuncu("1")
                    self.bitti_mi()
                    i1 = 0
                    j1 = 0
                    m, i1, j1 = self.max()

                    a = self.bilgisayar_kontrolü(i1, j1)

                    if self.kontrol(a) == True:
                        self.tablolar[i1][j1] = "O"
                        self.tahta_guncelle()

            elif hamle == "2":

                if self.kontrol("2") == True:

                    self.oyuncu("2")
                    self.bitti_mi()
                    i1 = 0
                    j1 = 0
                    m, i1, j1 = self.max()

                    a = self.bilgisayar_kontrolü(i1, j1)

                    if self.kontrol(a) == True:
                        self.tablolar[i1][j1] = "O"
                        self.tahta_guncelle()

            elif hamle == "3":

                if self.kontrol("3") == True:

                    self.oyuncu("3")
                    self.bitti_mi()
                    i1 = 0
                    j1 = 0
                    m, i1, j1 = self.max()

                    a = self.bilgisayar_kontrolü(i1, j1)

                    if self.kontrol(a) == True:
                        self.tablolar[i1][j1] = "O"
                        self.tahta_guncelle()

            elif hamle == "4":

                if self.kontrol("4") == True:

                    self.oyuncu("4")
                    self.bitti_mi()
                    i1 = 0
                    j1 = 0
                    m, i1, j1 = self.max()

                    a = self.bilgisayar_kontrolü(i1, j1)

                    if self.kontrol(a) == True:
                        self.tablolar[i1][j1] = "O"
                        self.tahta_guncelle()

            elif hamle == "5":

                if self.kontrol("5") == True:

                    self.oyuncu("5")
                    self.bitti_mi()
                    i1 = 0
                    j1 = 0
                    m, i1, j1 = self.max()

                    a = self.bilgisayar_kontrolü(i1, j1)

                    if self.kontrol(a) == True:
                        self.tablolar[i1][j1] = "O"
                        self.tahta_guncelle()

            elif hamle == "6":

                if self.kontrol("6") == True:

                    self.oyuncu("6")
                    self.bitti_mi()
                    i1 = 0
                    j1 = 0
                    m, i1, j1 = self.max()

                    a = self.bilgisayar_kontrolü(i1, j1)

                    if self.kontrol(a) == True:
                        self.tablolar[i1][j1] = "O"
                        self.tahta_guncelle()

            elif hamle == "7":

                if self.kontrol("7") == True:

                    self.oyuncu("7")
                    self.bitti_mi()
                    i1 = 0
                    j1 = 0
                    m, i1, j1 = self.max()

                    a = self.bilgisayar_kontrolü(i1, j1)

                    if self.kontrol(a) == True:

                        self.tablolar[i1][j1] = "O"
                        self.tahta_guncelle()

            elif hamle == "8":

                if self.kontrol("8") == True:

                    self.oyuncu("8")
                    self.bitti_mi()
                    i1 = 0
                    j1 = 0
                    m, i1, j1 = self.max()

                    a = self.bilgisayar_kontrolü(i1, j1)

                    if self.kontrol(a) == True:
                        self.tablolar[i1][j1] = "O"
                        self.tahta_guncelle()

            elif hamle == "9":

                if self.kontrol("9") == True:

                    self.oyuncu("9")
                    self.bitti_mi()
                    i1 = 0
                    j1 = 0
                    m, i1, j1 = self.max()

                    a = self.bilgisayar_kontrolü(i1, j1)

                    if self.kontrol(a) == True:
                        self.tablolar[i1][j1] = "O"
                        self.tahta_guncelle()

            else:

                print("Hatalı sayı girdiniz...")

    def girdi(self):

        print("Nereye hamle yapmak istiyorsunuz: ")
        print("""
        '7' '8' '9'
        '4' '5' '6'
        '1' '2' '3'
        """)

    def bilgisayar_kontrolü(self, i1, j1):

        a = "0"

        if i1 == 0 and j1 == 0:

            a = "7"

            return a

        elif i1 == 0 and j1 == 1:

            a = "8"

            return a

        elif i1 == 0 and j1 == 2:

            a = "9"

            return a

        elif i1 == 1 and j1 == 0:

            a = "4"

            return a

        elif i1 == 1 and j1 == 1:

            a = "5"

            return a

        elif i1 == 1 and j1 == 2:

            a = "6"

            return a

        elif i1 == 2 and j1 == 0:

            a = "1"

            return a

        elif i1 == 2 and j1 == 1:

            a = "2"

            return a

        elif i1 == 2 and j1 == 3:

            a = "3"

            return a

xox = Oyun()
print(xox)

Şimdi fark ettim bir kaç farklı kombinasyonda da aynı sorun çıkıyor.

Sorunu düzelttiniz mi? Bir algoritma hatası var, minmax metotları koordinat değil sadece skor döndürmelidir. Oynanacak koordinatı, ayrı bir metot içerisinde tek tek koordinatları test edip en yüksek skorlu olanı seçerek belirlemelisiniz.

1 Beğeni

Soyun hallettim ama i1, j1 dediğim -1, 0 ya da 1 olan için koordinatlar. ve return ettiğim +1 değeri oynanıyor