Bonanzaの駒の価値はどこに書かれているのか その3

p_value,p_value_exの解説は終わりまして、今回はp_value_pmという配列についての解説です。

だいたい、Cで書かれたプログラムというのは、型がどれもこれもintになっていたりして、型を見ても何をする変数なのかさっぱりわからないのが実情なんですよね。

じゃあその変数が何をする変数なのかを解釈しようと思うと、まず
1.変数名を見て、その意味を考える
2.その変数がどこでどのように使われているかをgrepなどで調べていく
というアプローチになります。

これって、考古学者が昔の言葉を調べるプロセスにとても似ていますね。
言葉は、辞書のようなものがあって、そこで定義されるのでなければ、その言葉が実際にどう使われているかに頼らざるを得ないわけです。意味論的に決定されるのでなければ、語用論によって決定すべしとでも言いましょうか。

まあ、そんなわけでまずp_value_pmという変数名からは、piece value(駒に関する価値)であることは容易に想像がつきますが、最後のpmが少しわからない。

1. promte piece material = 成り駒の価値
2. promote piece - material = 成駒と素の駒(非成駒)との価値の差

だとか、いろんな想像が出来ます。名前からですと1.のように見えますが、この配列がshogi.hで以下のように使われているのを見れば、これが2.の意味であることがわかります。

#if defined(MINIMUM)
(中略)
#  define MT_PRO_PAWN       ( DProPawn   - DPawn )
#  define MT_PRO_LANCE      ( DProLance  - DLance )
#  define MT_PRO_KNIGHT     ( DProKnight - DKnight )
#  define MT_PRO_SILVER     ( DProSilver - DSilver )
#  define MT_PRO_BISHOP     ( DHorse     - DBishop )
#  define MT_PRO_ROOK       ( DDragon    - DRook )
(中略)
#else
(中略)
#  define MT_PRO_PAWN       ( p_value_pm[ 7 + pawn ] )
#  define MT_PRO_LANCE      ( p_value_pm[ 7 + lance ] )
#  define MT_PRO_KNIGHT     ( p_value_pm[ 7 + knight ] )
#  define MT_PRO_SILVER     ( p_value_pm[ 7 + silver ] )
#  define MT_PRO_BISHOP     ( p_value_pm[ 7 + bishop ] )
#  define MT_PRO_ROOK       ( p_value_pm[ 7 + rook ] )

例によってオフセットとして7を足してあるのは、absを避けるためですね。また、p_value_pmの添字としては成駒の値(8以上)は渡さないので、この配列のサイズは15となっています。


この配列の値の初期化は次のようになっています。

  for ( i = 0; i < 15; i++ ) { p_value_pm[i] = 0; }
(中略)
  p_value_pm[7+pawn]     = p_value[15+pro_pawn]   - p_value[15+pawn];
  p_value_pm[7+lance]    = p_value[15+pro_lance]  - p_value[15+lance];
  p_value_pm[7+knight]   = p_value[15+pro_knight] - p_value[15+knight];
  p_value_pm[7+silver]   = p_value[15+pro_silver] - p_value[15+silver];
  p_value_pm[7+bishop]   = p_value[15+horse]      - p_value[15+bishop];
  p_value_pm[7+rook]     = p_value[15+dragon]     - p_value[15+rook];
(中略)
  p_value_pm[7-pawn]     = p_value_pm[7+pawn];
  p_value_pm[7-lance]    = p_value_pm[7+lance];
  p_value_pm[7-knight]   = p_value_pm[7+knight];
  p_value_pm[7-silver]   = p_value_pm[7+silver];
  p_value_pm[7-bishop]   = p_value_pm[7+bishop];
  p_value_pm[7-rook]     = p_value_pm[7+rook];

p_value_exのときと同様なので難しくないと思います。
また、p_value_pmは、非負の値なので後手番ならばマイナスの値にしたい場合などは、次のように手番で場合分けして、マイナス符号をつけてやる必要があります。

evaldiff.c(207):
	diff += turn ? -p_value_pm[7+ipc_move] : p_value_pm[7+ipc_move];

つづく