用C++写一个扫雷程序
时间: 2023-12-03 07:05:53 浏览: 102
基于Qt实现的扫雷小程序
好的,下面是一个简单的扫雷程序示例:
```cpp
#include <iostream>
#include <vector>
#include <time.h>
using namespace std;
class MineSweeper {
private:
int row;
int col;
int mineNum;
vector<vector<int>> board; // 记录每个格子的状态,0-未翻开,1-已翻开,2-标记为地雷,3-标记为问号
vector<vector<bool>> mine; // 记录每个格子是否是地雷
public:
MineSweeper(int r, int c, int m) : row(r), col(c), mineNum(m) {
board.resize(row, vector<int>(col, 0));
mine.resize(row, vector<bool>(col, false));
srand((unsigned int)time(NULL));
while (mineNum > 0) { // 随机布雷
int x = rand() % row;
int y = rand() % col;
if (!mine[x][y]) {
mine[x][y] = true;
mineNum--;
}
}
}
void printBoard() { // 打印游戏界面
cout << " ";
for (int j = 0; j < col; j++) {
cout << j << " ";
}
cout << endl;
cout << " ";
for (int j = 0; j < col; j++) {
cout << "--";
}
cout << endl;
for (int i = 0; i < row; i++) {
cout << i << " | ";
for (int j = 0; j < col; j++) {
if (board[i][j] == 0) {
cout << ". ";
} else if (board[i][j] == 1) {
if (mine[i][j]) {
cout << "* ";
} else {
int cnt = countMine(i, j);
cout << (cnt > 0 ? to_string(cnt) : " ") << " ";
}
} else if (board[i][j] == 2) {
cout << "@ ";
} else if (board[i][j] == 3) {
cout << "? ";
}
}
cout << "|" << endl;
}
cout << " ";
for (int j = 0; j < col; j++) {
cout << "--";
}
cout << endl;
}
void play(int x, int y) { // 玩家翻开一个格子
if (board[x][y] == 1 || board[x][y] == 2) { // 已经翻开或标记为地雷,不能再操作
return;
}
if (mine[x][y]) { // 翻开的是地雷,游戏结束
board[x][y] = 1;
printBoard();
cout << "Game Over!" << endl;
return;
}
board[x][y] = 1;
int cnt = countMine(x, y);
if (cnt == 0) { // 周围没有地雷,递归翻开周围的格子
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (x + i >= 0 && x + i < row && y + j >= 0 && y + j < col && !(i == 0 && j == 0)) {
play(x + i, y + j);
}
}
}
}
printBoard();
}
void mark(int x, int y) { // 玩家标记一个格子为地雷或问号
if (board[x][y] == 1) { // 已经翻开,不能再操作
return;
}
if (board[x][y] == 2) { // 已经标记为地雷,改为问号
board[x][y] = 3;
} else if (board[x][y] == 3) { // 已经标记为问号,改为未翻开
board[x][y] = 0;
} else { // 未标记,改为地雷
board[x][y] = 2;
}
printBoard();
}
private:
int countMine(int x, int y) { // 统计周围的地雷数量
int cnt = 0;
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (x + i >= 0 && x + i < row && y + j >= 0 && y + j < col && mine[x + i][y + j]) {
cnt++;
}
}
}
return cnt;
}
};
int main() {
int row, col, mineNum;
cout << "Please input the row number of the board: ";
cin >> row;
cout << "Please input the column number of the board: ";
cin >> col;
cout << "Please input the number of mines: ";
cin >> mineNum;
MineSweeper game(row, col, mineNum);
game.printBoard();
while (true) {
int x, y;
char op;
cout << "Please input the operation (P-play, M-mark): ";
cin >> op;
cout << "Please input the row and column number of the cell: ";
cin >> x >> y;
if (op == 'P') {
game.play(x, y);
} else if (op == 'M') {
game.mark(x, y);
}
}
return 0;
}
```
该程序实现了基本的扫雷游戏功能,包括随机布雷、打印游戏界面、玩家翻开格子、统计周围地雷数量、递归翻开周围的格子、玩家标记格子为地雷或问号等。程序使用了对象-oriented 的设计思想,将游戏逻辑封装在 MineSweeper 类中,方便调用和维护。
阅读全文