Author: Matthew White
Date: 21:56:12 07/13/03
Hi all,
I was browsing through the code in KnightCap, and I noticed the following
function. Doesn't this seem like an incorrect definition of a pinned piece? I
thought that a pinned piece was when a lower valued piece was blocking the
attack on a higher valued piece (or the king). Any ideas?
Matt
static etype find_pins(Position *b)
{
int i, j, k;
uint32 pinner_mask;
/* to find pins we loop over all pieces, looking for pieces
that are under attack by sliding pieces (but not if they
themselves are sliding pieces of the same type!). Then we
check to see if the sliding piece would attack another
piece, making it hung, if moved.
This is a expensive procedure! */
b->pinned_mask = 0;
if (b->stage == MATING)
return 0;
for (i=2;i<16;i++) {
if (!b->pieces[i].p) continue;
pinner_mask = b->topieces[b->pieces[i].pos] &
b->sliding_mask & BLACK_MASK;
while (pinner_mask) {
j = ff_one(pinner_mask);
pinner_mask &= ~(1<<j);
/* If the pinned piece is attacking the pinner then
it isn't a pin! It might be a skewer tho.
*/
if (b->topieces[b->pieces[j].pos] & (1<<i))
continue;
/* look for a piece that this bit is pinned against */
for (k=0;k<8;k++) {
if (!b->pieces[k].p) continue;
if (k == i) continue;
if (!same_line(b->pieces[j].pos, b->pieces[i].pos,
b->pieces[k].pos)) continue;
if (!empty_line(b, b->pieces[i].pos,
b->pieces[k].pos))
continue;
/* we have a likely pin. Now we need
to confirm that if the pinner could attack
the pinnedto piece then that piece
would be hung */
if (get_control(b,
b->topieces[b->pieces[k].pos] | (1<<j),
b->pieces[k].p,
b->pieces[k].pos) < 0) {
b->pinned_mask |= (1<<i);
if (debug)
lprintf(0,"w pinned %s -> %s -> %s\n",
posstr(b->pieces[j].pos),
posstr(b->pieces[i].pos),
posstr(b->pieces[k].pos)
);
}
}
}
}
for (i=18;i<32;i++) {
if (!b->pieces[i].p) continue;
pinner_mask = b->topieces[b->pieces[i].pos] &
b->sliding_mask & WHITE_MASK;
while (pinner_mask) {
j = ff_one(pinner_mask);
pinner_mask &= ~(1<<j);
/* If the pinned piece is attacking the pinner then
it isn't a pin! It might be a skewer tho.
*/
if (b->topieces[b->pieces[j].pos] & (1<<i))
continue;
/* look for a piece that this bit is pinned against */
for (k=16;k<24;k++) {
if (!b->pieces[k].p) continue;
if (k == i) continue;
if (!same_line(b->pieces[j].pos, b->pieces[i].pos,
b->pieces[k].pos)) continue;
if (!empty_line(b, b->pieces[i].pos,
b->pieces[k].pos))
continue;
/* we have a likely pin. Now we need
to confirm that if the pinner could attack
the pinnedto piece then that piece
would be hung */
if (get_control(b,
b->topieces[b->pieces[k].pos] | (1<<j),
b->pieces[k].p,
b->pieces[k].pos) > 0) {
b->pinned_mask |= (1<<i);
if (debug)
lprintf(0,"b pinned %s -> %s -> %s\n",
posstr(b->pieces[j].pos),
posstr(b->pieces[i].pos),
posstr(b->pieces[k].pos)
);
}
}
}
}
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.