2016-12-12 11 views
4

最高の移動とスコアを見つけようとしています。私はゲームのスコアを正しく返すプログラムを手に入れましたが、動きを返すようにしたいと思います。これを行うようにコードを変更するにはどうすればよいですか? thisおよびthisと同様です。私の失敗したコードhereを参照してください。ゲームが終了した場合にはNoneが返され、代わりに移動する必要があります。アルファベットを使用して最良の動きを見つける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を、あなたは私が15年前です。無敵のTic Tac Toeゲームを開発することは、私のプログラミングのゲートウェイ薬物でした。私は決してうまく動作しない、読めないif..thenステートメントの素晴らしい木を思い出すようです。わかりやすいコードの重要性に関する私の最初の教訓でした。編集:ああ待って、アルファベータ剪定?決して気にしないでください – CivFan

+0

笑! 2年前、高校に来年来ました! :) – PAS

答えて

2

あなたは、これまでのような何か最高の動きを追跡することができます。他のケースについて

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 

と同様の

+0

はい、しかし、私がスコアを返そうとするとき、best_moveは 'game_state.is_gameover()'とペアになっていますが、まだ定義されていません。 – PAS

+0

「なし」と定義されています。 – Julien