2016-12-12 1 views
4

Essayer de trouver le meilleur coup ainsi que le score. J'ai obtenu mon programme pour retourner correctement le score du jeu, mais je veux qu'il retourne aussi le mouvement. Comment puis-je changer mon code pour qu'il le fasse? Semblable à this et this. Voir mon code échoué here, le None retourné si le jeu est terminé devrait être le déménagement à la place.trouver le meilleur coup en utilisant l'alphabet TicTacToe

def alphabeta(game_state, alpha, beta, our_turn=True): 
    if game_state.is_gameover(): 
     return game_state.score() 
    if our_turn: 
     score = -9999 
     for move in game_state.get_possible_moves(): 
      child = game_state.get_next_state(move, True) 
      temp_max = alphabeta(child, alpha, beta, False) 
      if temp_max > score: 
       score = temp_max 
      alpha = max(alpha, score) 
      if beta <= alpha: 
       break 
     return score 
    else: 
     score = 9999 
     for move in game_state.get_possible_moves(): 
      child = game_state.get_next_state(move, False) 
      temp_min = alphabeta(child, alpha, beta, True) 
      if temp_min < score: 
       score = temp_min 
      beta = min(beta, score) 
      if beta <= alpha: 
       break 
     return score 
+0

shnikes Saint, tu es moi il y a 15 ans. Développer un jeu imbattable de Tic Tac Toe était ma drogue de passage dans la programmation. Je me souviens d'un arbre fantastique d'illisibles si ... alors que je n'ai jamais vraiment travaillé. C'était ma première leçon sur l'importance du code lisible. EDIT: Oh, attendez, alpha-bêta-taille? Peu importe, vous êtes en avance sur l'endroit où j'étais. – CivFan

+0

Lol! Entré il ya 2 ans, l'école secondaire l'année prochaine! :) – PAS

Répondre

2

Vous pouvez garder une trace de meilleur mouvement à ce jour, quelque chose comme:

if game_state.is_gameover(): 
     return game_state.score(), None 
    if our_turn: 
     score = -9999 
     for move in game_state.get_possible_moves(): 
      child = game_state.get_next_state(move, True) 
      temp_max, _ = alphabeta(child, alpha, beta, False) # _ to disregard the returned move 
      if temp_max > score: 
       score = temp_max 
       best_move = move 
      alpha = max(alpha, score) 
      if beta <= alpha: 
       break 
     return score, best_move 

et similaire pour les autres cas

+0

Oui, mais quand je veux retourner le score, best_move paire si 'game_state.is_gameover()', il n'est pas encore défini. – PAS

+0

Défini comme "Aucun" – Julien