探索木のvalidatorを書こう!! その4
あと、is_move_validのソースコード上で
// fromが81未満 == 盤面内の駒の移動 if ( from < nsquare ) { // 動かす駒 piece_move = (int)I2PieceMove(move); if ( turn ) { // 後手ならば // 移動元のところにあるのは後手の駒でなければならない if ( BOARD[from] != -piece_move ) { return 0; } // 移動先にある駒は、先手の駒か、0(空のマス)でなければならない。 if ( BOARD[to] != (int)UToCap(move) ) { return 0; } } else { // 先手ならば // 移動元のところにあるのは先手の駒でなければならない if ( BOARD[from] != piece_move ) { return 0; } // 移動先にある駒は、後手の駒か、0(空のマス)でなければならない。 if ( BOARD[to] != -(int)UToCap(move) ) { return 0; } }
※ ソース上のコメントは私が追加しておきました。
UToCapというのは指し手を表現する構造体(32bit整数)から、捕獲した駒を取り出すためのマクロです。また、Bonanzaでは駒は、正の値が先手の駒、負の値が後手の駒、0だと駒がないことを表現するようになっています。
この -(int)UToCap(move) の部分がなかなか感慨深いわけです。ここでマイナスをつけることにより、
・UToCap(move)の値が0ならば0に
・駒があればUToCap(move)は正の値になりますが、そこにマイナス符号をつけることによって、後手の駒を表す値に
なるからです。
要するに、UToCapで駒種を得たあと(0の場合もある)、それを後手の駒に変換しているわけです。駒種が0(捕獲した駒なし)の場合、0(空白のマスを表現する)に変換されます。
この部分は、なかなかうまく出来ています。
これをもし、駒を無符号型で持つように設計していた場合どうなるでしょうか?(私はそういう設計でコードを書いています。)
つまり、私のコードは、
// 駒の定数定義。成は+8になるようにしておく enum PieceEnum : Piece { piece_empty = 0, // 駒なし pawn, // 歩 : 1 lance, // 香 : 2 knight, // 桂 : 3 silver, // 銀 : 4 gold, // 金 : 5 bishop, // 角 : 6 rook, // 飛 : 7 king, // 王 : 8 pro_pawn, // と : 1+8 = 9 pro_lance, // 香成 : 2+8 = 10 pro_knight, // 桂成 : 3+8 = 11 pro_silver, // 銀成 : 4+8 = 12 piece_null, // 空き horse, // 馬 : 6+8 = 14 dragon, // 龍 : 7+8 = 15 piece_promote = 8, // 成り になると +8 piece_enemy = 16, // 敵の駒は + 16 bad_piece = 32 , // エラーを表現する駒値 };
となっており、敵の駒(後手の駒)だと、値を+16するようになっています。
さて、問題です。私のように設計した場合、 -(int)UToCap(move) に相当する部分はどう書けるでしょうか?なるべく速いコードを求みます!
↓コメント欄で↓