Author: Ricardo Gibert
Date: 23:38:34 07/13/03
Go up one level in this thread
On July 14, 2003 at 02:00:39, Ricardo Gibert wrote: >On July 14, 2003 at 00:56:12, Matthew White wrote: > >>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? > >White: Re1 >Black: Be6, Pe7, Pf7 > >The B is pinned, since if it is moved, the pawn on e7 drops. Note the B is of >greater value than the P. > >If we remove the Pf7, then we have a skewer instead. The B must move and give up >the P. Here's a contrived example that is contrary to the 1st comment in the source below: White: Re3, Pf2, Pf3, Pd2 Black: Re6, Pe7, Pf7 The Re6 can't move off the e-file, since that would leave Pe7 undefended. The Re6 also can't take the Re3, since that would repair the White pawn structure. Therefore the Re6 is pinned even though it is a sliding piece of the same type as Re3. Note the Re6 is again of greater value than the Pe7. > >> >>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.01 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.