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

问题描述 投票:0回答:1

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

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

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

我不要求:

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

我过去的项目清单如下:

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

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

谢谢。

algorithm chess
1个回答
0
投票

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

位板确实是一种解决方案。 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位板上,该位板表示板上实际块的current位置,然后找出其中哪些代表valid移动(通过使用快速AND操作)。对于典当捕获动作,您将使用单独的位板。对于“过客”来说,这种方法效果不佳,因为您将需要额外的逻辑来解释这些位,所以您最好不使用位板就应用该逻辑。

位图板并不能解决所有问题,但会让您变得更容易。您仍然需要实现用于Casting,en Passant,Promition,...等的逻辑。

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

  • 计数重复位置,以检测抽签
  • 没有典当移动或捕获的移动计数,以便检测平局
© www.soinside.com 2019 - 2024. All rights reserved.