/* 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); } }
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; }
/* 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]; } }