コード例 #1
0
ファイル: chessboard.cpp プロジェクト: longsion/ChineseChess
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;

    }
}
コード例 #2
0
ファイル: state.cpp プロジェクト: amreis/ia-chess
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;
}
コード例 #3
0
ファイル: board0x88.cpp プロジェクト: jeffmeese/simple-chess
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();
}