3

你会创建3个列表(坐标)

  • 空位
  • 黑位
  • 白位

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

什么是最好的?(速度方面)

4

3 回答 3

7

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

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

如果代码的清晰性是优先考虑的,那么忘记位改组并像其他人已经建议的那样选择很好的抽象数据类型。请记住,如果您采用这种方式,您可能会达到性能上限。

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

(原贴在这里

于 2009-05-06T12:09:43.687 回答
2

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

在选择合适的棋盘表示时要深思熟虑是很重要的——它们都有自己独特的优势(和缺陷)——主要与某些操作的速度/执行有关,例如执行移动和评估棋盘状态(通常从 O( 1) 到 O(n) 时间复杂度取决于方法和任务)。据我所知,对于“最佳”板表示仍然没有达成共识,尽管现在有些人通常比其他人更喜欢(例如,位板几乎是必备品)。这就是为什么大多数强大的国际象棋 AI 在搜索移动时通常使用几种(最多 4 或 5 个)不同的棋盘表示。

于 2009-05-06T12:21:29.430 回答
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

于 2009-05-06T18:35:01.060 回答