自从几年前我从事国际象棋游戏以来,我已经列出了可以玩的游戏清单,但是我可能需要一些额外的建议来简化过去使用的方法。
我使用射线(二维矢量)检查了棋子可以移动和攻击的地方,但是我发现代码过于生涩(例如,必须为骑士移动做一些例外)。是否有检查移动和攻击的通用方法?
我也听说过位板,但是它们如何工作,位板的目的是什么?我使用8x8数组来描述指定位置的颜色和种类。这和位板一样吗?我可以使用位板检查有效的移动。那“ En Passant”规则呢?
我不要求:
我过去的项目中的列表如下:
我希望我的代码尽可能小,并且需要用于检查移动和攻击有效性的关键方法。我不要求任何源代码,仅要求方法如何工作。
谢谢。
答案 0 :(得分:1)
我将尝试提供“一些额外的建议以简化方法”,这并不是那么容易,因为您没有为这些方法提供代码。
位板确实是一种解决方案。 64位中的每一个都代表板上的一个正方形。
根据您使用的编程语言,可以在一个原始值(long
)中表示64位,从而可以进行非常快速的操作,
就像两个位板的按位与。
您将拥有其中几个,它们可以用于不同的目的:
另请参阅Best way to design chess game
我使用8x8数组来描述指定位置的颜色和种类。这和位板一样吗?
这也是一种可能的方法,但是它是完全不同的,并且效率不高:
我可以使用位板检查有效移动吗?那“ En Passant”规则呢?
是的,您可以使用位板检查有效的移动。在这种情况下,位板必须为15x15,假设该块出现在中心正方形中。如果部件可以移动到那里(如果没有障碍物),则位设置为1。 您仍然需要做一些操作,以将其映射到一个实际的8x8位板上,该位板代表板上实际块的当前位置, 然后找出其中哪些代表 valid 移动(通过使用快速AND操作)。对于典当捕获动作,您将使用单独的位板。对于“过客”来说,这样做效果不佳, 因为您将需要额外的逻辑来解释这些位,所以您最好在不使用位板的情况下应用该逻辑。
位板不能解决所有问题,但可以使问题变得更容易。您仍然需要实现用于转换,传递,升级,固定,检查,僵持,配合等的逻辑。
您可能还想添加到国际象棋状态: