Author: Russell Reagan
Date: 16:35:34 06/24/04
Go up one level in this thread
On June 24, 2004 at 16:25:58, Robert Hyatt wrote:
>The only bad part of the if (wtm) { } else { } type of coding is, as you
>mentioned, duplication. And yes, it leads to errors. However, in Cray Blitz
>where I didn't do this I _also_ had my fair share of bugs caused by trying to do
>things like "is this rook on the 7th rank?" and the test not working for both
>sides, or things like "is this pushing a passer to the 7th?" and then later
>changing that to 6th/7th and the change not working for one side. So probably
>there will be bugs no matter which approach you use. And the lack of "tests"
>makes what I do at least pretty easy to read...
Out of curiosity, what kind of problems did you have with, "is this rook on the
7th rank?" and "is this pushing a passer to the 7th?"? My guess is you did
something like this...
// A little code to setup the situation...
enum { white, black };
int side; // side to move, white or black
Bitboard rooks[2]; // rook bitboards, one for each color
// The test...
if (rooks[side] & rank_7_mask) { ... }
// ERROR! ------> ^^^^^^^^^^^
And instead, you should have done something like this?
// A little setup code...
Bitboard pre_promotion_rank_mask[2] = { rank_7_mask, rank_2_mask };
// The test...
if (rooks[side] & pre_promotion_rank_mask[side]) { ... }
Okay, there is probably a better (and shorter) name than
'pre_promotion_rank_mask', but you get the idea :)
Do you think this way is a good way of writing code to generically handle
bitboards? Or would you do it another way?
I guess one improvement would be to wrap the thing up in a function, so we can
try several versions and see which works the best, but this is the general idea,
correct?
Bitboard PrePromotionRankMask (int color)
{
assert((color == white) || (color == black));
static Bitboard mask[2] = { rank_7_mask, rank_2_mask };
return mask[color];
}
Bitboard PrePromotionRankMask (int color)
{
switch (color)
{
case white: return rank_7_mask;
case black: return rank_2_mask;
default: return (Bitboard)0;
}
}
Bitboard PrePromotionRankMask (int color)
{
assert((color == white0 || (color == black));
return 0x00ff000000000000 >> (color * 48);
}
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.