void ChessBoard::generateMoves(int sq, Moves& mvs) { int pc = m_data[sq]; if (!pc) return; switch (pieceType(pc)) { case PIECE_KING: generateKingMoves(*this, sq, mvs); break; case PIECE_ADVISOR: generateAdvisorMoves(*this, sq, mvs); break; case PIECE_BISHOP: generateBishopMoves(*this, sq, mvs); break; case PIECE_KNIGHT: generateKnightMoves(*this, sq, mvs); break; case PIECE_ROOK: generateRookMoves(*this, sq, mvs); break; case PIECE_CANNON: generateCannonMoves(*this, sq, mvs); break; case PIECE_PAWN: generatePawnMoves(*this, sq, mvs); break; } }
vector<State> State::getChildrenStates() const { vector<State> moves; moves.reserve(40); for (int i = 0; i < 8; ++i) { for (int j = 0; j < 8; ++j) { const int pos = i*8+j; if (board[pos] == '.') continue; if (islower(board[pos]) && ourTeam == BLACK) { switch(board[pos]) { case 'p': generatePawnMoves(ii(i, j), moves); break; case 'r': generateRookMoves(ii(i, j), moves); break; case 'n': generateKnightMoves(ii(i, j), moves); break; } } else if (isupper(board[pos]) && ourTeam == WHITE) { switch(board[pos]) { case 'P': generatePawnMoves(ii(i, j), moves); break; case 'R': generateRookMoves(ii(i, j), moves); break; case 'N': generateKnightMoves(ii(i,j), moves); break; } } } } return moves; }
uchar Board0x88::generateMoves(MoveList & moveList) { generateCastlingMoves(moveList); for (uchar i = 0; i < 8; i++) { for (uchar col = 0; col < 8; col++) { //for (uchar index = 0; index < 120; index++) { uint index = getIndex(7-i, col); if (mColors[index] == mSideToMove) { if (mPieces[index] == Pawn) { generatePawnMoves(index, moveList); generatePawnCaptures(index, moveList); } else { uchar pieceType = mPieces[index]; for (uchar num = 0; num < mNumDirections[pieceType]; num++) { for (uchar pos = index;;) { pos = pos + mDirectionVectors(pieceType, num); if (!isValidSquare(pos)) break; if (mColors[pos] == ColorEmpty) { // Standard move pushMove(index, pos, pieceType, PieceEmpty, MoveNormal, moveList); } else if (mColors[pos] != mSideToMove) { // Capture move pushMove(index, pos, pieceType, mPieces[pos], MoveCapture, moveList); break; } else { break; } // Break on non-sliding pieces (King, Knight) if (!mSliders[pieceType]) break; } } } } } } return moveList.size(); }