Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Position representation

Author: Sean Mintz

Date: 15:45:40 01/22/02

Go up one level in this thread


Test checking is a ripoff of the move generator. I'm working on a program with a
friend from FICS and making it so it passes positions around as opposed to
having a global board. This is slower but a lot nicer to work with. This isn't
exactly pointless rambling, it's just that the function was almost free before
this --- so it can make life pretty easy.

The 'piece_array_*[*]' are just arrays of offsets for movement.

Here are the functions:

int is_checked(Position * board, int side) {
        if (side == WHITE) {
                return is_attacked(board, board->wk_loc, BLACK);
        } else if (side == BLACK) {
                return is_attacked(board, board->bk_loc, WHITE);
        }

        return 1;
}

int is_attacked(Position * board, int sq, int side) {
        int i,
            j;

        for (i=0; i<4; i++) {
                j = sq;

                while (!(j & 0x88)) {
                        j += piece_array_rook[i];

                        if (board->color[j] == EMPTY) {
                                continue;
                        } else if (board->color[j] != side) {
                                break;
                        } else if ((board->piece[j] == QUEEN) ||
(board->piece[j] == ROOK)) {
                                return 1;
                        } else {
                                break;
                        }
                }

                j = sq;

                while (!(j & 0x88)) {
                        j += piece_array_bishop[i];

                        if (board->color[j] == EMPTY) {
                                continue;
                        } else if (board->color[j] != side) {
                                break;
                        } else if ((board->piece[j] == QUEEN) ||
(board->piece[j] == BISHOP)) {
                                return 1;
                        } else {
                                break;
                        }
                }
        }

        for (i=0; i<8; i++) {
                j = sq + piece_array_knight[i];

                if ((board->color[j] == side) && (board->piece[j] == KNIGHT)) {
                        return 1;
                }

                j = sq + piece_array_king[i];

                if ((board->color[j] == side) && (board->piece[j] == KING)) {
                        return 1;
                }
        }

        if (side == WHITE) {
                if ((board->color[sq + 15] == WHITE) && (board->piece[sq + 15]
== PAWN)) {
                        return 1;
                }
                if ((board->color[sq + 17] == WHITE) && (board->piece[sq + 17]
== PAWN)) {
                        return 1;
                }
        } else if (side == BLACK) {
                if ((board->color[sq - 15] == BLACK) && (board->piece[sq - 15]
== PAWN)) {
                        return 1;
                }
                if ((board->color[sq - 17] == BLACK) && (board->piece[sq - 17]
== PAWN)) {
                        return 1;
                }
        }

        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.