c++扫雷教程
时间: 2023-07-24 16:06:00 浏览: 181
c++实现的扫雷
5星 · 资源好评率100%
下面是一个简单的 C++ 扫雷游戏教程,希望能帮到你:
首先,我们需要定义一个二维数组来表示扫雷棋盘,使用 0 表示空白,使用 -1 表示雷,使用其他数字表示周围雷的数量。
```cpp
const int MAXN = 105;
int n, m; // 行数和列数
int a[MAXN][MAXN]; // 扫雷棋盘
```
接下来,我们需要生成雷的位置。可以使用 `rand()` 函数生成随机数,如果生成的随机数小于某个概率阈值,就将该格子设置为雷。
```cpp
const int P = 10; // 雷的概率为 10%
void generateMines() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (rand() % 100 < P) a[i][j] = -1;
}
}
}
```
接着,我们需要计算每个格子周围的雷的数量。遍历整个棋盘,对于每个不是雷的格子,统计周围 8 个格子中的雷的数量,并将该数量保存在该格子的值中。
```cpp
void countMines() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (a[i][j] != -1) {
int cnt = 0;
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
if (dx == 0 && dy == 0) continue; // 当前格子不算
int x = i + dx, y = j + dy;
if (x < 1 || x > n || y < 1 || y > m) continue; // 越界不算
if (a[x][y] == -1) cnt++;
}
}
a[i][j] = cnt;
}
}
}
}
```
现在,我们可以开始实现游戏的主循环了。每次循环,先输出当前棋盘的状态,然后让玩家输入一个坐标,根据该坐标的情况进行处理。如果该格子是雷,游戏结束;如果该格子是空白,扩展该格子周围的空白格子;如果该格子是数字,直接显示该数字。
```cpp
void printBoard(bool showMines = false) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (showMines && a[i][j] == -1) cout << '*';
else if (a[i][j] == 0) cout << '.';
else if (a[i][j] == -1) cout << '.';
else cout << a[i][j];
}
cout << endl;
}
}
bool isWin() { // 判断是否胜利
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (a[i][j] >= 0 && a[i][j] <= 8 && !vis[i][j]) {
return false;
}
}
}
return true;
}
void play() {
memset(vis, 0, sizeof(vis));
int remain = n * m;
while (true) {
printBoard();
int x, y;
cout << "Please enter the coordinate (x, y): ";
cin >> x >> y;
if (vis[x][y]) {
cout << "This cell has already been uncovered." << endl;
continue;
}
remain--;
if (a[x][y] == -1) { // 点到雷了
printBoard(true);
cout << "Game over!" << endl;
break;
} else if (a[x][y] == 0) { // 点到空白
queue<pair<int, int>> q;
q.push(make_pair(x, y));
vis[x][y] = true;
while (!q.empty()) {
auto p = q.front();
q.pop();
int x = p.first, y = p.second;
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
if (dx == 0 && dy == 0) continue;
int nx = x + dx, ny = y + dy;
if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
if (vis[nx][ny]) continue;
vis[nx][ny] = true;
remain--;
if (a[nx][ny] == 0) {
q.push(make_pair(nx, ny));
}
}
}
}
} else { // 点到数字
vis[x][y] = true;
if (remain == 10) { // 剩余 10 个格子时,自动打开所有非雷格子并胜利
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (a[i][j] != -1) {
vis[i][j] = true;
}
}
}
printBoard();
cout << "You win!" << endl;
break;
}
}
if (isWin()) {
printBoard();
cout << "You win!" << endl;
break;
}
}
}
```
完整代码如下:
阅读全文