公司实习项目。在从没用过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编程规范中的说明。我上面说的这些也许是大家早就知道的。但毕竟是我自己总结出来的,也给和我一样的新手做参考。

解决方案 »

  1.   

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

  2.   

    这一点最值得佩服阿。对没用过delphi人来说,一个月能入门就不错了。大侠真是天才啊最终是用了alpha-beta+pvs搜索算法,这些对我们来讲都是天书。给讲讲吧....
      

  3.   

    这个天才那肯定不是。只是我接触的语言比较多。多了就自然而然会进行类比,掌握新语言会相对快一些。至于我说的算法,大家可以百度或谷歌“极大极小算法”,或者直接找一本书叫《PC游戏编程(人机博弈)》,这书是用VC6.0写的,文字部分讲得比较详细,代码部分我没怎么看。
    说到毅力。这是实习项目啊,没办法,每天在公司也只能一门心思地思考和设计。如果不是公司任务,估计我也没多少心思做。
    要学象棋AI算法,最好能了解树、递归。
      

  4.   

    用DELPHI这么久了 还没写过游戏
    楼主开源么
      

  5.   

    嗯,我做的时候是和13楼一样的。
    但是现在要告一段落了。第二阶段是要做3D方面的小游戏,我还得花时间学习,以前也从没接触过3D。是DX方向的。不能从文件中加载模型,要自己生成,呵呵。
      

  6.   

    我见有人用C语言2维数组和QT写过象棋真是佩服啊
      

  7.   

    只有几十颗棋子,用BYTE数组代替Integer数据能进一步减少内存字节
      

  8.   

    3、把N个if 语句改成case语句,并且按顺序排列,速度提升。
    4、把少数的if 语句改成if then else if ,速度也小提升。这些似乎并不会因为这个而提升吧。 的编译器对超过3个以上的if自动优化为case语句;else编译后的汇编代码跟if then 并无太大差别; 可能是更改代码造其它原因吧。