首页 > 编程知识 正文

JAVA象棋,java写象棋

时间:2023-05-05 04:12:21 阅读:202802 作者:4505

鉴于题主是初学者,我就不推荐什么开源项目让你自己去读代码了,因为我觉得理论学习更重要。主要说一下学习路线吧。

先读一下《Artificial Intelligence A Modern Approach》第5章 Adversarial Search,知道一下对抗搜索的原理(其实就是Min-Max Search),非常简单,但后面的优化算法都是基于这个的。之后再看Alpha-Beta pruning,先理解算法直到可以在纸上自己画出某个example 的裁剪过程就可以了。之后建议先写个五子棋程序,这个东西难度适中,既可以练练怎么实现Alpha-Beta pruning,又不必纠缠太多规则上的细节。一方面帮你熟悉了怎么解决书本上没有提到的技术细节,比如标准的Alpha-Beta pruning 函数是返回Value 的,但你要得到下一步棋怎么走需要它返回一个Action,对于新手这个可能没那么容易想到。另一方面也帮你思考一下如何优化程序和下一步改进程序的重点,比如书上提到的Cutting Off 和Evaluation Function(其实五子棋和象棋最大的不同就是这个Evaluation Function)。

然后,随着你探索更聪明的AI 的过程你就会发现其实Alpha-Beta pruning 的效率非常差。上学期我做了个课程作业就是用Common Lisp 实现了一个Web 版的五子棋:fiigii/gomoku-CommonLisp · GitHub 我在测试的时候发现,Alpha-Beta pruning 在搜索状态空间时差不多每100个状态才能减除5至8个状态,再加上我用Common Lisp,每一步棋总要卡个几秒钟,实在不能忍受……然后有了实现能力你就可以去学习更高级的裁剪算法了,比如Principal variation search。或者《Artificial Intelligence A Modern Approach》第五章后面也提到了一些改进策略比如history heuristic、order of choice 等等,够你研究一下了。

除此之外还有一个很好的资料是《Paradigms of Artificial Intelligence Programming》的第18章带你亲手实现一个黑白棋程序,不过也是用Common Lisp 的。

做完这些之后,我相信你只要再看看象棋规则以及具体的Evaluation策略,不看别人的代码自己徒手实现一个就是很轻松的事了。

P.S. 鉴于你还在看《C++ Primer》我建议你在学习过程中再学点数据结构,起码STL里的常用容器的应用场景得了然于胸,要不然书上的伪代码怎么翻译成程序都是个问题……

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。