我假设您已经了解Min-Max,树木和修剪,启发式和其他基础知识的概念,而我在这里写的只是一些可能被低估的细节。
我有时和一个朋友一起写我们自己的象棋引擎。我分享一些我们遇到的问题和想法,希望您发现它们有用。
由于我们都是Java程序员,因此我们的语言将我们变成了Java,因此我们从面向对象的方法开始。棋子是物体,棋盘是物体,文件和等级(象棋文献中的行和列)是物体。这是错误的。开销很大,程序无法在搜索树中进行超过2步(4层)的移动。
因此,通过一些搜索,我们得出了一个绝妙的主意(虽然不是我们的主意):将棋子和棋盘表示为长整数(64位)。这是有道理的,因为棋盘有64个正方形。其余的都是按位操作(非常接近cpu =极快地运行)。例如,考虑一个二进制的64位整数,其中的一个表示您的棋子可以攻击的棋盘上的方块。现在,如果您像这样在两个数字之间执行逻辑“与”运算,则非零结果表示您与攻击者之间存在平方。有几种显示棋盘和棋子的方法,因此:
1-确定董事会的陈述
然后,您需要打开数据库。国际象棋的打开是解决蚂蚁的一种方式,强烈建议您打开它。在这种情况下,您在闪电战游戏中会有很多额外的时间。
2-为自己找到一本开始的书。
我们做了这些,但是我们仍然远远不够:
3-一个好的国际象棋引擎应该能够看到6个动作(12层)。
所以我们要做的是利用停滞时间(如果这是人机与计算机引擎)。
4-在对手考虑创建树的某些级别时使用时间。
而且我们离十二层还很远。通过更多的研究,我们发现了一些技巧!例如,建议跳过树的一层,然后从下一层开始(就像没有对手一样)。这个想法是,如果一个举动极其愚蠢,那么为什么要浪费时间,看看对手对该举动有何反应。但是,一个好的引擎应该能够区分愚蠢的举动和天才女王的牺牲。
5- 学习针对此特定问题(象棋)的编程技巧。
在这种状态下,我和我的朋友仍然很糟糕://我们可以做的(并且部分完成了)是保存所计算的职位。如果您计算仓位,请保存以备将来使用!搜索树中的循环也是如此。关键是要有效地保存/检索:
6-有效地保存生成的数据...
最后:
7-具有最大优化的代码。
这个问题在CPU时间和内存上都是非常昂贵的。非常有效地编写代码非常重要。请记住,我们谈论的是35的分支因数。这意味着您的启发式方法中某处没有用的“如果”,可以变成3.3792205e+18
搜索树深处某处的无用的“如果”。
国际象棋编程是一个非常非常有趣的挑战,现在是时候可以对编程功能进行严格的测试了。我可以提出几点建议,但是我敢肯定,您会自己发现它们的。还有很多我不知道的要点,但是您可以在Internet上找到它们!
祝好运并玩得开心点!
ps我不太了解javascript,但是基于问题的难度,有些事情告诉我,也许,考虑到C ++可以提供的所有功能,最好放下javascript并用C ++来做。