Author: Sune Fischer
Date: 17:48:00 03/24/04
Go up one level in this thread
On March 24, 2004 at 18:59:02, Gerd Isenberg wrote:
>Some minor changes because inOne == inThree is not general enough.
>Better to look for no further growing:
>if ( (inThree & ~(fromBB|inOne|inTwo)) == 0 && ...
>
>
>// fixed is subset of tabu (may be equal), the set of all own blocked
>// and backward pawns.
>// tabu may contain enemy pawn attacks which don't terminate the attack ray
>
>BitBoard getTrappedBishopSquares(BitBoard fixed, BitBoard tabu, int n)
>{
> BitBoard trappedBishopSquares = 0;
> BitBoard potb = ~tabu;
> while ( potb ) {
> BitBoard fromBB = potb & -potb;
> BitBoard inOne = fillBishopAttacks(fromBB, ~fixed) & ~tabu;
> BitBoard inTwo = fillBishopAttacks(inOne, ~fixed) & ~tabu;
> BitBoard inThree = fillBishopAttacks(inTwo, ~fixed) & ~tabu;
> // tag all reachable in up to three moves as done
> potb &= ~(fromBB|inOne|inTwo|inThree);
> inThree &= ~(fromBB|inOne|inTwo); // growing?
> if ( inThree == 0 && popCount(inOne|inTwo) < n )
> trappedBishopSquares |= (fromBB|inOne|inTwo);
> }
> return trappedBishopSquares;
>}
>
>popCount > n considers the whole fill area reachable in two moves.
Hi Gerd,
I have not fully understood what it is you do.
Can you explain what the while loop does?
I was think one could just do something like
bb = FillBishopOccluded((D4|D5|E4|E5),~tabu);
bb = FillBishopOccluded(bb,~tabu);
return (~FillBishopOccluded(bb,~tabu));
So all those squares not reachable from the center is trappable squares.
It needs to be done for both sides, as the tabu isn't the same for black and
white, assuming I have understood it correctly that is.
-S.
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.