什么是魔术位棋子移动生成系统最实用的棋盘表示法?

3
我正在重写一个国际象棋引擎,以在魔术位板上运行。我已经编写了魔术函数,并将方块和占用位板作为参数传递。我正在自我辩论的是哪种棋盘表示方案更快/更实用:
方案1:每种棋子都有一个位板,例如白色骑士的1个位板,黑色车的1个位板...,为了生成移动并将它们推送到移动栈中,我必须对它们进行序列化以找到该棋子的方块,然后调用魔法函数。然后我必须对该移动位板进行序列化并将其推入栈中。优点是攻击和占用位板更容易得到。
方案2:一个简单的以棋子为中心的数组[2][16]或[32]包含棋子的方块索引。只需要循环遍历并调用函数即可获得移动位板。然后我会将这些位板序列化并将它们推到移动栈中。我还必须维护一个占用位板。我想获取攻击位板不应该有任何区别:我必须再次生成所有移动位板,并且在一个魔法混合中按位操作它们,而不是对它们进行序列化。
我倾向于方案2,但由于某种原因,我认为有一种类似于方案1的实现是标准的。出于某种原因,我找不到制作“位板”引擎而不实际使用位板的缺点。我甚至不会使用位板来存储国王和骑士数据,只需快速查找数组即可。
我的问题更多地是是否有更好的方法来表示这个棋盘,因为我记得保留每种棋子的位板是标准的(也许只有在旋转位板时才需要?)。我对位板引擎相对较新,但我已经阅读了很多并实施了魔法方法。我肯定喜欢以棋子为中心的数组方法-它使诸如将棋盘打印到屏幕上之类的任意事情变得更加容易,但如果有更好/相等/更标准的方法,请有人指出吗?先感谢您 - 我知道这是一个非常具体的问题,除非您非常熟悉国际象棋编程,否则很难回答。
最后一个问题:查找2D数组的速度如何与使用1D数组和将16 * team_side添加到正常索引以查找棋子相比?
编辑:我认为我应该补充一下,我在我的国际象棋实现中几乎所有东西都看重速度。否则,我为什么要选择使用魔术位板而不是带有滑动数据的简单数组?
1个回答

1

很抱歉,这个问题没有标准答案。

你需要的数据结构的数量和类型取决于你在程序中想要做什么。例如,在棋盘上有多个棋子表示会使某些操作更快。另一方面,在每次移动期间更新数据需要更多时间。

为了获得最大速度,你需要找出对于你的程序来说哪种方法最好。维护额外的棋子数组是否会导致程序净加速?这取决于情况!

有时维护数据结构是净收益,有时可以延迟计算并缓存结果,有时只需在需要时计算它(并希望不太经常需要)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接