Author: James Long
Date: 21:18:30 01/24/99
Go up one level in this thread
On January 24, 1999 at 19:04:24, Will Singleton wrote:
>On January 24, 1999 at 08:02:16, Frank Schneider wrote:
>
>>I once added recognition of pins (to the king), but it was slower and did
>>influence the searchresults only a little.
>>
>
>Frank,
>
>I get burned by pins more than I like. Do you have any specific pin code at
>all?
>
>Will
I'll share mine with you.
The basic idea is to see if "psq" (pinned square)
is pinned to the piece on "sq."
The first test is to see if they
are on the same file, rank, or diagonal.
The second test is to check for pieces
between the two squares (making a pin impossible).
Finally, look on the other side of "psq"
for a piece capable of pinning (i.e. an enemy
bishop or queen for diagonals).
Notice you can use this function to look
for "material pins," too. For example, seeing
if the knight on F3 is pinned to the queen
on D1...
Hope this helps. :-)
---
James
int Pinned(int psq,int sq)
{
/*
see if the two squares are on the same file or
rank. if not, no pin is possible.
*/
if (!bearing[sq][psq]) return (0);
/*
we have a "relationship". look for pieces
between the squares, meaning a pin is impossible.
*/
if (in_between[psq][sq] & (gpos.whitepieces | gpos.blackpieces))
return (0);
/*
there is a clear path between squares. look for
an attacker on the other side of <psq>.
*/
int pinner;
if (gpos.piece[sq]>empty) {
switch (bearing[sq][psq]) {
case EAST:
pinner = gpos.piece[LSB(
to_boundary[psq][6] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==-queen || pinner==-rook)
return (1);
break;
case WEST:
pinner = gpos.piece[MSB(
to_boundary[psq][2] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==-queen || pinner==-rook)
return (1);
break;
case SOUTH:
pinner = gpos.piece[LSB(
to_boundary[psq][4] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==-queen || pinner==-rook)
return (1);
break;
case NORTH:
pinner = gpos.piece[MSB(
to_boundary[psq][0] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==-queen || pinner==-rook)
return (1);
break;
case SOUTHWEST:
pinner = gpos.piece[LSB(
to_boundary[psq][3] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==-queen || pinner==-bishop)
return (1);
break;
case NORTHEAST:
pinner = gpos.piece[MSB(
to_boundary[psq][7] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==-queen || pinner==-bishop)
return (1);
break;
case SOUTHEAST:
pinner = gpos.piece[LSB(
to_boundary[psq][5] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==-queen || pinner==-bishop)
return (1);
break;
case NORTHWEST:
pinner = gpos.piece[MSB(
to_boundary[psq][1] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==-queen || pinner==-bishop)
return (1);
break;
}
}
else {
switch (bearing[sq][psq]) {
case EAST:
pinner = gpos.piece[LSB(
to_boundary[psq][6] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==queen || pinner==rook)
return (1);
break;
case WEST:
pinner = gpos.piece[MSB(
to_boundary[psq][2] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==queen || pinner==rook)
return (1);
break;
case SOUTH:
pinner = gpos.piece[LSB(
to_boundary[psq][4] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==queen || pinner==rook)
return (1);
break;
case NORTH:
pinner = gpos.piece[MSB(
to_boundary[psq][0] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==queen || pinner==rook)
return (1);
break;
case SOUTHWEST:
pinner = gpos.piece[LSB(
to_boundary[psq][3] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==queen || pinner==bishop)
return (1);
break;
case NORTHEAST:
pinner = gpos.piece[MSB(
to_boundary[psq][7] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==queen || pinner==bishop)
return (1);
break;
case SOUTHEAST:
pinner = gpos.piece[LSB(
to_boundary[psq][5] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==queen || pinner==bishop)
return (1);
break;
case NORTHWEST:
pinner = gpos.piece[MSB(
to_boundary[psq][1] & (gpos.whitepieces | gpos.blackpieces))];
if (pinner==queen || pinner==bishop)
return (1);
break;
}
}
/* should never reach this point */
return (0);
}
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.