【问题标题】:Simple algorithms for chess gamestate国际象棋游戏状态的简单算法
【发布时间】:2020-01-23 16:57:35
【问题描述】:

自从我几年前从事国际象棋游戏以来,我已经列出了一些可以让游戏正常运行的东西,但我可能需要一些额外的建议来简化我过去使用的方法。

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

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

我不是要求:

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

我过去的项目列表如下:

  • 攻击地图(二维射线投射)。铸造旗帜的状态取决于它。
  • 城堡旗帜
  • 用于典当移动的第 2 或第 7 行标志。
  • En Passant 标志
  • 射线(2 维射线投射)检查每个碎片可以移动和攻击的位置

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

谢谢。

【问题讨论】:

    标签: algorithm chess


    【解决方案1】:

    我会尝试给出“一些额外的建议来简化您可能使用过的方法”,这并不容易,因为您没有为这些方法提供代码。

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

    • 位置:每块一块位板类型和颜色:如果相应的方块有该块,则该位为 1。白国王的位板将恰好有一个位设置为 1,但白棋子的位板最多可以有八个位设置为 1。
    • 移动:每块一块位板:如果块可以移动到相应的方格,则位为 1。
    • 攻击:每块一个位板:如果该块攻击相应的方格,则位为 1。
    • ...等

    另见Best way to design chess game

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

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

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

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

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

    Bitboards 不能解决所有问题,但会使一些问题变得更容易。你仍然需要实现castling、en passant、promotion、pinning、check、stalemate、mate ...等的逻辑。

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

    • 重复位置计数,以检测平局
    • 没有棋子移动或捕获的移动计数,以检测平局

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 2015-05-02
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多