Home * Evaluation * Endgame * Mating in KBNK

A checkmate with a bishop and a knight against a lone king is delivered in the corner that can be covered by a bishop of the attacking side. For that reason a program ought to use a separate piece-square table for the position of the opponent king in order to drive it to the correct corner. Draw cases due to tactical loss of one of the pieces [1] or the stalemate trap are left to the search routine.


Corner-Distance

Alternatively, following Bit-twiddling determines the Manhattan-Distance to the closest corner square of the bishop square color, which might be used as a bonus for the lonesome king. First, the color of the bishop square is determined by a multiplication based on 9, to find whether its file and rank sum is odd or even. It is done that way, that an odd sum results in the sign-bit set, to build a mask by shifting arithmetically right and to conditionally flip the file of the king square, so that squares 0 and 63 become the relevant corner squares. The king's Corner Manhattan-distance is then simply the sum of its rank and file indices, if it exceeds 7 the difference to 14 is taken to force the symmetry, mirrored along the diagonal or anti-diagonal.
 0 1 2 3 4 5 6 7     7 6 5 4 3 2 1 0
 1 2 3 4 5 6 7 6     6 7 6 5 4 3 2 1
 2 3 4 5 6 7 6 5     5 6 7 6 5 4 3 2
 3 4 5 6 7 6 5 4     4 5 6 7 6 5 4 3
 4 5 6 7 6 5 4 3     3 4 5 6 7 6 5 4
 5 6 7 6 5 4 3 2     2 3 4 5 6 7 6 5
 6 7 6 5 4 3 2 1     1 2 3 4 5 6 7 6
 7 6 5 4 3 2 1 0     0 1 2 3 4 5 6 7

/**
 * manhattanDistance2ClosestCornerOfBishopSquareColor
 *   for KBNK purpose
 * @author Gerd Isenberg
 * @param b bishop square (to determine its square color)
 * @param k opponent king square (0..63)
 * @return manhattanDistance to the closest corner square
 *         of the bishop square color
 */
int manhattanDistance2ClosestCornerOfBishopSquareColor(int b, int k)
{
   b =  -1879048192*b >> 31; // 0 | -1 to mirror
   k = (k>>3) + ((k^b) & 7); // rank + (mirrored) file
   k = (15*(k>>3)^k)-(k>>3); // if (k > 7) k = 14 - k
   return k;
}
which results in following x86 Assembly:
?manhattanDistance2ClosestCornerOfBishopSquareColor PROC NEAR
; _b$ = ecx
; _k$ = edx
  00000    69 c9 00 00 00 90 imul ecx, 90000000H
  00006    c1 f9 1f          sar  ecx, 31
  00009    33 ca             xor  ecx, edx
  0000b    c1 fa 03          sar  edx, 3
  0000e    83 e1 07          and  ecx, 7
  00011    03 ca             add  ecx, edx
  00013    8b d1             mov  edx, ecx
  00015    c1 fa 03          sar  edx, 3
  00018    8b c2             mov  eax, edx
  0001a    6b c0 0f          imul eax, 15
  0001d    33 c1             xor  eax, ecx
  0001f    2b c2             sub  eax, edx
  00021    c3                ret  0

See also


Publications


Forum Posts


External links


References

  1. ^ Re: Search with bitbase by Joona Kiiski, CCC, September 05, 2012

What links here?


Up one Level