def selecionaMelhorJogada(self, tabuleiro, numeroDaJogada): tabuleiroEscolhido = None jogadaForcada = False gerenciadorDeTabuleiros = GerenciadorDeTabuleiros(tabuleiro) listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMultiplasComidas( ) if (not listaTabuleiros or listaTabuleiros is None): listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMovimentoNormal( ) elif (len(listaTabuleiros) < self.numeroDePossiveisComidasParaNaoConsiderarJogadaForcada): jogadaForcada = True maxScore = -9999999999 numeroDaProximaJogada = numeroDaJogada if (not jogadaForcada): numeroDaProximaJogada += 1 for tabuleiro in listaTabuleiros: if (not tabuleiro is None): score = (self.predict( tabuleiro.converteTabuleiroParaArray(self.valorDama)) + self.calculaScoreTabuleiro( tabuleiro, numeroDaProximaJogada)) / 2.0 if (score > maxScore and numeroDaJogada == 0): # print ("SCORE MAIOR: " + str(score)) # tabuleiro.printaTabuleiro () maxScore = score tabuleiroEscolhido = copy.deepcopy(tabuleiro) return tabuleiroEscolhido
def calculaScoreTabuleiro(self, tabuleiro, numeroDaJogada): if (numeroDaJogada == self.numeroJogadasAFrente): return 0.0 jogadaForcada = False gerenciadorDeTabuleiros = GerenciadorDeTabuleiros(tabuleiro) listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMultiplasComidas( ) if (not listaTabuleiros or listaTabuleiros is None): listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMovimentoNormal( ) elif (len(listaTabuleiros) < self.numeroDePossiveisComidasParaNaoConsiderarJogadaForcada): jogadaForcada = True maxScore = -9999999999 numeroDaProximaJogada = numeroDaJogada if (not jogadaForcada): numeroDaProximaJogada += 1 for tabuleiro in listaTabuleiros: if (not tabuleiro is None): score = (self.predict( tabuleiro.converteTabuleiroParaArray(self.valorDama)) + self.calculaScoreTabuleiro( tabuleiro, numeroDaProximaJogada)) / 2.0 if (score > maxScore and numeroDaJogada == 0): maxScore = score return maxScore
def selecionaMelhorJogadaMinMax(self, tabuleiro, numeroDaJogada): tabuleiroEscolhido = None jogadaForcada = False gerenciadorDeTabuleiros = GerenciadorDeTabuleiros(tabuleiro) listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMultiplasComidas( ) if (not listaTabuleiros or listaTabuleiros is None): listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMovimentoNormal( ) elif (len(listaTabuleiros) < self.numeroDePossiveisComidasParaNaoConsiderarJogadaForcada): jogadaForcada = True alpha = -9999999999 beta = 9999999999 numeroDaProximaJogada = numeroDaJogada if (not jogadaForcada): numeroDaProximaJogada += 1 tabuleiroEscolhido = None for tabuleiro in listaTabuleiros: if (not tabuleiro is None): # score = self.calculaScoreTabuleiroMinMax (copy.deepcopy(tabuleiro), numeroDaProximaJogada, False, alpha, beta) score = self.calculaScoreTabuleiroMedia( copy.deepcopy(tabuleiro), numeroDaProximaJogada, False) if (score >= alpha and numeroDaJogada == 0): alpha = score tabuleiroEscolhido = copy.deepcopy(tabuleiro) if (self.debug): print("Tabuleiro Selecionado por score: " + str(score)) print("Tabuleiro:") tabuleiroEscolhido.printaTabuleiro() return tabuleiroEscolhido
@author: nocera """ from tabuleiro import Tabuleiro from gerenciadorDeTabuleiros import GerenciadorDeTabuleiros from variaveisGlobais import VariaveisGlobais # Tester calcula Movimentos possiveis # TESTE 1 print("Comecando teste 1:") print("Tabuleiro inicial teste 1:") tabuleiro = Tabuleiro(VariaveisGlobais.TABULEIRO_TESTE_7) tabuleiro.printaTabuleiro() gerenciadorDeTabuleiros = GerenciadorDeTabuleiros(tabuleiro) listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMultiplasComidas( ) if (not listaTabuleiros or listaTabuleiros is None): listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMovimentoNormal( ) print("Printando tabuleiros possiveis:") if (not listaTabuleiros is None and len(listaTabuleiros) > 0): for tabuleiro in listaTabuleiros: if (not tabuleiro is None): tabuleiro.printaTabuleiro() else: print("Nao existem movimentos!!") print("")
def calculaScoreTabuleiroMedia(self, tabuleiro, numeroDaJogada, jogadorJogando): if (numeroDaJogada >= self.numeroJogadasAFrente): if (jogadorJogando): tabuleiro.inverteVisaoTabuleiro() score = self.predict( tabuleiro.converteTabuleiroParaArray(self.valorDama)) gerenciadorDeTabuleiros = GerenciadorDeTabuleiros(tabuleiro) listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMultiplasComidas( ) if (not listaTabuleiros or listaTabuleiros is None): listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMovimentoNormal( ) if (len(listaTabuleiros) == 0 or listaTabuleiros is None): score = -1.1 return score else: score = self.predict( tabuleiro.converteTabuleiroParaArray(self.valorDama)) tabuleiro.inverteVisaoTabuleiro() gerenciadorDeTabuleiros = GerenciadorDeTabuleiros(tabuleiro) listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMultiplasComidas( ) if (not listaTabuleiros or listaTabuleiros is None): listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMovimentoNormal( ) if (len(listaTabuleiros) == 0 or listaTabuleiros is None): score = 1.1 return score tabuleiro.inverteVisaoTabuleiro() jogadaForcada = False gerenciadorDeTabuleiros = GerenciadorDeTabuleiros(tabuleiro) listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMultiplasComidas( ) if (not listaTabuleiros or listaTabuleiros is None): listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMovimentoNormal( ) elif (len(listaTabuleiros) < self.numeroDePossiveisComidasParaNaoConsiderarJogadaForcada): jogadaForcada = True numeroDaProximaJogada = numeroDaJogada numeroDaProximaJogada += 1 # if (not jogadaForcada): # numeroDaProximaJogada += 1 if (len(listaTabuleiros) == 0): if (jogadorJogando): return -1 else: return 1 soma = 0 for tabuleiro in listaTabuleiros: if (not tabuleiro is None): if (jogadorJogando): soma += self.calculaScoreTabuleiroMedia( copy.deepcopy(tabuleiro), copy.deepcopy(numeroDaProximaJogada), False) else: soma += self.calculaScoreTabuleiroMedia( copy.deepcopy(tabuleiro), copy.deepcopy(numeroDaProximaJogada), True) return soma / len(listaTabuleiros)
def calculaScoreTabuleiroMinMax(self, tabuleiro, numeroDaJogada, jogadorJogando, alpha, beta): if (numeroDaJogada >= self.numeroJogadasAFrente): if (jogadorJogando): tabuleiro.inverteVisaoTabuleiro() score = self.predict( tabuleiro.converteTabuleiroParaArray(self.valorDama)) gerenciadorDeTabuleiros = GerenciadorDeTabuleiros(tabuleiro) listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMultiplasComidas( ) if (not listaTabuleiros or listaTabuleiros is None): listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMovimentoNormal( ) if (len(listaTabuleiros) == 0 or listaTabuleiros is None): score = -1.1 return score else: score = self.predict( tabuleiro.converteTabuleiroParaArray(self.valorDama)) tabuleiro.inverteVisaoTabuleiro() gerenciadorDeTabuleiros = GerenciadorDeTabuleiros(tabuleiro) listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMultiplasComidas( ) if (not listaTabuleiros or listaTabuleiros is None): listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMovimentoNormal( ) if (len(listaTabuleiros) == 0 or listaTabuleiros is None): score = 1.1 return score tabuleiro.inverteVisaoTabuleiro() jogadaForcada = False gerenciadorDeTabuleiros = GerenciadorDeTabuleiros(tabuleiro) listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMultiplasComidas( ) if (not listaTabuleiros or listaTabuleiros is None): listaTabuleiros = gerenciadorDeTabuleiros.calculaPossibilidadesDeMovimentoNormal( ) elif (len(listaTabuleiros) < self.numeroDePossiveisComidasParaNaoConsiderarJogadaForcada): jogadaForcada = True numeroDaProximaJogada = numeroDaJogada if (not jogadaForcada): numeroDaProximaJogada += 1 if (jogadorJogando): best = -9999999999 else: best = 9999999999 if (len(listaTabuleiros) == 0): if (jogadorJogando): return -1 else: return 1 for tabuleiro in listaTabuleiros: if (not tabuleiro is None): if (jogadorJogando): best = max( best, self.calculaScoreTabuleiroMinMax( copy.deepcopy(tabuleiro), copy.deepcopy(numeroDaProximaJogada), False, copy.deepcopy(alpha), copy.deepcopy(beta))) alpha = max(alpha, best) if (beta <= alpha): break else: best = min( best, self.calculaScoreTabuleiroMinMax( copy.deepcopy(tabuleiro), copy.deepcopy(numeroDaProximaJogada), True, copy.deepcopy(alpha), copy.deepcopy(beta))) beta = min(beta, best) if (beta <= alpha): break return best