jmite的答案适用于该程序是否会退出计算-只是因为它是无限的,所以我不会在它死后调用该代码。
但是,还有另一种方法:一个有答案但未知的问题:
public void Demo()
{
if (Chess.Evaluate(new Chessboard(), int.MaxValue) != 0)
MessageBox.Show("Chess is unfair!");
else
MessageBox.Show("Chess is fair!");
}
public class chess
{
public Int64 Evaluate(Chessboard Board, int SearchDepth)
{
...
}
}
毫无疑问,该例程确实包含无效代码-该函数将返回执行一条路径但不执行另一条路径的答案。祝你好运!我的记忆是,理论上没有计算机能够在宇宙的生命周期内解决这个问题。
更详细地:
该Evaluate()
函数计算如果双方都玩得很好(最大搜索深度),则哪一方在下棋比赛中获胜。
象棋评估员通常会先预测每个可能的移动深度,然后尝试在该点上得分(有时将某些分支扩展得更远,因为半看交换或类似内容会产生非常偏斜的感觉。)由于实际的最大深度是17695的半步搜索是详尽无遗的,它将遍历所有可能的国际象棋游戏。由于所有游戏都结束了,因此无需试图确定每个棋盘的位置好坏(因此也没有理由去看棋盘评估逻辑-永远不会被称为),结果要么是赢,要么是输,要么是平局。如果结果是平局,则游戏是公平的;如果结果不是平局,则为不公平的游戏。为了扩展它,我们得到:
public Int64 Evaluate(Chessboard Board, int SearchDepth)
{
foreach (ChessMove Move in Board.GetPossibleMoves())
{
Chessboard NewBoard = Board.MakeMove(Move);
if (NewBoard.Checkmate()) return int.MaxValue;
if (NewBoard.Draw()) return 0;
if (SearchDepth == 0) return NewBoard.Score();
return -Evaluate(NewBoard, SearchDepth - 1);
}
}
还要注意,编译器几乎不可能意识到Chessboard.Score()是无效代码。对国际象棋规则的了解使我们能够弄清楚这一点,但是要弄清楚这一点,您必须知道MakeMove永远不会增加计件数,并且如果计件数保持静态太长时间,Chessboard.Draw()将返回true。 。
请注意,搜索深度为半步,而不是整个步。这种AI例程是O(x ^ n)例程,因此对这种AI例程来说是正常的-再添加一个搜索层会对运行多长时间产生重大影响。