Bu kodları kısaltmak mümkün mü?

Burada PyQt5 üzerinde gördüğünüz minimax algoritmasının ufak bir bölümünü görüyorsunuz.
Bunları bu şekilde yazmaya devam edersem fazlasıyla uzayacak. Minimax algoritması da böyle uzun aslında ama bir kısaltma yolu vardır belki diye sormak istiyorum.
Bu kodları kısaltmak mümkün mü ?

self.timer = QTimer
# table of blocks
        self.blocks = [
            [self.left_top_block, self.top_middle_block, self.top_right_block],          # row 1
            [self.middle_left_block, self.middle_middle_block, self.middle_right_block], # row 2
            [self.bot_left_block, self.bot_middle_block, self.bot_right_block]           # row 3
        ]




def Artificial_Intelligence(self):
        
        # If the User Puts "X" in blocks[0][0] (left top block)
        if (
            self.blocks[0][0].text() == "X" and self.blocks[0][1].text() == "" and self.blocks[0][2].text() == "" and 
            self.blocks[1][0].text() == ""  and self.blocks[1][1].text() == "" and self.blocks[1][2].text() == "" and 
            self.blocks[2][0].text() == ""  and self.blocks[2][1].text() == "" and self.blocks[2][2].text() == ""
        ):
            
            random_assignments = ["2","3","4","5","6","7","8","9"] # No "1"
            random_assignment = random.choice(random_assignments)
           
            
            if random_assignment == "2":
                self.timer.singleShot(300, lambda: self.blocks[0][1].setText("O"))
                
            elif random_assignment == "3":
                self.timer.singleShot(300, lambda:self.blocks[0][2].setText("O"))
                
            elif random_assignment == "4":
                self.timer.singleShot(300, lambda:self.blocks[1][0].setText("O"))
                
            elif random_assignment == "5":
                self.timer.singleShot(300, lambda:self.blocks[1][1].setText("O"))
            
            elif random_assignment == "6":
                self.timer.singleShot(300, lambda:self.blocks[1][2].setText("O"))
                
            elif random_assignment == "7":
                self.timer.singleShot(300, lambda:self.blocks[2][0].setText("O"))
                
            elif random_assignment == "8":
                self.timer.singleShot(300, lambda:self.blocks[2][1].setText("O"))
                
            elif random_assignment == "9":
                self.timer.singleShot(300, lambda:self.blocks[2][2].setText("O"))
          
            
        # If the User Puts "X" in blocks[0][1] (top middle block)    
        elif (
            self.blocks[0][0].text() == "" and self.blocks[0][1].text() == "X" and self.blocks[0][2].text() == "" and 
            self.blocks[1][0].text() == "" and self.blocks[1][1].text() == ""  and self.blocks[1][2].text() == "" and 
            self.blocks[2][0].text() == "" and self.blocks[2][1].text() == ""  and self.blocks[2][2].text() == ""
        ):
            random_assignments = ["1","3","4","5","6","7","8","9"] # No "2"
            random_assignment = random.choice(random_assignments)
           
            
            if random_assignment == "1":
                self.timer.singleShot(300, lambda: self.blocks[0][1].setText("O"))
                
            elif random_assignment == "3":
                self.timer.singleShot(300, lambda:self.blocks[0][2].setText("O"))
                
            elif random_assignment == "4":
                self.timer.singleShot(300, lambda:self.blocks[1][0].setText("O"))
                
            elif random_assignment == "5":
                self.timer.singleShot(300, lambda:self.blocks[1][1].setText("O"))
            
            elif random_assignment == "6":
                self.timer.singleShot(300, lambda:self.blocks[1][2].setText("O"))
                
            elif random_assignment == "7":
                self.timer.singleShot(300, lambda:self.blocks[2][0].setText("O"))
                
            elif random_assignment == "8":
                self.timer.singleShot(300, lambda:self.blocks[2][1].setText("O"))
                
            elif random_assignment == "9":
                self.timer.singleShot(300, lambda:self.blocks[2][2].setText("O"))
                
                
        # If the User Puts "X" in blocks[0][2] (top right block)    
        elif (
            self.blocks[0][0].text() == "" and self.blocks[0][1].text() == "" and self.blocks[0][2].text() == "X" and 
            self.blocks[1][0].text() == "" and self.blocks[1][1].text() == ""  and self.blocks[1][2].text() == "" and 
            self.blocks[2][0].text() == "" and self.blocks[2][1].text() == ""  and self.blocks[2][2].text() == ""
        ):
            random_assignments = ["1","2","4","5","6","7","8","9"] # no "3"
            random_assignment = random.choice(random_assignments)
           
            
            if random_assignment == "1":
                self.timer.singleShot(300, lambda: self.blocks[0][1].setText("O"))
                
            elif random_assignment == "2":
                self.timer.singleShot(300, lambda:self.blocks[0][2].setText("O"))
                
            elif random_assignment == "4":
                self.timer.singleShot(300, lambda:self.blocks[1][0].setText("O"))
                
            elif random_assignment == "5":
                self.timer.singleShot(300, lambda:self.blocks[1][1].setText("O"))
            
            elif random_assignment == "6":
                self.timer.singleShot(300, lambda:self.blocks[1][2].setText("O"))
                
            elif random_assignment == "7":
                self.timer.singleShot(300, lambda:self.blocks[2][0].setText("O"))
                
            elif random_assignment == "8":
                self.timer.singleShot(300, lambda:self.blocks[2][1].setText("O"))
                
            elif random_assignment == "9":
                self.timer.singleShot(300, lambda:self.blocks[2][2].setText("O"))

