扫雷c++
时间: 2023-06-29 14:06:45 浏览: 87
扫雷(C++版)
3星 · 编辑精心推荐
以下是一个简单的扫雷游戏的 C++ 代码示例:
```cpp
#include <iostream>
#include <time.h>
using namespace std;
const int ROW = 10; // 行数
const int COL = 10; // 列数
const int NUM_MINE = 10; // 雷数
bool mine[ROW][COL]; // 雷的位置
bool open[ROW][COL]; // 是否已经翻开
char display[ROW][COL]; // 显示内容
// 初始化游戏,放置雷
void init_game()
{
srand(time(NULL)); // 设置随机数种子
// 先将所有格子都初始化为非雷格子
for(int i=0; i<ROW; i++)
for(int j=0; j<COL; j++)
mine[i][j] = false;
// 随机放置雷
for(int i=0; i<NUM_MINE; i++)
{
int r, c;
do
{
r = rand() % ROW;
c = rand() % COL;
} while(mine[r][c]); // 如果这个位置已经是雷,则重新随机位置
mine[r][c] = true;
}
}
// 计算某个位置周围的雷数
int count_bomb(int r, int c)
{
int cnt = 0;
for(int i=r-1; i<=r+1; i++)
for(int j=c-1; j<=c+1; j++)
if(i>=0 && i<ROW && j>=0 && j<COL && mine[i][j])
cnt++;
return cnt;
}
// 显示游戏状态
void show_game()
{
cout << " ";
for(int j=0; j<COL; j++)
cout << j << " ";
cout << endl;
for(int i=0; i<ROW; i++)
{
cout << i << " ";
for(int j=0; j<COL; j++)
cout << display[i][j] << " ";
cout << endl;
}
}
// 翻开某个位置
void open_cell(int r, int c)
{
if(open[r][c])
return;
open[r][c] = true;
if(mine[r][c])
{
display[r][c] = '*';
return;
}
int cnt = count_bomb(r, c);
if(cnt == 0)
{
display[r][c] = ' ';
for(int i=r-1; i<=r+1; i++)
for(int j=c-1; j<=c+1; j++)
if(i>=0 && i<ROW && j>=0 && j<COL)
open_cell(i, j);
}
else
display[r][c] = '0' + cnt;
}
int main()
{
init_game();
for(int i=0; i<ROW; i++)
for(int j=0; j<COL; j++)
display[i][j] = '-';
while(true)
{
show_game();
int r, c;
cout << "请输入坐标(行 列):";
cin >> r >> c;
open_cell(r, c);
bool win = true;
for(int i=0; i<ROW; i++)
for(int j=0; j<COL; j++)
if(!open[i][j] && !mine[i][j])
win = false;
if(win)
{
show_game();
cout << "你赢了!" << endl;
break;
}
bool lose = false;
for(int i=0; i<ROW; i++)
for(int j=0; j<COL; j++)
if(open[i][j] && mine[i][j])
{
lose = true;
break;
}
if(lose)
{
show_game();
cout << "你输了!" << endl;
break;
}
}
return 0;
}
```
这个程序使用一个 bool 类型的数组来表示每个格子是否有雷,另外一个 bool 类型的数组表示每个格子是否已经翻开,还有一个 char 类型的数组表示每个格子应该显示什么内容。游戏的主要逻辑是在 `open_cell` 函数中实现的,这个函数会递归地翻开所有与当前格子相邻的格子,直到遇到一个有雷的格子或者周围有雷的格子。游戏的过程中会不断显示当前的游戏状态,并提示玩家输入坐标来翻开某个格子。当所有非雷格子都被翻开时,玩家获胜;当翻开一个有雷的格子时,玩家失败。
阅读全文