void Board8x8::generateMoves( std::list<uint> & indexList, uint row, uint col, MoveList & moveList, bool isSlider) { for (std::list<uint>::iterator itr = indexList.begin(); itr != indexList.end(); ++itr) { uint destIndex(*itr); uint destRow = destIndex >> 3; uint destCol = destIndex & 7; PieceType otherPiece = mPieceType[destIndex]; if (otherPiece != NoPiece) { if ( (mWhiteToMove && isBlackPiece(otherPiece)) || (!mWhiteToMove && isWhitePiece(otherPiece)) ) { Move newMove(row, col, destRow, destCol, otherPiece); moveList.addMove(newMove); } if (isSlider) break; } else { Move newMove(row, col, destRow, destCol); moveList.addMove(newMove); } } }
bool ChessBoard::isFiveInARow(size_t row,size_t col) { if(!isLocatedPiece(row,col)){return false;} int counter=1; for(size_t i=row+1;i<rowgridnum;i++)//向下 { if(isLocatedPiece(i,col)) { if(isBlackPiece(row,col)==isBlackPiece(i,col)) {counter++;} else{break;} } else{break;} } for(int i=row-1;i>=0;i--)//向上 { if(isLocatedPiece(i,col)) { if(isBlackPiece(row,col)==isBlackPiece(i,col)) {counter++;} else{break;} } else{break;} } if(counter>=5){return true;} //判断纵向 counter=1; for(size_t i=col+1;i<rowgridnum;i++)//向右 { if(isLocatedPiece(row,i)) { if(isBlackPiece(row,col)==isBlackPiece(row,i)) {counter++;} else{break;} } else{break;} } for(int i=col-1;i>=0;i--)//向左 { if(isLocatedPiece(row,i)) { if(isBlackPiece(row,col)==isBlackPiece(row,i)) {counter++;} else{break;} } else{break;} } if(counter>=5){return true;} //判断横向 counter=1; for(size_t i=row+1,j=col+1;i<rowgridnum&&j<rowgridnum;i++,j++) { if(isLocatedPiece(i,j)) { if(isBlackPiece(row,col)==isBlackPiece(i,j)) {counter++;} else{break;} } else{break;} } for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--) { if(isLocatedPiece(i,j)) { if(isBlackPiece(row,col)==isBlackPiece(i,j)) {counter++;} else{break;} } else{break;} } if(counter>=5){return true;} //判断斜下 counter=1; for(int i=row-1,j=col+1;i>=0&&j<rowgridnum;i--,j++) { if(isLocatedPiece(i,j)) { if(isBlackPiece(row,col)==isBlackPiece(i,j)) {counter++;} else{break;} } else{break;} } for(int i=row+1,j=col-1;i<rowgridnum&&j>=0;i++,j--) { if(isLocatedPiece(i,j)) { if(isBlackPiece(row,col)==isBlackPiece(i,j)) {counter++;} else{break;} } else{break;} } if(counter>=5){return true;} //判断斜上 return false; }
void Board8x8::generateWhitePawnMoves(uint row, uint col, MoveList & moveList) { static const PieceType promotedPieceTypes[] = { WhiteQueen, WhiteRook, WhiteBishop, WhiteKnight }; uint sourceIndex = getIndex(row, col); std::list<uint> & listMoves = mWhitePawnMoves[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 == 6) { 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) && isBlackPiece(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 ( (destRow-row) == 1 && singlePush) { Move newMove(row, col, destRow, destCol); moveList.addMove(newMove); } if ( (destRow-row) == 2 && doublePush) { Move newMove(row, col, destRow, destCol); newMove.setDoublePawnPush(); moveList.addMove(newMove); } } else { PieceType otherPiece = mPieceType[destIndex]; if (isPiece(otherPiece) && isBlackPiece(otherPiece)) { Move newMove(row, col, destRow, destCol, otherPiece); moveList.addMove(newMove); } } } } // Check en-passant if (mWhiteEnPassant && row == 4) { if (col != 7) { PieceType pieceType = getPieceType(row, col+1); if (mEnPassantCaptureCol == col + 1 && pieceType == BlackPawn) { Move newMove(row, col, row+1, col+1, BlackPawn); newMove.setEnPassant(); moveList.addMove(newMove); } } if (col != 0) { PieceType pieceType = getPieceType(row, col-1); if (mEnPassantCaptureCol == col - 1 && pieceType == BlackPawn) { Move newMove(row, col, row+1, col-1, BlackPawn); newMove.setEnPassant(); moveList.addMove(newMove); } } } }