mooseman55 Ответов: 0

Дерево игроков в крестики-нолики не работает


Я пытаюсь разработать программу, которая создает случайных игроков в крестики-нолики, которые все двигаются случайным образом в зависимости от того, что делает другой игрок. Для этого я хочу сохранить все возможные исходы доски и ход игрока в зависимости от каждого сенарио, но я не верю, что мое дерево реализовано или правильно хранит данные.


Вот мой код:


import random
    import time
        
    class player:
        def __init__(self):
            self.firstMoveGen = None
            self.secondMoveGen = []
            self.numOfWins = 0
            self.genome = []
            
        def createNewGenome(self):
            self.firstMoveGen = createGene([], None, self)
            print("\n")
            for i in range(9):
                self.secondMoveGen.append(createGene([i], i, self))
                print("\n")
            print("---------END GENOME----------\n\n")
            
    class gene:
        def __init__(self):
            self.move = None
            self.lastPlayed = None
            self.children = []
            
        def addChild(self, child):
            self.children.append(child)
        
        def printNumChildren(self):
                print(" ch:" + str(len(self.children)) + "  ", end = "")
            
    allMoves = [0,1,2,3,4,5,6,7,8]

    def createGene(takenMoves, lastPlayed, player):
        if len(takenMoves) != 9:
            # make ne gene
            newGene = gene()
            # input the last enemy move to be made
            newGene.lastPlayed = lastPlayed
            # find all moves left
            possibleMoves = list(set(allMoves).symmetric_difference(set(takenMoves)))
            # pick a random move from the ones left
            picker = random.randrange(0, len(possibleMoves))
            newGene.move = possibleMoves[picker]
            print(newGene.move, end="")
            player.genome.append(newGene.move)
            # take currently picked move out of possiblilities
            possibleMoves.pop(picker)
            
            savedMoves = list(possibleMoves)
            for enemyMove in possibleMoves:
                # delete the move the next player takes
                possibleMoves.remove(enemyMove)
                # pass on to the next gene all the taken moves
                newGene.addChild(createGene(list(set(allMoves).symmetric_difference(set(possibleMoves))), enemyMove, player))
                # add the move the next player takes back
                possibleMoves = list(savedMoves)
                
            return newGene


Что я уже пробовал:

Возможно, я неправильно рассчитал, но я считаю, что в конечном итоге каждый "геном игрока" должен содержать 652 хода. Однако, когда я запускаю свою программу, они содержат 964.

0 Ответов