我已經實施了跳棋alpha-beta修剪,並認爲我有它的工作,但發現計算機不需要連續多次跳轉(當它必須)。例如:Alpha-beta修剪連續移動爲同一個球員
AI做:
O _ _ _ _ _ _ _ _ _
_ X _ X _ -> _ _ _ X _ (misses a jump because it only does a single move)
_ _ _ _ _ _ _ O _ _
AI 應該做:
O _ _ _ _ _ _ _ _ O
_ X _ X _ -> _ _ _ _ _ (sees that it's current turn is not finished, continues)
_ _ _ _ _ _ _ _ _ _
我試圖通過檢查MovePiece的返回值,返回播放器是否要修復它已經完成了他的轉身,取決於是否跳投以及是否還有進一步的跳投。根據返回值,它將再次運行MaxValue/MinValue(取決於它在第一次看到還有哪些進一步移動時所處的位置),或者繼續在樹中並切換播放器。
相關代碼(C#)如下(retVal的是一個包含價值,深度的類型,和動做):
foreach(var m in moves)
{
var resultingBoard = board.Clone();
var moveResult = resultingBoard.MovePiece(m.TypeOfMove,
resultingBoard.GetPieceAtPosition(m.OriginalPieceLocation.X,
m.OriginalPieceLocation.Y),
m.FinalPieceLocation.X, m.FinalPieceLocation.Y);
var newDepth = currentDepth;
if(moveResult == TurnResult.NotDone)
{
retVal = MaxValue(resultingBoard, ref alphaValue, ref betaValue, color, ref newDepth, ref maxDepth);
}
else if(moveResult == TurnResult.Finished)
{
newDepth++;
retVal = MinValue(resultingBoard, ref alphaValue, ref betaValue, color == PieceColor.Black ? PieceColor.Red : PieceColor.Black, ref newDepth, ref maxDepth);
}
}
...
然而,這個結果在一些...有趣的結果(第一步除了最小的修剪之外什麼也不做),儘管我認爲這將是正確的改變。
正在讓MaxValue/MinValue再次調用自己的新舉措做正確的事情嗎?