+ -
当前位置:首页 → 问答吧 → Delphi版的中国象棋终于接近完工了,说点心得(关于提升搜索速度的)。

Delphi版的中国象棋终于接近完工了,说点心得(关于提升搜索速度的)。

时间:2011-11-03

来源:互联网

公司实习项目。在从没用过delphi的情况下,我花了大概1个月时间。
中国象棋的功能:人机和人人对弈。
1、让棋(用鼠标选择要让的棋,将帅不可让)。
2、悔棋(走几次悔几次)。
3、保存和打开棋局功能。
4、合法的走棋路线提示(当玩家点一个棋后在合法的位置画圈提示,可选功能)。
5、已经走过的路线提示(可选)。
6、跳转到任一已经走过的棋局功能。
7、红黑棋选择功能。
有完整而可靠的规则判断(如将帅不能见面等)。
人机对弈功能是核心所在。我从最初的极大极小一直改正和测试,最终是用了alpha-beta+pvs搜索算法。但是我的估值函数是用了最简单的,只含有棋子本身棋力价值的估值,没加任何别的东西。但是深度为4的情况下,门外汉已经基本将不死电脑了。
在我那台E2160CPU下,四层的深度大概用时2秒左右。5层要慢一些,十秒到几十秒。

最初我写的代码执行起来在搜索的时候相当慢,即使是不改变搜索算算法的情况下,四层搜索也要一分钟以上,真是杯具。后来我在不改变算法的情况下做了优化,主要是以下几个方面,搜索速度从一分钟变到几秒:
1、原来我存储棋子用的是string数组保存中文字符如“将”,最后我改成了integer数组,把“将”用一个整数代替,速度大约提升了一倍以上(在走法产生中要不断进行规则断定和走法测试,用string真的很慢)
2、原来我有几个走法产生中要调用的函数返回的是string类型,我改成返回integer或char类型,速度大概提升30%。
3、把N个if 语句改成case语句,并且按顺序排列,速度提升。
4、把少数的if 语句改成if then else if ,速度也小提升。
5、把 if (复杂判断语句) and/or (简单判断语句) then 中的二个判断语句的顺序调换,把简单的放在前,复杂的放在后,速度大幅提升(特别是if 在for语句中)。这个可以参考delphi编程规范中的说明。

我上面说的这些也许是大家早就知道的。但毕竟是我自己总结出来的,也给和我一样的新手做参考。

作者: mjsxjy   发布时间: 2011-11-03

牛人啊。。象棋那么多套路、规则,能算出来真牛人。。。这段时间偶尔去中国游戏中心下下棋,就在想,TNND,这如何设计的呢?

作者: luckyrandom   发布时间: 2011-11-03

顶你。 像我就做不出来的。 如果可以,希望能学习你的代码。

作者: onlyou13   发布时间: 2011-11-03

算法设计比编程难

作者: QQ56430204   发布时间: 2011-11-03