请c++编写一个扫雷游戏代码并解释运行原理
时间: 2023-08-24 14:21:56 浏览: 98
好的,下面是一个简单的扫雷游戏 C++ 代码示例,实现了基本的游戏逻辑,包括地图的生成、雷的布置、游戏界面的显示、点击方块的处理等功能:
```
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
// 扫雷游戏地图大小
const int N = 10;
const int M = 10;
// 扫雷游戏地图
vector<vector<char>> board(N, vector<char>(M, ' '));
// 扫雷游戏雷的数量
const int BOMB_NUM = 10;
// 上下左右八个方向的移动
const int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
const int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
// 显示游戏界面
void display() {
cout << " |";
for (int j = 0; j < M; j++) {
cout << j << " ";
}
cout << endl;
cout << "---+";
for (int j = 0; j < M; j++) {
cout << "--";
}
cout << endl;
for (int i = 0; i < N; i++) {
printf("%2d |", i);
for (int j = 0; j < M; j++) {
cout << board[i][j] << " ";
}
cout << endl;
}
}
// 布置雷
void setBomb() {
int cnt = 0;
while (cnt < BOMB_NUM) {
int x = rand() % N, y = rand() % M;
if (board[x][y] != '*') {
board[x][y] = '*';
cnt++;
}
}
}
// 统计周围的雷数
int countBombs(int x, int y) {
int cnt = 0;
for (int i = 0; i < 8; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 0 && nx < N && ny >= 0 && ny < M && board[nx][ny] == '*') {
cnt++;
}
}
return cnt;
}
// 点击方块
void click(int x, int y) {
if (board[x][y] == '*') {
cout << "踩到雷了,游戏结束!" << endl;
board[x][y] = 'X';
display();
exit(0);
} else {
int cnt = countBombs(x, y);
board[x][y] = cnt + '0';
if (cnt == 0) {
for (int i = 0; i < 8; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 0 && nx < N && ny >= 0 && ny < M && board[nx][ny] == ' ') {
click(nx, ny);
}
}
}
}
}
int main() {
// 初始化地图
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
board[i][j] = ' ';
}
}
// 布置雷
srand(time(nullptr));
setBomb();
// 显示游戏界面
display();
// 点击方块
while (true) {
int x, y;
cout << "请输入要点击的方块坐标(格式:x y):";
cin >> x >> y;
if (x < 0 || x >= N || y < 0 || y >= M) {
cout << "输入错误,请重新输入!" << endl;
} else if (board[x][y] != ' ') {
cout << "该方块已经被点击,请重新输入!" << endl;
} else {
click(x, y);
display();
bool win = true;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[i][j] == ' ' && (i != x || j != y)) {
win = false;
break;
}
}
if (!win) break;
}
if (win) {
cout << "恭喜你,扫雷成功!" << endl;
break;
}
}
}
return 0;
}
```
代码的大致思路是先生成一个空地图,然后在地图中随机布置一定数量的雷,每次点击方块时,判断是否踩到了雷,如果是,则游戏结束;否则,统计周围的雷数,并将当前方块的状态更新为周围雷数或空格,如果周围没有雷,则继续递归点击周围的方块,直到所有可点击的方块都被点击过为止。
在 `main` 函数中,先初始化地图,然后随机布置雷,显示游戏界面,然后进入循环,每次输入要点击的方块坐标,判断是否合法,然后调用 `click` 函数处理点击事件,并更新游戏界面,如果所有空格都被点击过,则游戏胜利。
阅读全文