在国际象棋棋盘上,如果棋子位置是这样的,你会怎么做?

3

你需要为以下三种坐标创建列表:

  • 空位置
  • 黑色位置
  • 白色位置

还是只在需要时循环遍历数组,并每次处理结果?

哪种方法更好?(就速度而言)


如何在编写下棋程序时建模棋盘? - anon
@neil,我刚刚看了一下,这不是重复的问题。我的问题很具体,而你链接的那个问题并没有回答它。 - Fredou
3个回答

7

你的两个主要选择是速度和代码清晰度。

如果速度是你的优先考虑因素,那么你必须为棋盘上每组棋子(例如白兵、黑后、过路兵)使用64位数据类型。这样你就可以利用原生的位运算来生成移动并测试移动的合法性。

如果代码的清晰度更重要,那么就不要去做位操作,而是选择像其他人已经建议的那样优雅地抽象出数据类型。只需记住,如果你选择这种方式,你可能会遇到性能瓶颈。

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

(原始帖子发布于此处


我有类似于SharpChess的东西。 - Fredou
现代计算机是否会因任何合理的实现而出现明显的延迟问题? - John Fouhy
@John - 当一个程序被调用数十亿次时,速度上最微小的差异都是非常重要的。 这不仅仅涉及到GUI的用户感知问题。 - Ed Guiness

2
你需要的是一个棋盘表示法。关于这个主题,国际象棋编程维基有非常详细的部分(如果你想认真写一个人工智能程序,一定值得阅读),而维基百科则提供了一个很好的概述。
在选择适当的棋盘表示法时要非常谨慎——它们都具有自己独特的优点(和缺点),主要与执行移动和评估棋盘状态等操作的速度/性能有关(通常取决于方法和任务,时间复杂度从O(1)到O(n)不等)。据我所知,仍然没有关于“最佳”棋盘表示法的共识,尽管现在有些方法比其他方法更受青睐(例如位棋盘几乎是必备的)。这就是为什么大多数强大的国际象棋人工智能在搜索走步时使用多种(甚至达到4或5种)不同的棋盘表示法的原因。

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

掌握了这两个概念,我们就可以将棋盘上的任何位置转换为列和行。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接