Exemple #1
0
/* Get all the moves of the piece in the specified square */
void getMoves(Board *brd, MoveList *list, int square) {

    int piece;

    list->numMoves = 0;
    piece = brd->piecesBySquare[square];
    if(piece == wPawn || piece == bPawn) {
        getPawnMoves(brd, list, square);
    } else if(piece == wKnight || piece == bKnight) {
        getDiscMoves(brd, list, square);
    } else if (piece == wKing || piece == bKing) {
        getCastlingMoves(brd, list, square);
        getDiscMoves(brd, list, square);
    } else if(piece == wRook || piece == bRook) {
        getCastlingMoves(brd, list, square);
        getContMoves(brd, list, square);
    } else if(piece == wQueen || piece == wBishop || piece == bQueen || piece == bBishop) {
        getContMoves(brd, list, square);
    }

}
Exemple #2
0
static int getPieceMoves(const position * const pos, const int player, const int type, bitboard rawMoves, const int sq, move store[])
{
    int numMoves = 0;
    int target = 0;
    move m;
    move temp;
    int valueCaptured;
    int valueThis;
    while(rawMoves != 0) {
        if(LSB_SET(rawMoves)) {
            m.from = sq;
            m.to = target;
            m.flags = 0;
            m.promoteTo = 0;
            m.thisPiece = pos->board[sq];
            m.capturedPiece = 0;
            m.eval = 0;
            if(CAPTURE == type) {
                m.flags |=  CAPTURE;
            }
            if(target == pos->epSquare) { /* deal with en passant */
                m.flags |= EN_PASSANT;
                if(WHITE == player) {
                    m.capturedPiece = BLACK_PAWN;
                }
                else {
                    m.capturedPiece = WHITE_PAWN;
                }
                m.eval += WHITE_PAWN; /* worth one pawn */
            }
            else {
                m.capturedPiece = pos->board[target]; /* will be 0 if target is empty square */
                /* following logic works even if non-capture, i.e. to square is empty */
                valueCaptured = abs(m.capturedPiece);
                valueThis = abs(m.thisPiece);
                m.eval += valueCaptured;
                if(valueCaptured > valueThis) {
                    m.eval += valueCaptured - valueThis;
                }
            }
            if(IS_PAWN(m.thisPiece) && IS_PROMOTION_SQUARE(player, m.to)) {
                m.flags |= PROMOTION;
                temp = m;
                if(WHITE == player) {
                    /* promote to queen */
                    m.promoteTo = WHITE_QUEEN;
                    m.eval += WHITE_QUEEN;
                    storeMoveIfLegal(pos, &m, player, store, &numMoves);
                    m = temp;
                    /* promote to rook */
                    m.promoteTo = WHITE_ROOK;
                    m.eval += WHITE_ROOK;
                    storeMoveIfLegal(pos, &m, player, store, &numMoves);
                    m = temp;
                    /* promote to bishop */
                    m.promoteTo = WHITE_BISHOP;
                    m.eval += WHITE_BISHOP;
                    storeMoveIfLegal(pos, &m, player, store, &numMoves);
                    m = temp;
                    /* promote to knight */
                    m.promoteTo = WHITE_KNIGHT;
                    m.eval += WHITE_KNIGHT;
                    storeMoveIfLegal(pos, &m, player, store, &numMoves);
                }
                else {
                    /* promote to queen */
                    m.promoteTo = BLACK_QUEEN;
                    storeMoveIfLegal(pos, &m, player, store, &numMoves);
                    m = temp;
                    /* promote to rook */
                    m.promoteTo = BLACK_ROOK;
                    storeMoveIfLegal(pos, &m, player, store, &numMoves);
                    m = temp;
                    /* promote to bishop */
                    m.promoteTo = BLACK_BISHOP;
                    storeMoveIfLegal(pos, &m, player, store, &numMoves);
                    m = temp;
                    /* promote to knight */
                    m.promoteTo = BLACK_KNIGHT;
                    storeMoveIfLegal(pos, &m, player, store, &numMoves);
                }
            }
            else {
                storeMoveIfLegal(pos, &m, player, store, &numMoves);
            }
        }
        rawMoves = rawMoves >> 1;
        target++;
    }
    /* castling */
    if(NORMAL == type && IS_KING(pos->board[sq])) {
        getCastlingMoves(pos, player, store, &numMoves);
    }
    return numMoves;
}
Exemple #3
0
/* Create a list of a player's all possible moves */
void makeMoveList(Board *brd, MoveList *list) {

    int piece, square, pieceNum, i, pieceIndex;

	list->numMoves = 0;

    /* Pawns */

	if(brd->side == WHITE) {

		for(pieceNum = 0; pieceNum < brd->pieceNum[wPawn]; pieceNum++) {
            getPawnMoves(brd, list, brd->squaresByPieces[wPawn][pieceNum]);
		}

	} else { /* same, but for black */

       for(pieceNum = 0; pieceNum < brd->pieceNum[bPawn]; pieceNum++) {
            getPawnMoves(brd, list, brd->squaresByPieces[bPawn][pieceNum]);
		}

    }

    /* Castling */

    if(brd->side == WHITE) {

		getCastlingMoves(brd, list, E1);

	} else { /* same, but for black */

        getCastlingMoves(brd, list, E8);

    }


	/* Continuous pieces for both colors */

	if (brd->side == WHITE) {
        pieceIndex = 0;
	} else {
	    pieceIndex = 3;
    }

    piece = contPieces[pieceIndex];

	for(i = 0; i < 3; i++) {

		for(pieceNum = 0; pieceNum < brd->pieceNum[piece]; pieceNum++) {

			square = brd->squaresByPieces[piece][pieceNum];
			getContMoves(brd, list, square);

		}
		piece = contPieces[++pieceIndex];
	}

	/* Discrete Pieces */

	if (brd->side == WHITE) {
        pieceIndex = 0;
	} else {
	    pieceIndex = 2;
    }

    piece = discPieces[pieceIndex];

	for(i = 0; i < 2; i++) {

		for(pieceNum = 0; pieceNum < brd->pieceNum[piece]; pieceNum++) {
			square = brd->squaresByPieces[piece][pieceNum];
            getDiscMoves(brd, list, square);
		}

		piece = discPieces[++pieceIndex];
	}

}