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