void MoveGenerator::AddBlackPawnMove(const Board *gameboard, const int from_sq, const int to_sq, MOVELIST *move_list) { if (rank_of[from_sq] == RANK_2) { AddQuietMove(gameboard, MOVE(from_sq,to_sq,EMPTY,BLACK_QUEEN,0), move_list); AddQuietMove(gameboard, MOVE(from_sq,to_sq,EMPTY,BLACK_ROOK,0), move_list); AddQuietMove(gameboard, MOVE(from_sq,to_sq,EMPTY,BLACK_BISHOP,0), move_list); AddQuietMove(gameboard, MOVE(from_sq,to_sq,EMPTY,BLACK_KNIGHT,0), move_list); } else AddQuietMove(gameboard, MOVE(from_sq,to_sq,EMPTY,EMPTY,0), move_list); }
static void AddBlackPawnMove(const S_BOARD *pos, const int from, const int to, S_MOVELIST *list) { ASSERT(SqOnBoard(from)); ASSERT(SqOnBoard(to)); if(RanksBrd[from] == RANK_2) { AddQuietMove(pos, MOVE(from, to, EMPTY, bQ, 0), list); AddQuietMove(pos, MOVE(from, to, EMPTY, bR, 0), list); AddQuietMove(pos, MOVE(from, to, EMPTY, bB, 0), list); AddQuietMove(pos, MOVE(from, to, EMPTY, bN, 0), list); } else { AddQuietMove(pos, MOVE(from, to, EMPTY, EMPTY, 0), list); } }
static void AddWhitePawnMove(const CHESS_BOARD *pos, const int from, const int to, MOVELIST *list) { ASSERT(SqOnBoard(from)); ASSERT(SqOnBoard(to)); ASSERT(CheckBoard(pos)); if (RanksBrd[from] == RANK_7) { AddQuietMove(pos, MOVE(from, to, EMPTY, wQ, 0), list); AddQuietMove(pos, MOVE(from, to, EMPTY, wR, 0), list); AddQuietMove(pos, MOVE(from, to, EMPTY, wB, 0), list); AddQuietMove(pos, MOVE(from, to, EMPTY, wN, 0), list); } else { AddQuietMove(pos, MOVE(from, to, EMPTY, EMPTY, 0), list); } }
void MoveGenerator::GenerateAllNonSlideMoves(Board *gameboard, MOVELIST *move_list) { piece_index = non_sliding_pieces_index[side]; piece = non_sliding_pieces[piece_index++]; while (piece != 0) { for (piece_number = 0; piece_number < gameboard->piece_number[piece]; ++piece_number) { square = gameboard->piece_list[piece][piece_number]; for (index = 0; index < number_of_directions_per_piece[piece]; ++index) { direction = piece_direction[piece][index]; tmp_square = square + direction; if (SQUAREOFFBOARD(tmp_square)) { continue; } // BLACK ^ 1 == WHITE WHITE ^ 1 == BLACK if (gameboard->pieces[tmp_square] != EMPTY) { if(PieceColor[gameboard->pieces[tmp_square]] == (side ^ 1)) { AddCaptureMove(gameboard, MOVE(square, tmp_square, gameboard->pieces[tmp_square], EMPTY, 0), move_list); } continue; } AddQuietMove(gameboard, MOVE(square, tmp_square, EMPTY, EMPTY, 0), move_list); } } piece = non_sliding_pieces[piece_index++]; } }
void GenerateAllMoves(const CHESS_BOARD *pos, MOVELIST *list) { ASSERT(CheckBoard(pos)); list->count = 0; int pce = EMPTY; int side = pos->side; int sq = 0; int t_sq = 0; int pceNum = 0; int dir = 0; int index = 0; int pceIndex = 0; if (side == WHITE) { for (pceNum = 0; pceNum < pos->pieceNum[wP]; ++pceNum) { sq = pos->pList[wP][pceNum]; ASSERT(SqOnBoard(sq)); if (pos->pieces[sq + 10] == EMPTY) { AddWhitePawnMove(pos, sq, sq + 10, list); if (RanksBrd[sq] == RANK_2 && pos->pieces[sq + 20] == EMPTY) { AddQuietMove(pos, MOVE(sq, (sq + 20), EMPTY, EMPTY, MFLAGPS), list); } } if (!SQOFFBOARD(sq + 9) && PieceCol[pos->pieces[sq + 9]] == BLACK) { AddWhitePawnCapMove(pos, sq, sq + 9, pos->pieces[sq + 9], list); } if (!SQOFFBOARD(sq + 11) && PieceCol[pos->pieces[sq + 11]] == BLACK) { AddWhitePawnCapMove(pos, sq, sq + 11, pos->pieces[sq + 11], list); } if (pos->enPas != NO_SQ) { if (sq + 9 == pos->enPas) { AddEnPassantMove(pos, MOVE(sq, sq + 9, EMPTY, EMPTY, MFLAGEP), list); } if (sq + 11 == pos->enPas) { AddEnPassantMove(pos, MOVE(sq, sq + 11, EMPTY, EMPTY, MFLAGEP), list); } } } if (pos->castlePerm & WKCA) { if (pos->pieces[F1] == EMPTY && pos->pieces[G1] == EMPTY) { if (!SqAttacked(E1, BLACK, pos) && !SqAttacked(F1, BLACK, pos)) { AddQuietMove(pos, MOVE(E1, G1, EMPTY, EMPTY, MFLAGCA), list); } } } if (pos->castlePerm & WQCA) { if (pos->pieces[D1] == EMPTY && pos->pieces[C1] == EMPTY && pos->pieces[B1] == EMPTY) { if (!SqAttacked(E1, BLACK, pos) && !SqAttacked(D1, BLACK, pos)) { AddQuietMove(pos, MOVE(E1, C1, EMPTY, EMPTY, MFLAGCA), list); } } } } else { for (pceNum = 0; pceNum < pos->pieceNum[bP]; ++pceNum) { sq = pos->pList[bP][pceNum]; ASSERT(SqOnBoard(sq)); if (pos->pieces[sq - 10] == EMPTY) { AddBlackPawnMove(pos, sq, sq - 10, list); if (RanksBrd[sq] == RANK_7 && pos->pieces[sq - 20] == EMPTY) { AddQuietMove(pos, MOVE(sq, (sq - 20), EMPTY, EMPTY, MFLAGPS), list); } } if (!SQOFFBOARD(sq - 9) && PieceCol[pos->pieces[sq - 9]] == WHITE) { AddBlackPawnCapMove(pos, sq, sq - 9, pos->pieces[sq - 9], list); } if (!SQOFFBOARD(sq - 11) && PieceCol[pos->pieces[sq - 11]] == WHITE) { AddBlackPawnCapMove(pos, sq, sq - 11, pos->pieces[sq - 11], list); } if (pos->enPas != NO_SQ) { if (sq - 9 == pos->enPas) { AddEnPassantMove(pos, MOVE(sq, sq - 9, EMPTY, EMPTY, MFLAGEP), list); } if (sq - 11 == pos->enPas) { AddEnPassantMove(pos, MOVE(sq, sq - 11, EMPTY, EMPTY, MFLAGEP), list); } } } // castling if (pos->castlePerm & BKCA) { if (pos->pieces[F8] == EMPTY && pos->pieces[G8] == EMPTY) { if (!SqAttacked(E8, WHITE, pos) && !SqAttacked(F8, WHITE, pos)) { AddQuietMove(pos, MOVE(E8, G8, EMPTY, EMPTY, MFLAGCA), list); } } } if (pos->castlePerm & BQCA) { if (pos->pieces[D8] == EMPTY && pos->pieces[C8] == EMPTY && pos->pieces[B8] == EMPTY) { if (!SqAttacked(E8, WHITE, pos) && !SqAttacked(D8, WHITE, pos)) { AddQuietMove(pos, MOVE(E8, C8, EMPTY, EMPTY, MFLAGCA), list); } } } } /* Loop for slide pieces */ pceIndex = LoopSlideIndex[side]; pce = LoopSlidePce[pceIndex++]; while (pce != 0) { ASSERT(PieceValid(pce)); for (pceNum = 0; pceNum < pos->pieceNum[pce]; ++pceNum) { sq = pos->pList[pce][pceNum]; ASSERT(SqOnBoard(sq)); for (index = 0; index < NumDir[pce]; ++index) { dir = PceDir[pce][index]; t_sq = sq + dir; while (!SQOFFBOARD(t_sq)) { // BLACK ^ 1 == WHITE WHITE ^ 1 == BLACK if (pos->pieces[t_sq] != EMPTY) { if (PieceCol[pos->pieces[t_sq]] == (side ^ 1)) { AddCaptureMove(pos, MOVE(sq, t_sq, pos->pieces[t_sq], EMPTY, 0), list); } break; } AddQuietMove(pos, MOVE(sq, t_sq, EMPTY, EMPTY, 0), list); t_sq += dir; } } } pce = LoopSlidePce[pceIndex++]; } /* Loop for non slide */ pceIndex = LoopNonSlideIndex[side]; pce = LoopNonSlidePce[pceIndex++]; while (pce != 0) { ASSERT(PieceValid(pce)); for (pceNum = 0; pceNum < pos->pieceNum[pce]; ++pceNum) { sq = pos->pList[pce][pceNum]; ASSERT(SqOnBoard(sq)); for (index = 0; index < NumDir[pce]; ++index) { dir = PceDir[pce][index]; t_sq = sq + dir; if (SQOFFBOARD(t_sq)) { continue; } // BLACK ^ 1 == WHITE WHITE ^ 1 == BLACK if (pos->pieces[t_sq] != EMPTY) { if (PieceCol[pos->pieces[t_sq]] == (side ^ 1)) { AddCaptureMove(pos, MOVE(sq, t_sq, pos->pieces[t_sq], EMPTY, 0), list); } continue; } AddQuietMove(pos, MOVE(sq, t_sq, EMPTY, EMPTY, 0), list); } } pce = LoopNonSlidePce[pceIndex++]; } //ASSERT(MoveListOk(list, pos)); }
void MoveGenerator::GenerateAllPawnMoves(Board *gameboard, MOVELIST *move_list) { side = gameboard->side_to_move; /* WHITE PAWN MOVES */ if (side == WHITE) { for (piece_number = 0; piece_number < gameboard->piece_number[WHITE_PAWN]; ++piece_number) { square = gameboard->piece_list[WHITE_PAWN][piece_number]; if (gameboard->pieces[square+10] == EMPTY) { AddWhitePawnMove(gameboard, square, square+10, move_list); if (rank_of[square] == RANK_2 && gameboard->pieces[square+20] == EMPTY) { AddQuietMove(gameboard, MOVE(square, (square+20), EMPTY, EMPTY, MOVEFLAGPAWNSTART), move_list); } } if(!SQUAREOFFBOARD(square + 9) && PieceColor[gameboard->pieces[square + 9]] == BLACK) { AddWhitePawnCapture(gameboard, square, square+9, gameboard->pieces[square + 9], move_list); } if(!SQUAREOFFBOARD(square + 11) && PieceColor[gameboard->pieces[square + 11]] == BLACK) { AddWhitePawnCapture(gameboard, square, square+11, gameboard->pieces[square + 11], move_list); } if(gameboard->en_passant_square != NO_SQUARE) { if(square + 9 == gameboard->en_passant_square) { AddEnPassantMove(gameboard, MOVE(square,square + 9,EMPTY,EMPTY,MOVEFLAGENPASSANT), move_list); } if(square + 11 == gameboard->en_passant_square) { AddEnPassantMove(gameboard, MOVE(square,square + 11,EMPTY,EMPTY,MOVEFLAGENPASSANT), move_list); } } } /* WHITE SIDE CASTLING */ if(gameboard->castle_permission & WHITE_KING_CASTLE) { if(gameboard->pieces[F1] == EMPTY && gameboard->pieces[G1] == EMPTY) { if(!IsSquareAttacked(E1,BLACK,gameboard) && !IsSquareAttacked(F1,BLACK,gameboard) ) { AddQuietMove(gameboard, MOVE(E1, G1, EMPTY, EMPTY, MOVEFLAGCASTLE), move_list); } } } if(gameboard->castle_permission & WHITE_QUEEN_CASTLE) { if(gameboard->pieces[D1] == EMPTY && gameboard->pieces[C1] == EMPTY && gameboard->pieces[B1] == EMPTY) { if(!IsSquareAttacked(E1,BLACK,gameboard) && !IsSquareAttacked(D1,BLACK,gameboard) ) { AddQuietMove(gameboard, MOVE(E1, C1, EMPTY, EMPTY, MOVEFLAGCASTLE), move_list); } } } } /* BLACK PAWN MOVES */ else { for(piece_number = 0; piece_number < gameboard->piece_number[BLACK_PAWN]; ++piece_number) { square = gameboard->piece_list[BLACK_PAWN][piece_number]; if(gameboard->pieces[square - 10] == EMPTY) { AddBlackPawnMove(gameboard, square, square-10, move_list); if(rank_of[square] == RANK_7 && gameboard->pieces[square - 20] == EMPTY) { AddQuietMove(gameboard, MOVE(square,(square-20),EMPTY,EMPTY,MOVEFLAGPAWNSTART),move_list); } } if(!SQUAREOFFBOARD(square - 9) && PieceColor[gameboard->pieces[square - 9]] == WHITE) { AddBlackPawnCapture(gameboard, square, square-9, gameboard->pieces[square - 9], move_list); } if(!SQUAREOFFBOARD(square - 11) && PieceColor[gameboard->pieces[square - 11]] == WHITE) { AddBlackPawnCapture(gameboard, square, square-11, gameboard->pieces[square - 11], move_list); } if(gameboard->en_passant_square != NO_SQUARE) { if(square - 9 == gameboard->en_passant_square) { AddEnPassantMove(gameboard, MOVE(square,square - 9,EMPTY,EMPTY,MOVEFLAGENPASSANT), move_list); } if(square - 11 == gameboard->en_passant_square) { AddEnPassantMove(gameboard, MOVE(square,square - 11,EMPTY,EMPTY,MOVEFLAGENPASSANT), move_list); } } } /* BLACK SIDE CASTLING */ if(gameboard->castle_permission & BLACK_KING_CASTLE) { if(gameboard->pieces[F8] == EMPTY && gameboard->pieces[G1] == EMPTY) { if(!IsSquareAttacked(E8,WHITE,gameboard) && !IsSquareAttacked(F8,WHITE,gameboard) ) { AddQuietMove(gameboard, MOVE(E8, G8, EMPTY, EMPTY, MOVEFLAGCASTLE), move_list); } } } if(gameboard->castle_permission & BLACK_QUEEN_CASTLE) { if(gameboard->pieces[D8] == EMPTY && gameboard->pieces[C1] == EMPTY && gameboard->pieces[B1] == EMPTY) { if(!IsSquareAttacked(E8,WHITE,gameboard) && !IsSquareAttacked(D8,WHITE,gameboard) ) { AddQuietMove(gameboard, MOVE(E8, C8, EMPTY, EMPTY, MOVEFLAGCASTLE), move_list); } } } } }