我正在尝试编写C#国际象棋AI。
此时,我必须构建我的极小极大树。我尝试使用递归,但是我的递归函数需要为每个节点调用自身约1,000,000次。大约在60,000次调用后,我会遇到堆栈溢出异常。
此时,我必须构建我的极小极大树。我尝试使用递归,但是我的递归函数需要为每个节点调用自身约1,000,000次。大约在60,000次调用后,我会遇到堆栈溢出异常。
大多数国际象棋搜索程序只能搜索到深度9或10。这根本不足以导致堆栈溢出。
您的程序可能存在错误。无论如何,您需要在搜索中设置深度限制,因为如果没有深度限制,您将无法进行全宽度搜索(探索给定深度内所有移动的所有可能性),因为国际象棋游戏的深度潜在地是无限的(除了重复位置或移动规则的限制)。
在搜索到大约深度9之后,您必须使用静态棋盘评估函数来评估和打分。然后,您可以使用极小化极大算法来修剪搜索树的分支。尽管如此,这仍然是一种指数搜索。
还有一些技术,例如静态搜索,在其中您可以继续搜索不稳定的位置(即,如果可以拿走一件棋子或国王处于被将军状态)。
如果您有兴趣学习如何编写C#国际象棋引擎,我邀请您访问计算机国际象棋博客。
该博客从最初的步骤开始描述了创建C#国际象棋引擎的过程,并提供了C#代码示例。
您可能最感兴趣的页面是:移动搜索和Alpha Beta
本文详细介绍了Min Max和Alpha Beta搜索算法,包括两者的C#代码示例。