国际象棋游戏状态的简单算法
Simple algorithms for chess gamestate
自从我几年前从事国际象棋游戏工作以来,我已经列出了游戏玩法正常运行的预期事项列表,但我可能需要一些额外的建议来简化我过去使用的方法。
我使用射线(一个二维向量)来检查一个棋子可以移动和攻击的位置,但我发现代码有点太生涩了(例如必须为骑士的移动做出例外)。有没有通用的方法来检查移动和攻击?
我也听说过位板,但是它们是如何工作的,位板的用途是什么?我使用 8x8 数组来描述指定位置的颜色和类型。这和位板一样吗?我可以使用 bitboard 来检查有效的移动吗? En Passant 规则怎么样?
我不是要:
- 人工智能(A.I)算法
- 源代码
我过去的项目列表如下:
- 攻击图(二维光线投射)。易位标志的状态取决于它。
- 铸造旗帜
- 第 2 或第 7 行棋子移动标志。
- En Passant 标志
- 射线(二维射线投射)检查每个棋子可以移动和攻击的位置
我希望我的代码尽可能小,并且需要检查移动和攻击有效性的关键方法。我不要求源代码,只要求方法如何工作。
谢谢。
我会尽量给出"some extra advice to simplify the methods"你可能用过,这不是那么容易,因为你没有提供这些方法的代码。
位板确实是一种解决方案。 64 位中的每一位代表棋盘上的一个方块。
根据您使用的编程语言,64 位可以用单个原始值 (long
) 表示,允许非常快速的操作,
就像两个位板的按位与。
你会有几个,它们可以用于不同的目的:
- 位置:每块类型和颜色的位板:如果相应的方格有该块,则位为 1。白王的位板只有一位设置为 1,但白兵的位板最多可以有八位设置为 1。
- 移动数:每块一个位板:如果该块可以移动到相应的方格,则位为1。
- 攻击:每块一个位板:如果该块攻击相应的方格,则位为1。
- ...等等
另见 Best way to design chess game
I use 8x8 array to describe what color and what kind of piece is at a specified location. Is this the same as bitboard?
这也是一种可能的方法,但它完全不同并且效率不高:
- 你只有 have/need 一个这样的 8x8 数组,其中每个单元格都有丰富的信息(一个字节?)。总内存大小可能 >= 64 字节。
- 您需要 12 个 8x8 位板,每种类型和颜色各一个。总内存大小 = 12 longs,即 48 字节
Can I use bitboard to check for valid moves. What about the En Passant rule?
是的,您可以使用位板来检查有效着法。在那种情况下,位板必须是 15x15,假设棋子出现在中心方块中。如果棋子可以移动到那里(如果没有障碍物),位设置为 1。
你仍然需要做一些操作来将其映射到一个实际的 8x8 位板上,该位板代表板上实际一块的 当前 位置,
然后找出哪些代表 valid 移动(通过使用快速 AND 操作)。对于典当捕获移动,您将使用单独的位板。对于 "en passant" 这不会很好地工作,
因为您需要额外的逻辑来解释这些位,所以您也可以在不使用位板的情况下应用逻辑。
位板并不能解决所有问题,但可以使一些问题变得更容易。你仍然需要实现易位、过路、提升、固定、检查、僵持、配对等的逻辑
您可能还想添加到国际象棋状态:
- 重复位置计数,以检测平局
- 没有棋子移动或捕获的移动计数,以检测平局
自从我几年前从事国际象棋游戏工作以来,我已经列出了游戏玩法正常运行的预期事项列表,但我可能需要一些额外的建议来简化我过去使用的方法。
我使用射线(一个二维向量)来检查一个棋子可以移动和攻击的位置,但我发现代码有点太生涩了(例如必须为骑士的移动做出例外)。有没有通用的方法来检查移动和攻击?
我也听说过位板,但是它们是如何工作的,位板的用途是什么?我使用 8x8 数组来描述指定位置的颜色和类型。这和位板一样吗?我可以使用 bitboard 来检查有效的移动吗? En Passant 规则怎么样?
我不是要:
- 人工智能(A.I)算法
- 源代码
我过去的项目列表如下:
- 攻击图(二维光线投射)。易位标志的状态取决于它。
- 铸造旗帜
- 第 2 或第 7 行棋子移动标志。
- En Passant 标志
- 射线(二维射线投射)检查每个棋子可以移动和攻击的位置
我希望我的代码尽可能小,并且需要检查移动和攻击有效性的关键方法。我不要求源代码,只要求方法如何工作。
谢谢。
我会尽量给出"some extra advice to simplify the methods"你可能用过,这不是那么容易,因为你没有提供这些方法的代码。
位板确实是一种解决方案。 64 位中的每一位代表棋盘上的一个方块。
根据您使用的编程语言,64 位可以用单个原始值 (long
) 表示,允许非常快速的操作,
就像两个位板的按位与。
你会有几个,它们可以用于不同的目的:
- 位置:每块类型和颜色的位板:如果相应的方格有该块,则位为 1。白王的位板只有一位设置为 1,但白兵的位板最多可以有八位设置为 1。
- 移动数:每块一个位板:如果该块可以移动到相应的方格,则位为1。
- 攻击:每块一个位板:如果该块攻击相应的方格,则位为1。
- ...等等
另见 Best way to design chess game
I use 8x8 array to describe what color and what kind of piece is at a specified location. Is this the same as bitboard?
这也是一种可能的方法,但它完全不同并且效率不高:
- 你只有 have/need 一个这样的 8x8 数组,其中每个单元格都有丰富的信息(一个字节?)。总内存大小可能 >= 64 字节。
- 您需要 12 个 8x8 位板,每种类型和颜色各一个。总内存大小 = 12 longs,即 48 字节
Can I use bitboard to check for valid moves. What about the En Passant rule?
是的,您可以使用位板来检查有效着法。在那种情况下,位板必须是 15x15,假设棋子出现在中心方块中。如果棋子可以移动到那里(如果没有障碍物),位设置为 1。 你仍然需要做一些操作来将其映射到一个实际的 8x8 位板上,该位板代表板上实际一块的 当前 位置, 然后找出哪些代表 valid 移动(通过使用快速 AND 操作)。对于典当捕获移动,您将使用单独的位板。对于 "en passant" 这不会很好地工作, 因为您需要额外的逻辑来解释这些位,所以您也可以在不使用位板的情况下应用逻辑。
位板并不能解决所有问题,但可以使一些问题变得更容易。你仍然需要实现易位、过路、提升、固定、检查、僵持、配对等的逻辑
您可能还想添加到国际象棋状态:
- 重复位置计数,以检测平局
- 没有棋子移动或捕获的移动计数,以检测平局