From: H.G. Muller Date: Wed, 11 May 2011 21:06:20 +0000 (+0200) Subject: Take account of holdings in book key X-Git-Url: http://winboard.nl/cgi-bin?p=xboard.git;a=commitdiff_plain;h=0d4aa8b0a16c1ee2bcaf4120ef37ba4d1492206e Take account of holdings in book key The board is numbered by rank, for comptibility with Polyglot format, starting at a1. We then continue counting in the holdings 'files', in up-rank direction, each holding spanning the full board height (even if it is not fully used). Firstthe left (black) holdings, then the right, Even in Shogi this limits the square number to < 99, which is below the absolute limit of 128 (where we would run out of hash keys). --- diff --git a/book.c b/book.c index e5a6030..3a764b9 100644 --- a/book.c +++ b/book.c @@ -276,17 +276,21 @@ uint64 *RandomTurn =Random64+780; uint64 hash(int moveNr) { int r, f, p_enc, squareNr, pieceGroup; - uint64 key=0, Zobrist; + uint64 key=0, holdingsKey=0, Zobrist; - for(f=BOARD_LEFT; f= (int)BlackPawn) ? (int)BlackPawn :(int)WhitePawn; if(j > (int)WhiteQueen) j++; // make space for King if(j > (int) WhiteKing) j = (int)WhiteQueen + 1; p_enc = 2*j + ((int)p < (int)BlackPawn); + // holdings squares get nmbers immediately after board; first left, then right holdings + if(f == BOARD_LEFT-2) squareNr = (BOARD_RGHT - BOARD_LEFT)*BOARD_HEIGHT + r; else + if(f == BOARD_RGHT+1) squareNr = (BOARD_RGHT - BOARD_LEFT + 1)*BOARD_HEIGHT + r; else squareNr = (BOARD_RGHT - BOARD_LEFT)*r + (f - BOARD_LEFT); // note that in normal Chess squareNr < 64 and p_enc < 12. The following code // maps other pieces and squares in this range, and then modify the corresponding @@ -306,11 +310,13 @@ uint64 hash(int moveNr) break; } if(squareNr >= 64) Zobrist = (Zobrist << 8) ^ (Zobrist >> 56); + // holdings have separate (additive) key, to encode presence of multiple pieces on same square + if(f == BOARD_LEFT-2) holdingsKey += Zobrist * boards[moveNr][r][f+1]; else + if(f == BOARD_RGHT+1) holdingsKey += Zobrist * boards[moveNr][r][f-1]; else key ^= Zobrist; } } } - // Holdings not implemented yet! if(boards[moveNr][CASTLING][2] != NoRights) { if(boards[moveNr][CASTLING][0] != NoRights) key^=RandomCastle[0]; @@ -341,7 +347,7 @@ uint64 hash(int moveNr) if(WhiteOnMove(moveNr)){ key^=RandomTurn[0]; } - return key; + return key + holdingsKey; } #define MOVE_BUF 100