2012-03-30 2 views
0

알파 베타가있는 Reversi 게임을 제작하고 있는데 알파 베타에 도움이 필요합니다. 문제는 컴퓨터가 보드의 아래쪽에있는 사각형 중 하나를 계속 선택한다는 것입니다. 컴퓨터가 가능한 동작 목록을 가지고 있습니다 (아래 코드에서 볼 수 있듯이). 컴퓨터가 거의 항상 해당 목록의 마지막 동작 중 하나 또는 마지막 동작을 선택하고 있습니다. 이 아니더라도. 내 평가 기능은 간단합니다 : 검은 조각에서 흰색 조각 ​​빼기. 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으로 시작되고 가능한 동작을 평가합니다. 이 이동 중 하나는 아마도 0보다 큰 점수를 줄 것이므로 setMove(head)을 호출하고 마지막 가능한 이동으로 이동하도록 좌표를 설정합니다. 함수에서 돌아 오면이 깊이에 대한 점수를 점수에 기록하지만 전 세계적으로는 큰 변화가 아닙니다. 그러나 setMove에 대한 마지막 호출은 여전히 ​​활성화되어 있으며 나중에 변경하지 않습니다.

이 호출을 executeCheckTheSons2 밖으로 이동하고 일부 상위 계층 함수로 이동해야합니다. 또는 x 및 y 좌표를 executeCheckTheSons2 함수의 로컬 변수에 기록한 다음 setMove을 호출하여 함수에서 돌아 오기 전에 호출하십시오.

이 질문이 당신에게 도움이 되었으면 답해주십시오.

관련 문제