diff --git a/classes_base/Jogador.py b/classes_base/Jogador.py index 9c880f1..8955405 100644 --- a/classes_base/Jogador.py +++ b/classes_base/Jogador.py @@ -290,20 +290,32 @@ def jogarMCTS(self, mesa, oponente): oponente.setaVez(True) print("J" + str(self.__ind) + " passou a vez.") return + + estadoAtual = EstadoMCTS(self, oponente, mesa) noTeste = MonteCarloNo(estadoAtual) noTeste.expandir() - print(noTeste) - noTeste.melhorFilho() - escolhida = int(input("Qual peça deseja jogar? ")) - if (len(mesa.pegaTabuleiro()) != 0): pos = int(input("Em que posição?(0 p/ esquerda, 1 p/ direita) ")) - else: pos = 0 - peca = self.__mao.pop(escolhida - 1) - adicionou = mesa.adicionarNaMesa(peca, pos) - if (not adicionou): self.__mao.append(peca) + for i in range(100): + melhorfilho=noTeste.melhorFilho() + noTeste.gerarJogo(melhorfilho,False) + #print("\nMelhor filho:" +str(noTeste.melhorFilho())) + print("Gerou o jogo numero:"+ str(i)+"\n") + #print(noTeste) + #noTeste.melhorFilho() + adicionou=True + + # + #escolhida = int(input("Qual peça deseja jogar? ")) + #if (len(mesa.pegaTabuleiro()) != 0): pos = int(input("Em que posição?(0 p/ esquerda, 1 p/ direita) ")) + #else: pos = 0 + #peca = self.__mao.pop(escolhida - 1) + melhorfilho=noTeste.melhorFilho() + self.removePeca(mesa,melhorfilho.estado.ultimaPecaJogada) + adicionou = mesa.adicionarNaMesa(melhorfilho.estado.ultimaPecaJogada, melhorfilho.estado.onde) + if (not adicionou): self.__mao.append(melhorfilho.estado.ultimaPecaJogada) else: self.setaJogou(True) self.__maoJogaveis = [] - peca.ordem(len(mesa.pegaTabuleiro())) + melhorfilho.estado.ultimaPecaJogada.ordem(len(mesa.pegaTabuleiro())) self.setaVez(False) oponente.setaVez(True) return @@ -314,13 +326,13 @@ def jogarRandom(self, mesa, oponente): self.atualizaPecasJogaveis(mesa) # Caso não existam peças jogáveis em sua mão, executa a compra de peças enquanto for possível. if (len(self.pegaPecasJogaveis()) == 0): self.compraDaMesa(mesa) - print("\n" + str(mesa)) - print("\n" + self.pecasJogaveis(mesa, self.__mao)) - print(self) + #print("\n" + str(mesa)) + #print("\n" + self.pecasJogaveis(mesa, self.__mao)) + #print(self) if (len(self.pegaPecasJogaveis()) == 0): #mesa.fechada = True self.setaJogou(False) - print("J" + str(self.__ind) + " passou a vez.") + #print("J" + str(self.__ind) + " passou a vez.") else: possibilidades = self.possibilidadesJogaveis(mesa) escolhida = random.randint(0, len(possibilidades) - 1) diff --git a/classes_base/__pycache__/Jogador.cpython-36.pyc b/classes_base/__pycache__/Jogador.cpython-36.pyc index 189c739..e6a284c 100644 Binary files a/classes_base/__pycache__/Jogador.cpython-36.pyc and b/classes_base/__pycache__/Jogador.cpython-36.pyc differ diff --git a/classes_busca/EstadoMCTS.py b/classes_busca/EstadoMCTS.py index 4baeaec..71b9bd1 100644 --- a/classes_busca/EstadoMCTS.py +++ b/classes_busca/EstadoMCTS.py @@ -16,6 +16,7 @@ def __init__(self, jogador, oponente, mesa): self.qtdPecasOponente = len(self.oponente.pecas()) self.probabilidade = 0 self.ultimaPecaJogada = None + self.onde=None def __str__(self): resp="" @@ -29,31 +30,31 @@ def comparar(self,estado2): for peca in self.jogador.pecas(): achou=False for peca2 in estado2.jogador.pecas(): - if peca.igual(peca2): + if peca==peca2: achou=True break if achou==False: return False for peca in self.oponente.pecas(): igual=False for peca2 in estado2.oponente.pecas(): - if peca.igual(peca2): + if peca==peca2: igual=True break if igual==False: return False onde=0 for pecaTab in self.mesa.pegaTabuleiro(): pecaTab2=estado2.mesa.pegaTabuleiro()[onde] - if not pecaTab.igual(pecaTab2): return False + if not pecaTab==pecaTab2: return False onde+=1 return True #Indica se um estado terminal foi atingido def ehEstadoFinal(self): - print("----Teste no ehEstadoFinal()") - print(self) - print("Jogador:" + str(self.jogador.jogouRodada())) - print("Oponente:" + str(self.oponente.jogouRodada())) - print("--------Fim do teste -------\n") + #print("----Teste no ehEstadoFinal()") + #print(self) + #print("Jogador:" + str(self.jogador.jogouRodada())) + #print("Oponente:" + str(self.oponente.jogouRodada())) + #print("--------Fim do teste -------\n") if (not self.jogador.jogouRodada() and not self.oponente.jogouRodada() and len(self.mesa.pegaPecasAComprar())==0) \ or (len(self.jogador.pecas())==0 or len(self.oponente.pecas())==0) : return True diff --git a/classes_busca/MonteCarloNo.py b/classes_busca/MonteCarloNo.py index e617b54..9198d2a 100644 --- a/classes_busca/MonteCarloNo.py +++ b/classes_busca/MonteCarloNo.py @@ -36,13 +36,22 @@ def expandir(self): if (adicionou): novoNo.simular() self.filhos.append(novoNo) + novoNo.estado.ultimaPecaJogada=peca + onde=i #funcao para escolher o melhor filho usando o valor do UCT def melhorFilho(self): + melhor=None for i in self.filhos: i.UCT = i.vitorias / i.visitas + 1.4 * math.sqrt(math.log(self.visitas) / i.visitas) - print(i.UCT) - return max(p.UCT for p in self.filhos) + if melhor!=None: + if i.UCT>melhor.UCT: + melhor=i + else: + melhor=i + print("Melhor filho:" + str(melhor)) + return melhor + def foiTotalmenteExpandido(self): @@ -70,6 +79,7 @@ def gerarJogo(self,no,difSimulacao): #difSimulacao variavel para saber se uma si return self.backPropagation(no,0,1) return + novoEstado=copy.deepcopy(no.estado) #Escolhe o jogador da vez e simula uma jogada if novoEstado.jogador.ehSuaVez(): diff --git a/classes_busca/__pycache__/EstadoMCTS.cpython-36.pyc b/classes_busca/__pycache__/EstadoMCTS.cpython-36.pyc index f3aba60..86244d7 100644 Binary files a/classes_busca/__pycache__/EstadoMCTS.cpython-36.pyc and b/classes_busca/__pycache__/EstadoMCTS.cpython-36.pyc differ diff --git a/classes_busca/__pycache__/MonteCarloNo.cpython-36.pyc b/classes_busca/__pycache__/MonteCarloNo.cpython-36.pyc index b9fd738..28d4892 100644 Binary files a/classes_busca/__pycache__/MonteCarloNo.cpython-36.pyc and b/classes_busca/__pycache__/MonteCarloNo.cpython-36.pyc differ