2012-03-30 3 views
0

アルファベータ版のReversiゲームをビルドしています。私はアルファベータ版であなたの助けが必要です。 問題は、コンピュータがボードの下側にある四角形の1つを選択し続けることです。私はコンピュータの可能な移動のリストを持っています(下のコードで見ることができます)。つまり、コンピュータがほぼ常にそのリストの最後の移動の1つを選択しています。。私の評価機能は簡単です:黒い部分から白い部分を引いたものです。 BTW:深さ= 1でうまく動作しますが、深さ= 3で動作する必要があります。アルファベータプルーニング

public int AlphaBeta(int depth,int turn,TreeNode root,int alpha,int beta) 
{ 
    if(depth==0) 
     return evaluationFunc(turn,turns,root.board,root); 
    else 
    { 
     buildSons(turn,root); 
     TreeNode head = generateList(root.sons); 
     return executeCheckTheSons2(depth,turn,head,alpha,beta); 
    } 
} 

public int executeCheckTheSons2(int depth,int turn,TreeNode head,int alpha,int beta) 
    { 
     int score; 
     if(turn==1) 
     { 
      while(head!=null) 
      { 
       head.board=simulateTheMove(head.board,head.getX(),head.getY(),turn); 
       score=AlphaBeta(depth-1,turn*-1,head,alpha,beta); 
       if(score > alpha) 
       { 
        alpha=score; 
        setMove(head); 
       } 
       if(alpha >= beta) 
        return alpha; 
       head=head.next; 
      } 
       return alpha; 
     } 
     else 
     { 
      while(head!=null) 
      { 
       head.board=simulateTheMove(head.board,head.getX(),head.getY(),turn); 
       score=AlphaBeta(depth-1,turn*-1,head,alpha,beta); 
       if(score<beta) 
       { 
        beta=score; 
        setMove(head); 
       } 
       if(alpha >= beta) 
        return beta; 
       head=head.next; 
      } 
      return beta; 
     }  
    } 

    public void setMove(TreeNode root) 
    { 
     while(root.father.father!=null) 
      root=root.father; 
     pnt.setX(root.getX()); 
     pnt.setY(root.getY()); 
    } 

答えて

0

私は、エラーがsetMove機能であると思います。これは、最終座標を設定してピースを設定する関数だと思います。現時点では、たとえこのブランチからの結果が世界的に最良の結果ではないとしても、ツリーのあらゆる深さに対してこれを呼び出すことになります。

たとえば、最後の可能な移動を取り除いているとします。あなたはdepth = 3で始まり、depth=2のために再帰的に呼び出します。 executeCheckTheSons2に入力すると、スコア0から開始し、可能な移動を評価します。これらの移動の1つがおそらく0より大きいスコアを与えるので、setMove(head)と呼び出し、座標を最後の移動に移動するように設定します。関数から戻ってくると、この深度のスコアをスコアに記録しますが、全体的に見ればそれほど大きな動きではありません。しかし、setMoveの最後の呼び出しはまだ有効なので、その後は変更しないでください。

このコールをexecuteCheckTheSons2から移動して、いくつかの上位レイヤーの機能で移動する必要があります。あるいは、x座標とy座標をexecuteCheckTheSons2関数のローカル変数に記録してから、setMoveを呼び出してから、関数から戻ることができます。

この質問があなたに役立つ場合は、これを回答として受け入れてください。