C/C++中国象棋程序入门与提高
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

5.3 新的价值数组

要获取每一个棋子的价值,还要进行一次函数的调用,PieceValue[IntToSubscript(i)]。这是因为在PieceValue数组中,相同棋子的价值只出现了一次,而在程序中每一个棋子都有一个唯一的整数值替代。如红方两个车,分别为23,24,它们对应到PieceValue数组的同一个下标4。这只能通过额外的处理来实现。那棋子的价值能否直接取得呢?

还记得每一个棋子的整数值吗?红方从16到31,黑方从32到47。将PieceValue数组从8个元素扩充到48个,为每一个棋子单独设置一个价值。

          int PieceValue[48] = {
          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
          1000,20,20,20,20,40,40,90,90,45,45,10,10,10,10,10,
          1000,20,20,20,20,40,40,90,90,45,45,10,10,10,10,10}

如果已知一个棋子,如红方的一个车,编码为23,其价值就是PieceValue[23]。已知一个棋子的整数编码值pc,那PieceValue[pc]就是棋子对应的价值了。

修改程序5-2,得到新的代码如下。

程序代码

          short Eval(void)
          {
              int i;
              short bValue,wValue;
              bValue = wValue = 0;
              for(i=16; i<32; i++)
              {
                if(piece[i]>0)
                    wValue = wValue + PieceValue[i];
              }
              for(i=32; i<48; i++)
              {
                if(piece[i]>0)
                    bValue = bValue + PieceValue[i];
              }
              return wValue - bValue;
          }

代码技巧

PieceValue[i] 显然比前面的PieceValue[IntToSubscript(board[p]) 及PieceValue [IntToSubscript(i)]效率都要高。

别小看了这个评估函数,配合搜索4步的搜索函数,也足以应付初学者了。

参见程序5-3.cpp。