你会在棋盘上做什么? (件位)

时间:2009-05-06 12:07:58

标签: .net algorithm chess

你会为

创建3个(坐标)列表吗?
  • 空位
  • 黑色位置
  • 白色位置

或者只是在需要时循环播放数组并每次都使用结果?

什么是最好的? (速度明智)

3 个答案:

答案 0 :(得分:7)

您的两个主要选择是在速度和代码清晰度之间。

如果速度是您的首选,那么您必须为棋盘上的每组棋子使用64位数据类型(例如白棋子,黑棋子,传球棋子)。然后,您可以在生成移动和测试移动合法性时利用本机按位操作。

如果代码的清晰度是优先级,那么请忘记位改组,并像其他人已经建议的那样去寻找抽象的数据类型。请记住,如果你这样做,你可能会达到性能上限。

首先,请查看Crafty(C)和SharpChess(C#)的代码。

(最初发布here

答案 1 :(得分:2)

您正在寻找的是董事会代表Chess Programming Wiki有关于该主题的非常详细的部分(如果您认真编写AI,绝对值得一读),而Wikipedia提供了关于该主题的良好概述。

在选择适当的董事会代表时要非常周到很重要 - 它们都提供了自己独特的优势(和陷阱) - 主要与某些操作的速度/执行有关,例如执行移动和评估电路板状态(通常是测距)从O(1)到O(n)时间复杂度取决于方法和任务)。据我所知,对于“最佳”董事会代表仍然没有达成共识,尽管有些人现在比其他人更受欢迎(bitboards几乎是必须拥有的)。这就是为什么大多数强大的国际象棋AI在搜索动作时使用多个(最多4或5个)不同的棋盘表示的原因。

答案 2 :(得分:0)

我建议使用64个项目,例如:

byte [64] Squares;

这样你只需要用一个字节表示一个棋盘位置,它就会快得多。

当处理单个索引来引用棋盘位置时,必须知道某些事情才能使生活更轻松。例如,您如何知道两个位置在同一行或列上?有一个简单的诀窍可以解决这个问题。

要计算出一个位置的行,你将位置除以8并取结果的整数部分。例如,位置63除以8是7.875,等于第7行。位置3除以8是0.375所以0.在C#中,通过转换为整数,您将始终只得到数字的整数部分,因此:

Row = (int)(position / 8)

通过执行位置模数8来计算出位置的列。例如,位置24模数8是第0列。位置15模数8是7,因此

Column = position % 8

有了这两个概念,我们可以将64平方电路板上的任何位置转换为列和行。

如果您想了解有关创建自己的国际象棋引擎的更多信息,请查看http://www.chessbin.com