Пример #1
0
void Board8x8::generateKingMoves(uint row, uint col, MoveList & moveList)
{
  uint index = getIndex(row, col);
  generateMoves(mKingMoves[index], row, col, moveList, false);

  bool queenSide = (mWhiteToMove) ? mWhiteCastleQueenSide : mBlackCastleQueenSide;
  bool kingSide = (mWhiteToMove) ? mWhiteCastleKingSide : mBlackCastleKingSide;
  uint rowCheck = (mWhiteToMove) ? WHITE_KING_START_ROW : BLACK_KING_START_ROW;

  if (kingSide && getPieceType(rowCheck, 5) == NoPiece && getPieceType(rowCheck, 6) == NoPiece) {
    bool canCastle = true;
    uint attackCol = 4;
    while (attackCol <= 6) {
      if (isCellAttacked(rowCheck, attackCol, mWhiteToMove)) {
        canCastle = false;
        break;
      }
      attackCol++;
    }

    if (canCastle) {
      Move newMove(rowCheck, 4, rowCheck, 6);
      newMove.setKingCastle();
      moveList.addMove(newMove);
    }
  }

  if (queenSide && getPieceType(rowCheck,3) == NoPiece && getPieceType(rowCheck,2) == NoPiece && getPieceType(rowCheck,1) == NoPiece) {
    bool canCastle = true;
    uint attackCol = 4;
    while (attackCol >= 2) {
      if (isCellAttacked(rowCheck, attackCol, mWhiteToMove)) {
        canCastle = false;
        break;
      }
      attackCol--;
    }

    if (canCastle) {
      Move newMove(rowCheck, 4, rowCheck, 2);
      newMove.setQueenCastle();
      moveList.addMove(newMove);
    }
  }
}
Пример #2
0
void ChessBoard::initializeBoard() {

  for( int i = 0; i < BOARD_WIDTH_HEIGHT; ++i ) {
    for( int j = 0; j < BOARD_WIDTH_HEIGHT; ++j ) {

      PieceColor squareColor;
      if( (i+j) % 2 == 0 ) squareColor = WHITE;
      else squareColor = BLACK;

      Square* sq = &board[i][j];
      sq->color = squareColor;

      if( i < 2 || i > 5 ) {

	PieceColor color;
	if( i < 2 ) color = BLACK;
	else color = WHITE;

	PieceType type;
	if( i == 0 || i == 7 ) type = getPieceType( j );
	else type = PAWN;

	Piece* piece = new Piece( type, color, true );
	piece->x = j;
	piece->y = i;

	sq->setPiece( piece );
	if( i < 2 ) blackPieces.push_back( piece );
	else whitePieces.push_back( piece );

      } else {

	sq->setPiece(NULL);
      }

      sq->x = j;
      sq->y = i;


    }
  }
}
Пример #3
0
void Board8x8::generateCandidateMoves(uint row, uint col, MoveList & moveList)
{
  PieceType pieceType = getPieceType(row, col);
  if (pieceType == NoPiece)
    return;

  switch (pieceType) {
  case WhitePawn:
    generateWhitePawnMoves(row, col, moveList);
    break;
  case BlackPawn:
    generateBlackPawnMoves(row, col, moveList);
    break;
  case WhiteKnight:
  case BlackKnight:
    generateKnightMoves(row, col, moveList);
    break;
  case WhiteBishop:
  case BlackBishop:
    generateBishopMoves(row, col, moveList);
    break;
  case WhiteRook:
  case BlackRook:
    generateRookMoves(row, col, moveList);
    break;
  case WhiteQueen:
  case BlackQueen:
    generateBishopMoves(row, col, moveList);
    generateRookMoves(row, col, moveList);
    break;
  case WhiteKing:
  case BlackKing:
    generateKingMoves(row, col, moveList);
    break;
  default:
    break;
  }
}
Пример #4
0
void Board8x8::generateBlackPawnMoves(uint row, uint col, MoveList & moveList)
{
  static const PieceType promotedPieceTypes[] =
  { BlackQueen, BlackRook, BlackBishop, BlackKnight };

  uint sourceIndex = getIndex(row, col);
  std::list<uint> listMoves = mBlackPawnMoves[sourceIndex];
  for (std::list<uint>::iterator itr = listMoves.begin(); itr != listMoves.end(); ++itr) {
    uint destIndex(*itr);
    uint destRow = destIndex >> 3;
    uint destCol = destIndex & 7;

    if (row == 1) {
      if (col == destCol) {
        if (mPieceType[(row-1)*8+col] == NoPiece) {
          for (int i = 0; i < 4; i++) {
            Move promoMove(row, col, destRow, destCol, NoPiece, promotedPieceTypes[i]);
            moveList.addMove(promoMove);
          }
        }
      }
      else {
        PieceType otherPiece = mPieceType[destIndex];
        if (isPiece(otherPiece) && isWhitePiece(otherPiece)) {
          for (int i = 0; i < 4; i++) {
            Move promoMove(row, col, destRow, destCol, otherPiece, promotedPieceTypes[i]);
            moveList.addMove(promoMove);
          }
        }
      }
    }
    else {
      if (col == destCol) {
        bool doublePush = false;
        bool singlePush = mPieceType[(row-1)*8+col] == NoPiece;
        if (singlePush)
          doublePush = mPieceType[(row-2)*8+col] == NoPiece;

        if ( (row-destRow) == 1 && singlePush) {
          Move newMove(row, col, destRow, destCol);
          moveList.addMove(newMove);
        }

        if ( (row-destRow) == 2 && doublePush) {
          Move newMove(row, col, destRow, destCol);
          newMove.setDoublePawnPush();
          moveList.addMove(newMove);
        }
      }
      else {
        PieceType otherPiece = mPieceType[destIndex];
        if (isPiece(otherPiece) && isWhitePiece(otherPiece)) {
          Move newMove(row, col, destRow, destCol, otherPiece);
          moveList.addMove(newMove);
        }
      }
    }
  }

  // Check en-passant
  if (mBlackEnPassant && row == 3) {
    if (col != 7) {
      PieceType pieceType = getPieceType(row, col+1);
      if (mEnPassantCaptureCol == col + 1 && pieceType == WhitePawn) {
        Move newMove(row, col, row-1, col+1, WhitePawn);
        newMove.setEnPassant();
        moveList.addMove(newMove);
      }
    }

    if (col != 0) {
      PieceType pieceType = getPieceType(row, col-1);
      if (mEnPassantCaptureCol == col - 1 && pieceType == WhitePawn) {
        Move newMove(row, col, row-1, col-1, WhitePawn);
        newMove.setEnPassant();
        moveList.addMove(newMove);
      }
    }
  }
}