2014-04-25 1 views
-1
public int minimax(Board b) { //player1 is AI 

    //depth+=10; 
    System.out.println("Current board is "); 
    System.out.println("To play now on this board is " + b.whoseTurn.getId()); 
    b.display(); 
    if((GameController.hasWon(b.whoseTurn,b)) 
    || (GameController.hasWon(b.whoseNotInTurn, b)) 
    || (GameController.isDraw(b.whoseTurn,b,b.whoseNotInTurn))) {   
    return evaluate(b);  
    } 
    ArrayList<Integer> possibleMoves = generateMoves(b); 

    if(b.whoseTurn.getId() == "AI") { 

    bestScore = -1000000; 

    for(int i = 0; i < possibleMoves.size(); i++) { 
     int move = possibleMoves.get(i); 
     b.myBoard.get(move).setSymbol(b.whoseTurn.getSymbol()); 

     swapPlayers(b); 
     score = minimax (b);  

     if(score > bestScore) { 

     bestScore = score; 
     bestMove = move; 
     System.out.println("In maximum Move is " + move + "BESTScore is" + score); 

     } 
     unmakeMove(b.myBoard.get(move)); 

    } 

    return bestMove; 
    } 
    else { 
    bestScore = 1000000; 
    for(int i = 0; i < possibleMoves.size(); i++) { 
     int move = possibleMoves.get(i); 
     b.myBoard.get(move).setSymbol(b.whoseTurn.getSymbol()); 

     swapPlayers(b); 
     score = minimax(b); 

     if(score < bestScore) { 
     myMoves.add(move); 
     bestScore = score; 
     bestMove = move; 
     System.out.println("In minimum Move is " + move + "Score is" + score); 

     } 
    unmakeMove(b.myBoard.get(move)); 

    } 
    return bestMove;   
} 

여기서 내가 실수를합니까? Here은 전체 코드에 대한 링크입니다.Java에서 minimax 알고리즘을 코딩했습니다. 그러나, 그것은 잘못된 최선의 움직임을 제공합니다. 어떤 제안?

+1

무엇을해야합니까? 코드 덤프는 SO 질문에 대한 최선의 방법이 아닙니다. –

+0

이 코드의 문제점은 무엇입니까? –

+0

문제의 원인이되는 부분 만 코드 샘플을 분리하면 도움이됩니다. 또한 다른 클래스가 필요없이 그냥 놓고 실행할 수있는 경우 도움이됩니다. [SSCCE] (http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions) – crownjewel82

답변

1

다음을 시도해보십시오. 점수를 얻으려면 재귀 마지막에 return evaluate(b)이 좋습니다. 그러나 위의 재귀 수준은 모두 bestMove을 반환 할 것입니다. 따라서 정상적으로 올바르게 전파하지 않기 때문에 재귀에서 bestScore을 잃게됩니다.

+0

예. 사실입니다. 가능한 길은 무엇일까요? 나는 꽤 오랫동안이 일로 머리를 부러 뜨 렸습니다. – Abhijay

+0

전체적으로 bestScore를 인쇄 해 보았습니다. 그것도 잘못된 대답을주는 것 같습니다. 논리에 문제가 있습니까? 저에게 알려주세요. – Abhijay

+0

bestMove 대신 bestScore를 반환하고 괜찮은지 확인한 것처럼 인쇄하려고합니다. 이 문제를 해결하고 보드 객체에 설정하여 bestMove를 얻으십시오. 예를 들어 반환하지 마십시오. –

관련 문제