用c++做一个简单的扫雷程序,有讲解
时间: 2024-05-18 15:12:33 浏览: 68
用c++实现的扫雷程序
好的,下面是一个简单的C++扫雷程序的代码及讲解:
```c++
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
// 定义一个结构体表示每个位置的信息
struct Cell
{
bool isMine; // 是否是地雷
bool isRevealed; // 是否已经被翻开
bool isFlagged; // 是否被标记为地雷
int numSurroundingMines; // 周围地雷的数量
};
// 定义一个二维数组表示扫雷区域
vector<vector<Cell>> board;
// 初始化扫雷区域
void initBoard(int numRows, int numCols, int numMines)
{
// 初始化每个位置的信息
board.resize(numRows, vector<Cell>(numCols));
for (int i = 0; i < numRows; i++)
{
for (int j = 0; j < numCols; j++)
{
board[i][j].isMine = false;
board[i][j].isRevealed = false;
board[i][j].isFlagged = false;
board[i][j].numSurroundingMines = 0;
}
}
// 随机放置地雷
srand(time(NULL));
int count = 0;
while (count < numMines)
{
int i = rand() % numRows;
int j = rand() % numCols;
if (!board[i][j].isMine)
{
board[i][j].isMine = true;
count++;
}
}
// 计算每个位置周围地雷的数量
for (int i = 0; i < numRows; i++)
{
for (int j = 0; j < numCols; j++)
{
int count = 0;
for (int x = i - 1; x <= i + 1; x++)
{
for (int y = j - 1; y <= j + 1; y++)
{
if (x >= 0 && x < numRows && y >= 0 && y < numCols && board[x][y].isMine)
{
count++;
}
}
}
board[i][j].numSurroundingMines = count;
}
}
}
// 显示当前扫雷区域的状态
void showBoard()
{
cout << " ";
for (int j = 0; j < board[0].size(); j++)
{
cout << j << " ";
}
cout << endl;
for (int i = 0; i < board.size(); i++)
{
cout << i << " ";
for (int j = 0; j < board[i].size(); j++)
{
if (board[i][j].isRevealed)
{
if (board[i][j].isMine)
{
cout << "* ";
}
else
{
cout << board[i][j].numSurroundingMines << " ";
}
}
else if (board[i][j].isFlagged)
{
cout << "F ";
}
else
{
cout << ". ";
}
}
cout << endl;
}
}
// 判断游戏是否结束
bool isGameOver()
{
for (int i = 0; i < board.size(); i++)
{
for (int j = 0; j < board[i].size(); j++)
{
if (board[i][j].isMine && board[i][j].isRevealed)
{
return true;
}
if (!board[i][j].isMine && !board[i][j].isRevealed)
{
return false;
}
}
}
return true;
}
// 翻开一个位置
void reveal(int row, int col)
{
if (board[row][col].isRevealed || board[row][col].isFlagged)
{
return;
}
board[row][col].isRevealed = true;
if (board[row][col].isMine)
{
cout << "Game over!" << endl;
return;
}
if (board[row][col].numSurroundingMines == 0)
{
for (int x = row - 1; x <= row + 1; x++)
{
for (int y = col - 1; y <= col + 1; y++)
{
if (x >= 0 && x < board.size() && y >= 0 && y < board[x].size())
{
reveal(x, y);
}
}
}
}
if (isGameOver())
{
cout << "Congratulations! You win!" << endl;
}
}
// 标记一个位置为地雷
void flag(int row, int col)
{
if (!board[row][col].isRevealed)
{
board[row][col].isFlagged = true;
}
}
int main()
{
int numRows = 10;
int numCols = 10;
int numMines = 10;
initBoard(numRows, numCols, numMines);
while (true)
{
showBoard();
int row, col;
string action;
cout << "Enter row, column, and action (r,c,a/f): ";
cin >> row >> col >> action;
if (action == "a")
{
reveal(row, col);
}
else if (action == "f")
{
flag(row, col);
}
}
return 0;
}
```
该程序实现了一个简单的扫雷游戏,具体实现如下:
1. 定义一个结构体`Cell`表示每个位置的信息,包括是否是地雷、是否已经被翻开、是否被标记为地雷和周围地雷的数量。
2. 定义一个二维数组`board`表示扫雷区域,初始化每个位置的信息,并随机放置地雷。
3. 计算每个位置周围地雷的数量。
4. 显示当前扫雷区域的状态。
5. 判断游戏是否结束。
6. 实现翻开一个位置的功能,如果位置已经被翻开或标记为地雷,则不做处理;如果是地雷,则游戏结束;如果周围没有地雷,则递归翻开周围的位置;如果游戏结束,则显示游戏结束的信息。
7. 实现标记一个位置为地雷的功能,如果位置已经被翻开,则不做处理,否则将其标记为地雷。
8. 在主函数中循环显示扫雷区域的状态,并读取用户输入的行、列和操作,执行相应的操作。
以上就是一个简单的C++扫雷程序的实现方法和代码。
阅读全文