//扫雷 #include <iostream> #include <vector> #include <cstdlib> #include <ctime> #include <iomanip> using namespace std; int ROWS; int COLS; int MINES; void setDifficulty(int level) { switch(level) { case 1: ROWS = 5; COLS = 5; MINES = 5; break; case 2: ROWS = 10; COLS = 10; MINES = 15; break; case 3: ROWS = 20; COLS = 20; MINES = 50; break; case 4: ROWS = 100; COLS = 100; MINES = 200; break; } } void initializeBoard(vector<vector<char> >& displayBoard, vector<vector<int> >& mineBoard) { displayBoard.clear(); mineBoard.clear(); for (int i = 0; i < ROWS; i++) { vector<char> row(COLS, '#'); displayBoard.push_back(row); vector<int> mineRow(COLS, 0); mineBoard.push_back(mineRow); } } void placeMines(vector<vector<int> >& mineBoard) { srand(time(0)); int minesPlaced = 0; while (minesPlaced < MINES) { int r = rand() % ROWS; int c = rand() % COLS; if (mineBoard[r][c] != -1) { mineBoard[r][c] = -1; minesPlaced++; } } } void calculateNumbers(vector<vector<int> >& mineBoard) { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (mineBoard[i][j] == -1) continue; int count = 0; for (int dr = -1; dr <= 1; dr++) { for (int dc = -1; dc <= 1; dc++) { if (dr == 0 && dc == 0) continue; int nr = i + dr; int nc = j + dc; if (nr >= 0 && nr < ROWS && nc >= 0 && nc < COLS && mineBoard[nr][nc] == -1) { count++; } } } mineBoard[i][j] = count; } } } void printBoard(const vector<vector<char> >& board) { cout << " "; int displayCols = (COLS > 20) ? 20 : COLS; for (int c = 0; c < displayCols; c++) { cout << setw(2) << c; } if (COLS > 20) cout << " ..."; cout << "\n"; for (int i = 0; i < ROWS; i++) { if (i >= 20 && ROWS > 20) { cout << " ...\n"; break; } cout << setw(2) << i << " "; for (int j = 0; j < displayCols; j++) { cout << setw(2) << board[i][j]; } cout << "\n"; } cout << "\n"; } bool revealCell(int r, int c, vector<vector<char> >& displayBoard, const vector<vector<int> >& mineBoard) { if (mineBoard[r][c] == -1) { return false; } if (mineBoard[r][c] > 0) { displayBoard[r][c] = '0' + mineBoard[r][c]; return true; } displayBoard[r][c] = ' '; for (int dr = -1; dr <= 1; dr++) { for (int dc = -1; dc <= 1; dc++) { if (dr == 0 && dc == 0) continue; int nr = r + dr; int nc = c + dc; if (nr >= 0 && nr < ROWS && nc >= 0 && nc < COLS && displayBoard[nr][nc] == '#') { revealCell(nr, nc, displayBoard, mineBoard); } } } return true; } bool checkWin(const vector<vector<char> >& displayBoard, const vector<vector<int> >& mineBoard) { int unrevealed = 0; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (displayBoard[i][j] == '#' && mineBoard[i][j] != -1) { unrevealed++; } } } return unrevealed == 0; } int main() { int difficulty; vector<vector<char> > displayBoard; vector<vector<int> > mineBoard; bool gameOver = false; bool win = false; cout << "===== 多难度扫雷游戏 =====\n"; cout << "请选择难度:\n"; cout << "1. 简单 (5×5,5个地雷)\n"; cout << "2. 中等 (10×10,15个地雷)\n"; cout << "3. 困难 (20×20,50个地雷)\n"; cout << "4. 地狱 (100×100,200个地雷)\n"; cout << "输入难度编号(1-4):"; cin >> difficulty; while (difficulty < 1 || difficulty > 4) { cout << "无效选择,请输入1-4之间的数字:"; cin >> difficulty; } setDifficulty(difficulty); initializeBoard(displayBoard, mineBoard); placeMines(mineBoard); calculateNumbers(mineBoard); cout << "\n规则:\n"; cout << "1. 输入行和列来揭开格子,踩到地雷则游戏失败\n"; cout << "2. 数字表示周围8格内的地雷数量,空白格会自动揭开周围区域\n"; cout << "3. 揭开所有非地雷格子则胜利\n"; cout << "注:地狱难度仅显示前20行20列,输入仍需符合100×100范围\n\n"; while (!gameOver) { printBoard(displayBoard); int r, c; cout << "请输入要揭开的位置(行 列):"; cin >> r >> c; if (r < 0 || r >= ROWS || c < 0 || c >= COLS) { cout << "无效位置!行范围:0-" << ROWS-1 << ",列范围:0-" << COLS-1 << "\n\n"; continue; } if (displayBoard[r][c] != '#') { cout << "该位置已揭开,请选择其他位置!\n\n"; continue; } if (!revealCell(r, c, displayBoard, mineBoard)) { gameOver = true; win = false; cout << "\n你踩到地雷了!游戏结束!\n"; for (int i = 0; i < (ROWS > 20 ? 20 : ROWS); i++) { for (int j = 0; j < (COLS > 20 ? 20 : COLS); j++) { if (mineBoard[i][j] == -1) { displayBoard[i][j] = '*'; } } } printBoard(displayBoard); } else if (checkWin(displayBoard, mineBoard)) { gameOver = true; win = true; printBoard(displayBoard); cout << "恭喜你!成功扫出所有地雷,游戏胜利!\n"; } } return 0; }
Note.ms
/ogrf