你需要为以下三种坐标创建列表:
- 空位置
- 黑色位置
- 白色位置
还是只在需要时循环遍历数组,并每次处理结果?
哪种方法更好?(就速度而言)
你的两个主要选择是速度和代码清晰度。
如果速度是你的优先考虑因素,那么你必须为棋盘上每组棋子(例如白兵、黑后、过路兵)使用64位数据类型。这样你就可以利用原生的位运算来生成移动并测试移动的合法性。
如果代码的清晰度更重要,那么就不要去做位操作,而是选择像其他人已经建议的那样优雅地抽象出数据类型。只需记住,如果你选择这种方式,你可能会遇到性能瓶颈。
首先,看看Crafty (C)和SharpChess (C#)的代码。
(原始帖子发布于此处)
byte [64] Squares;
这种方法只需要用一个字节来表示棋盘位置,速度更快。
当处理单个索引以引用棋盘位置时,有些事情必须知道,以使生活更轻松。例如,如何知道两个位置是否在同一行或列上?有一个简单的技巧可以解决这个问题。
行
要找出一个位置所在的行,您需要将该位置除以8并取结果的整数部分。例如,63除以8等于7.875,即第7行。3除以8等于0.375,因此是第0行。在C#中,通过强制转换为整数,您将始终获得数字的整数部分,因此:
Row = (int)(position / 8)
列
要确定一个位置的列,您可以使用模运算符通过执行位置模8来计算。例如,位置24模8为列0。位置15模8为7,因此
Column = position % 8
掌握了这两个概念,我们就可以将棋盘上的任何位置转换为列和行。
如果您想了解更多关于创建自己的国际象棋引擎的信息,请查看http://www.chessbin.com。