Дерево игроков в крестики-нолики не работает
Я пытаюсь разработать программу, которая создает случайных игроков в крестики-нолики, которые все двигаются случайным образом в зависимости от того, что делает другой игрок. Для этого я хочу сохранить все возможные исходы доски и ход игрока в зависимости от каждого сенарио, но я не верю, что мое дерево реализовано или правильно хранит данные.
Вот мой код:
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.