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); } } }
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; } } }
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; } }
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); } } } }