Minimax algoritmasi baya kisa. Herhangi bir kitabi acip bakarsan 5-10 satirda yazildigini gorebilirsin.

Burada tic-tac-toe oyununa uygulanmis halinin acilmis versiyonunun—yok, neye baktigimi bilemedim. Rastgelelik niye var?

Zafere götüren bir hamle olmadıkça rastgele seçim yaptırtılıyor (başlangıç aşamasındayız).
Minimax’in de mantığı kısa buna katılırım ancak xox oyunundaki mantığına değil işleyişine bakarsak o kadar da kısa olduğunu düşünmüyorum. Her ama her hamle düşünülüyor.

Merhaba hocam. Ben kısa zaman önce Django ile denemesine yaptığım online XOX oyununda bilgisayara karşı oynama için minmax algoritmasını kullanmıştım. Buradan inceleyebilirsiniz. Minmax algoritmasını 135-190 satırları arasında görebilirsiniz.

Kodlarda hiç bir rastgelelik yok. Hamlelerin skoruna bakarak, hangisi yüksek ise onu seçiyorsunuz zaten, ya da rakibin hamlesini seçerken düşük olanı seçiyorsunuz. Kendimiz için hamle seçerken yüksek bir hamle seçiyoruz. Eğer sonraki hamleler ondan yüksek değilse veya eşitse o hamleyi değiştirmiyorsunuz. Seçilen hamle ya beraberliğe ya da zafere götürüyordur zaten.

1 Beğeni

PyQt5’de işin boyutu farklı. Oluşturulan lineEdit’lerin “textchanged” için yaydığı sinyal yakalanıp fonksiyonları yazılıyor. Bu fonksiyonlar kutucuklardaki yazıları kontrol ediyor. Kullanıcı X’i oynuyor. lineEdit’lere tıklayarak kutucuklara X koyuyor. Bu kadar kısa olmaz yani.

Algoritmanın kendisi kısa, ama oyunu tasarlarken yazacağınız kodlar elbette uzun olacak. Ben de zaten Javascipt ile oyunun kendisini tasarlarken epey kod yazdım ama o kısımların minmax algoritması ile alakası yok tabi.

1 Beğeni

Ve ayrıca sizin kodlarınızı şu şekilde kısaltabiliriz. Sadece ilk if koşulu için yaptım, diğerlerini de bu mantıkla yapabilirsiniz.

self.coordinates = {
    "1":self.blocks[0][0],
    "2":self.blocks[0][1],
    "3":self.blocks[0][2],
    "4":self.blocks[1][0],
    "5":self.blocks[1][1],
    "6":self.blocks[1][2],
    "7":self.blocks[2][0],
    "8":self.blocks[2][1],
    "9":self.blocks[2][2]
}

def Artificial_Intelligence(self):
        
        # If the User Puts "X" in blocks[0][0] (left top block)
        if (
            self.blocks[0][0].text() == "X" and self.blocks[0][1].text() == "" and self.blocks[0][2].text() == "" and 
            self.blocks[1][0].text() == ""  and self.blocks[1][1].text() == "" and self.blocks[1][2].text() == "" and 
            self.blocks[2][0].text() == ""  and self.blocks[2][1].text() == "" and self.blocks[2][2].text() == ""
        ):
            
            random_assignments = ["2","3","4","5","6","7","8","9"] # No "1"
            random_assignment = random.choice(random_assignments)
            self.timer.singleShot(300, lambda: self.coordinates[random_assignment].setText("O"))
1 Beğeni