上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。