Computer Chess Club Archives


Search

Terms

Messages

Subject: Floodfilling attacks

Author: Matthias Gemuh

Date: 04:55:47 10/25/02



Hi Experts,

I tried to floodfill attacks with the knowledge+code discussed in this forum.

Is this resulting code wrong ? (seems to work fine).
Very slow ! Any speed-up ideas ? Gerd Isenberg's asm was not fully
accepted by my Borland C++ Builder 5. Thanks.

/Matthias.


#define SHIFTDOWN(b)      ((b)>>8)
#define SHIFTUP(b)        ((b)<<8)
#define SHIFTRIGHT(b)     ((((b)<<1)&0xFEFEFEFEFEFEFEFE))
#define SHIFTLEFT(b)      ((((b)>>1)&0x7F7F7F7F7F7F7F7F))
#define SHIFTLEFTUP(b)    ((((b)<<7)&0x7F7F7F7F7F7F7F7F))
#define SHIFTRIGHTUP(b)   ((((b)<<9)&0xFEFEFEFEFEFEFEFE))
#define SHIFTLEFTDOWN(b)  ((((b)>>9)&0x7F7F7F7F7F7F7F7F))
#define SHIFTRIGHTDOWN(b) ((((b)>>7)&0xFEFEFEFEFEFEFEFE))

BITBOARD getBishopAttacks(BITBOARD bishops, BITBOARD freeSquares)
{
    BITBOARD attck = 0;
    BITBOARD rightup   = SHIFTRIGHTUP(bishops);
    BITBOARD rightdown = SHIFTRIGHTDOWN(bishops);
    BITBOARD leftup    = SHIFTLEFTUP(bishops);
    BITBOARD leftdown  = SHIFTLEFTDOWN(bishops);
    attck |= rightup|rightdown|leftup|leftdown;
    for (int i=0; i<7; i++) {
        rightup   = SHIFTRIGHTUP(rightup&freeSquares);
        rightdown = SHIFTRIGHTDOWN(rightdown&freeSquares);
        leftup    = SHIFTLEFTUP(leftup&freeSquares);
        leftdown  = SHIFTLEFTDOWN(leftdown&freeSquares);
        attck |= rightup|rightdown|leftup|leftdown;
    }
    return (attck);
}

BITBOARD getRookAttacks(BITBOARD rooks, BITBOARD freeSquares)
{
    BITBOARD attck = 0;
    BITBOARD left  = SHIFTLEFT(rooks);
    BITBOARD right = SHIFTRIGHT(rooks);
    BITBOARD up    = SHIFTUP(rooks);
    BITBOARD down  = SHIFTDOWN(rooks);
    attck |= left|right|up|down;
    for (int i=0; i<7; i++) {
        left  = SHIFTLEFT(left&freeSquares);
        right = SHIFTRIGHT(right&freeSquares);
        up    = SHIFTUP(up&freeSquares);
        down  = SHIFTDOWN(down&freeSquares);
        attck |= left|right|up|down;
    }
    return (attck);
}


BITBOARD getQueenAttacks(BITBOARD queens, BITBOARD freeSquares)
{
    BITBOARD attck = 0;
    BITBOARD rightup   = SHIFTRIGHTUP(queens);
    BITBOARD rightdown = SHIFTRIGHTDOWN(queens);
    BITBOARD leftup    = SHIFTLEFTUP(queens);
    BITBOARD leftdown  = SHIFTLEFTDOWN(queens);
    BITBOARD left  = SHIFTLEFT(queens);
    BITBOARD right = SHIFTRIGHT(queens);
    BITBOARD up    = SHIFTUP(queens);
    BITBOARD down  = SHIFTDOWN(queens);
    attck |= rightup|rightdown|leftup|leftdown|left|right|up|down;
    for (int i=0; i<7; i++) {
        rightup   = SHIFTRIGHTUP(rightup&freeSquares);
        rightdown = SHIFTRIGHTDOWN(rightdown&freeSquares);
        leftup    = SHIFTLEFTUP(leftup&freeSquares);
        leftdown  = SHIFTLEFTDOWN(leftdown&freeSquares);
        left  = SHIFTLEFT(left&freeSquares);
        right = SHIFTRIGHT(right&freeSquares);
        up    = SHIFTUP(up&freeSquares);
        down  = SHIFTDOWN(down&freeSquares);
        attck |= rightup|rightdown|leftup|leftdown|left|right|up|down;
    }
    return (attck);
}





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.