我在公司实习项目中,用Delphi7 做一个象棋程序。功能已经完成:规则制定,悔棋,让棋,保存棋局等,现在正在做人机对战部分。
  人机对战中,我现在先用最简单的“极大极小值”进行搜索,估值函数也只写了一个最简单的棋子价值判断。
  但是我发现我的搜索效率极低,三层深度就要几十秒
  在编写的过程中,我由于只看了Delphi的书大概16小时后就开始做了,以前也没学过delphi。
  现在我想列举几个我觉得我程序中可能会影响速度的东西,请大家看看后给我一些指导,谢谢,我想知道我写的这些对速度的影响到底大概会有多大。
  1,我把所有棋子在棋盘上的分布存储进数组时,我直接用的string存储。比如如果这个位置是“将”,那我就写array[i,j]:='将'。这样直接存储string中文,在搜索过程中会经常用到,对速度影响会不会很大?
  2,我的规则判断函数(在人机对战部分也用来做走法产生器的一部分),由于我直接存储的是string,而要判断不同的棋子的时候,我没法用case,因为case语句不能用string去判断,而是直接全写的 if qizi='士' 这样的句子来判定,结果整个规则函数里有N个if,在判断将帅不能见面时,还有一些for。这样对程序的速度影响如何?如果我一开始就把存储的信息用一些数字比如1,2等,然后全改为case语句,会不会快一些?
  3,给棋盘传新的棋子信息的时候,我用的都是如这样的:for i:=1 to 9 do
                                                         for j:=1 to 10 do
                                                             array[i,j]:=array1[i,j];这样的方法来给一个数组传递给另一个数组,请问有别的更快的方法吗,比如可以用copymemory这些吗,对速度会不会有提高?
  4,if () then x=true,然后我接着写 if x=true then {},这样的句式是不是不好。
  5,还有个地方差不多用了六七层循环,而且里面还有if语句和给数组附值语句,在极大极小搜索中还要再产生一个循环来调用它,这个地方影响是不是最大的。  谢谢大家。本人新手~望大家给点指导,谢谢!

解决方案 »

  1.   

    http://wenku.baidu.com/view/4b40de4d2b160b4e767fcf25.html
      

  2.   

    只看了Delphi的书大概16小时后就开始做?
    ——算不错了  1,我把所有棋子在棋盘上的分布存储进数组时,我直接用的string存储。比如如果这个位置是“将”,那我就写array[i,j]:='将'。这样直接存储string中文,在搜索过程中会经常用到,对速度影响会不会很大?
      2,我的规则判断函数(在人机对战部分也用来做走法产生器的一部分),由于我直接存储的是string,而要判断不同的棋子的时候,我没法用case,因为case语句不能用string去判断,而是直接全写的 if qizi='士' 这样的句子来判定,结果整个规则函数里有N个if,在判断将帅不能见面时,还有一些for。这样对程序的速度影响如何?如果我一开始就把存储的信息用一些数字比如1,2等,然后全改为case语句,会不会快一些?
      3,给棋盘传新的棋子信息的时候,我用的都是如这样的:for i:=1 to 9 do
      for j:=1 to 10 do
      array[i,j]:=array1[i,j];这样的方法来给一个数组传递给另一个数组,请问有别的更快的方法吗,比如可以用copymemory这些吗,对速度会不会有提高?
    ——最好整个mxn的棋盘,使用一个mxn长的字符串
    ——s[i*m+j]:='J';就可以使用case了
    ——赋值s1:=s;非常方便
      4,if () then x=true,然后我接着写 if x=true then {},这样的句式是不是不好。
    ——if x then就行了  5,还有个地方差不多用了六七层循环,而且里面还有if语句和给数组附值语句,在极大极小搜索中还要再产生一个循环来调用它,这个地方影响是不是最大的。