读书人

Delphi版的中国象棋终于接近完工了说

发布时间: 2012-02-11 09:51:35 作者: rapoo

Delphi版的中国象棋终于接近完工了,说点心得(关于提升搜索速度的)。
公司实习项目。在从没用过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编程规范中的说明。

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

[解决办法]
牛人啊。。象棋那么多套路、规则,能算出来真牛人。。。这段时间偶尔去中国游戏中心下下棋,就在想,TNND,这如何设计的呢?
[解决办法]
顶你。 像我就做不出来的。 如果可以,希望能学习你的代码。
[解决办法]
算法设计比编程难
[解决办法]
你说的那几点提速方法,已经是骨灰级的了。在平常的应用中应注意养成良好的语法习惯。
[解决办法]
楼主有毅力,我现在就是拿不出心情来写代码,不知道为啥。。。
[解决办法]

探讨
公司实习项目。在从没用过delphi的情况下,我花了大概1个月时间。

[解决办法]
用DELPHI这么久了 还没写过游戏
楼主开源么
[解决办法]
求思路
算法上

[解决办法]
求软件
[解决办法]
我用的是二维整形数组,1表示红车,2表示红马,11表示黑车,12表示黑马等
[解决办法]
我见有人用C语言2维数组和QT写过象棋真是佩服啊
[解决办法]
楼主 很强悍,我现在也想做一个中国象棋 但是一点思路都没,希望楼主有时间能指点一下 谢谢
[解决办法]
佩服...楼主太牛了.
[解决办法]
3、把N个if 语句改成case语句,并且按顺序排列,速度提升。
4、把少数的if 语句改成if then else if ,速度也小提升。

这些似乎并不会因为这个而提升吧。 的编译器对超过3个以上的if自动优化为case语句;else编译后的汇编代码跟if then 并无太大差别; 可能是更改代码造其它原因吧。
[解决办法]
经验记录了。。。马克思大林志玲。。。

读书人网 >.NET

热点推荐