我正在重写为在魔术位板上运行而编写的国际象棋引擎。我已经编写了魔术函数,它们以一块的正方形和一个占用位板为参数。我和我自己正在争论的是,以下哪种董事会代表计划更快/更实用:

方案1:每种棋子都有一块挡板,白骑士1个,黑鸦1个。 。 。 ,然后为了生成移动并将其推入移动堆栈,我必须序列化它们以找到棋子的平方,然后调用magic函数。然后,我必须序列化该移动位板并推动它们。优点是攻击和占用位板近在咫尺。

方案2:一个简单的块中心数组[2] [16]或[32]包含块的平方索引。移动位板只需进行简单的循环和调用功能即可。然后,我将这些位板序列化并将其推入移动堆栈。我还必须维护一个占用位板。我想获得攻击位板应该没有什么不同:我必须再次生成所有移动位板,而不是序列化它们,而是以魔术的方式按位操作它们。

我倾向于方案2,但是出于某种原因,我认为有些类似于方案1的实现是标准的。由于某些原因,我无法发现在不实际使用位板的情况下制造“位板”引擎的缺点。我什至不会使用位板来获取国王和骑士的数据,而只是快速查找数组。

我想我的问题更多是,是否有更好的方法来表示这种木板,因为我记得读过,保持每种类型的一块位板是标准的(也许只有旋转的位板才需要这样做)。我对位板引擎比较陌生,但是我读了很多书,并且实现了魔术方法。我当然喜欢以零件为中心的阵列方法-它使许多随意的事情变得容易,例如将板子印刷到屏幕上,但是如果有更好/平等/更标准的方法,有人可以指出吗?预先感谢-我知道这是一个相当具体的问题,除非您对国际象棋编程非常熟悉,否则很难回答。

最后一分钟的问题:到2D数组的查找速度如何衡量,直到使用1D数组并在正常索引中添加16 * team_side来查找块?

编辑:我想我应该补充一点,我在国际象棋实施中几乎对所有其他方面都重视速度。为什么我还要使用魔术位板,而不是简单的带有幻灯片数据的数组?

最佳答案

抱歉,没有标准答案。

您需要的数据结构的数量和类型取决于您要在程序中执行的操作。例如,板上有不止一个代表的作品,可以使某些操作更快。另一方面,每次移动都需要花费更多时间来更新数据。

为了获得最大速度,找出最适合您的程序的工作是您的工作。维护额外的数组是否会导致程序的净加速?这取决于!

有时维护数据结构是一项纯收益,有时您可以延迟计算并缓存结果,有时仅在需要时进行计算(并希望不再经常使用)。

07-24 09:18