国际象棋游戏状态的简单算法

时间:2020-01-23 16:57:35

标签: algorithm chess

自从几年前我从事国际象棋游戏以来,我已经列出了可以玩的游戏清单,但是我可能需要一些额外的建议来简化过去使用的方法。

我使用射线(二维矢量)检查了棋子可以移动和攻击的地方,但是我发现代码过于生涩(例如,必须为骑士移动做一些例外)。是否有检查移动和攻击的通用方法?

我也听说过位板,但是它们如何工作,位板的目的是什么?我使用8x8数组来描述指定位置的颜色和种类。这和位板一样吗?我可以使用位板检查有效的移动。那“ En Passant”规则呢?

我不要求:

  • 人工智能(A.I)算法
  • 源代码

我过去的项目中的列表如下:

  • 攻击地图(二维射线广播)。 Castling标志的状态取决于它。
  • 包装标志
  • 第2行或第7行标记用于典当移动。
  • En Passant标志
  • 用射线(二维射线投射)检查每片可以移动和攻击的地方

我希望我的代码尽可能小,并且需要用于检查移动和攻击有效性的关键方法。我不要求任何源代码,仅要求方法如何工作。

谢谢。

1 个答案:

答案 0 :(得分:1)

我将尝试提供“一些额外的建议以简化方法”,这并不是那么容易,因为您没有为这些方法提供代码。

位板确实是一种解决方案。 64位中的每一个都代表板上的一个正方形。 根据您使用的编程语言,可以在一个原始值(long)中表示64位,从而可以进行非常快速的操作, 就像两个位板的按位与。 您将拥有其中几个,它们可以用于不同的目的:

  • 位置:每个块类型和颜色的位板:如果相应的正方形具有该块,则位为1。白王的位板将一位精确地设置为1,而白卒的位板则最多可以将8位设置为1。
  • 移动:每块一块位板:如果一块可以移动到相应的正方形,则位为1。
  • 攻击:每块一块位子板:如果一块攻击相应的正方形,则位为1。
  • ...等

另请参阅Best way to design chess game

我使用8x8数组来描述指定位置的颜色和种类。这和位板一样吗?

这也是一种可能的方法,但是它是完全不同的,并且效率不高:

  • 您仅/需要一个这样的8x8阵列,其中每个单元格都有丰富的信息(一个字节?)。总内存大小可能> = 64字节。
  • 您需要十二块8x8的位板,每块类型和颜色一个。总内存大小= 12长,即48个字节

我可以使用位板检查有效移动吗?那“ En Passant”规则呢?

是的,您可以使用位板检查有效的移动。在这种情况下,位板必须为15x15,假设该块出现在中心正方形中。如果部件可以移动到那里(如果没有障碍物),则位设置为1。 您仍然需要做一些操作,以将其映射到一个实际的8x8位板上,该位板代表板上实际块的当前位置, 然后找出其中哪些代表 valid 移动(通过使用快速AND操作)。对于典当捕获动作,您将使用单独的位板。对于“过客”来说,这样做效果不佳, 因为您将需要额外的逻辑来解释这些位,所以您最好在不使用位板的情况下应用该逻辑。

位板不能解决所有问题,但可以使问题变得更容易。您仍然需要实现用于转换,传递,升级,固定,检查,僵持,配合等的逻辑。

您可能还想添加到国际象棋状态:

  • 计算位置重复,以检测抽奖
  • 没有进行棋子移动或捕获的移动计数,以检测抽奖