我到處尋找解決我的代碼的答案,但花了很長時間花在嘗試調試它之後,我發現自己絕望地卡住了。問題是我的極小極大函數不會返回正確的值以實現最佳移動,我甚至試圖通過存儲最佳第一步(當深度= 0時)來修復它,但如果解決方案不明顯,則算法失敗可怕的。我也嘗試修改基本情況下的返回值,以便優先考慮早期的勝利,但這並沒有解決問題。Minimax值問題 - Java
目前我正在測試TicTacToe板上的輔助類(例如getMoves()或getWinner)的功能,我知道我的樣式並不是最高效的,但我需要的代碼非常明確。 通過添加一堆打印語句,我意識到在某些情況下我的bestFinalMoves ArrayList沒有被修改,所以這可能與問題有關。另一個相關的問題是,除非算法找到直接勝利(在下一步移動中),否則,不是通過阻止導致立即阻止的正方形來選擇可能導致未來贏或平局的移動,而只是產生空間讓最小化的球員獲勝。
例如在黑板上:
aBoard= new int[][] {
{0,1,0}, // 1 is MAX (AI), -1 is MIN (Human)
{-1,0,0},
{-1,0,0}
};
收益率2.0,它是明顯不正確的結果,它應該是0,0,使其塊贏了最小化的球員, bestFinalMoves ArrayList是空的。
private result miniMaxEnd2(Board tmpGame, int depth){
String winner = tmpGame.whoWon();
ArrayList<Move> myMoves = tmpGame.getMoves();
if (winner == 'computer'){ //Base Cases
return new result(1000);
}else if (winner == 'human'){
return new result(-1000);
}
else if (winner == 'tie'){
return new result(0);
}
if (tmpGame.ComputerTurn) {//MAX
bestScore = -99999;
for (Move m : tmpGame.getMoves()){
Board newGame = new Board(tmpGame,!tmpGame.ComputerTurn, m);
result aScore = miniMaxEnd2(newGame, depth+1);
if (aScore.score > bestScore) {
bestScore = aScore.score;
bestMove = m;
if (depth == 0) {
bestFinalMoves.add(m);
}
}
}
return new result(bestScore, bestMove);
} else {//MIN
bestScore = 99999;
for (Move m : tmpGame.getMoves()) {
Board newGame = new Board(tmpGame,!tmpGame.ComputerTurn, m);
result aScore = miniMaxEnd2(newGame, depth + 1);
if (aScore.score < bestScore) {
bestScore = aScore.score;
bestMove = m;
}
}
return new result(bestScore,bestMove);
}
}
我知道這是一個很長的帖子,但我真的很感謝你的幫助。完整的代碼可以在https://github.com/serch037/UTC_Connect
bestScore和bestMove變量的範圍是什麼?他們在哪裏宣佈?你不覺得他們應該在miniMaxEnd2方法中聲明嗎? – DGardim
對不起,我錯過了原始文章中的信息,都是實例變量,因爲我有一個名爲miniMaxPlayer的對象,它在調用時運行顯示的方法。在閱讀您的意見後,我切換了他們的範圍,現在該方法似乎正常工作。萬分感謝!我不敢相信我犯了這樣一個愚蠢的錯誤。 – serch037
不錯。我添加了問題的答案,以便您可以將其標記爲已解決。 – DGardim