你会为
创建3个(坐标)列表吗?或者只是在需要时循环播放数组并每次都使用结果?
什么是最好的? (速度明智)
答案 0 :(得分:7)
您的两个主要选择是在速度和代码清晰度之间。
如果速度是您的首选,那么您必须为棋盘上的每组棋子使用64位数据类型(例如白棋子,黑棋子,传球棋子)。然后,您可以在生成移动和测试移动合法性时利用本机按位操作。
如果代码的清晰度是优先级,那么请忘记位改组,并像其他人已经建议的那样去寻找抽象的数据类型。请记住,如果你这样做,你可能会达到性能上限。
首先,请查看Crafty(C)和SharpChess(C#)的代码。
(最初发布here)
答案 1 :(得分:2)
您正在寻找的是董事会代表。 Chess Programming Wiki有关于该主题的非常详细的部分(如果您认真编写AI,绝对值得一读),而Wikipedia提供了关于该主题的良好概述。
在选择适当的董事会代表时要非常周到很重要 - 它们都提供了自己独特的优势(和陷阱) - 主要与某些操作的速度/执行有关,例如执行移动和评估电路板状态(通常是测距)从O(1)到O(n)时间复杂度取决于方法和任务)。据我所知,对于“最佳”董事会代表仍然没有达成共识,尽管有些人现在比其他人更受欢迎(bitboards几乎是必须拥有的)。这就是为什么大多数强大的国际象棋AI在搜索动作时使用多个(最多4或5个)不同的棋盘表示的原因。
答案 2 :(得分:0)
我建议使用64个项目,例如:
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
有了这两个概念,我们可以将64平方电路板上的任何位置转换为列和行。
如果您想了解有关创建自己的国际象棋引擎的更多信息,请查看http://www.chessbin.com