#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;
// 游戏常量设置
const int ROWS = 9; // 行数
const int COLS = 9; // 列数
const int MINES = 10; // 地雷数量
// 棋盘数组
// mineMap: 存储地雷和数字(9=地雷,0-8=周围地雷数)
int mineMap[ROWS][COLS];
// showMap: 显示给玩家的棋盘(*=未翻开, !=标记, 数字=已翻开)
char showMap[ROWS][COLS];
// 初始化游戏
void initGame() {
// 1. 初始化随机数种子
srand((unsigned)time(NULL));
// 2. 清空两个数组
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
mineMap[i][j] = 0; // 地雷地图初始化为0
showMap[i][j] = ''; // 显示地图初始化为
}
}
// 3. 随机布置地雷
int count = 0;
while (count < MINES) {
int r = rand() % ROWS;
int c = rand() % COLS;
// 避免重复布雷
if (mineMap[r][c] != 9) {
mineMap[r][c] = 9; // 9 代表地雷
count++;
}
}
// 4. 计算每个格子周围的地雷数量
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (mineMap[i][j] == 9) continue; // 跳过地雷
}
}
// 打印游戏棋盘
void printMap() {
system("cls"); // Windows清屏
// system("clear"); // Mac/Linux请用这行替换上面一行
cout << " 扫雷游戏" << endl;
cout << "-------------------------" << endl;
cout << " ";
// 打印列号
for (int j = 0; j < COLS; j++) {
cout << setw(2) << j;
}
cout << endl;
for (int i = 0; i < ROWS; i++) {
cout << setw(2) << i; // 打印行号
for (int j = 0; j < COLS; j++) {
cout << setw(2) << showMap[i][j];
}
cout << endl;
}
cout << "-------------------------" << endl;
cout << "指令:输入 行 列 → 翻开格子" << endl;
cout << " 输入 行 列 m → 标记地雷" << endl;
}
// 递归展开空白格子(核心功能)
void expandZero(int x, int y) {
// 越界、已翻开、是地雷 直接返回
if (x < 0 || x >= ROWS || y < 0 || y >= COLS) return;
if (showMap[x][y] != '*') return;
if (mineMap[x][y] == 9) return;
// 显示当前格子数字
showMap[x][y] = mineMap[x][y] + '0';
// 如果是0,继续展开周围
if (mineMap[x][y] == 0) {
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
expandZero(x + i, y + j);
}
}
}
}
// 判断游戏是否胜利
bool isWin() {
int count = 0;
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
// 未翻开的格子 = 地雷数量,说明胜利
if (showMap[i][j] == '*' || showMap[i][j] == '!') {
count++;
}
}
}
return count == MINES;
}
int main() {
initGame();
char op; // 操作指令
int x, y; // 坐标
while (true) {
printMap();
}
system("pause");
return 0;
}