Author: Ricardo Gibert
Date: 07:54:29 07/14/03
Go up one level in this thread
On July 14, 2003 at 03:19:37, Matthew White wrote: >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. >> >Would a hanging pieces function pick that up more effectively? I'm not sure what you mean. In any case, I'm probably not the right person to ask this question. >>> >>>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.