- C++
扫雷
- @ 2026-9-24 18:22:46
#include<bits/stdc++.h> #include using namespace std;
const int N = 5; char a[N][N]; //地图 *代表地雷,数字代表周围雷数 bool vis[N][N]; //标记是否已经翻开
int main() { //只在最开头播种一次随机数! srand(time(nullptr));
//1.初始化地图全部置为0,未翻开vis=false
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
a[i][j] = '0';
vis[i][j] = false;
}
}
//生成3颗地雷,防止重复埋雷
int mine_cnt = 3;
while(mine_cnt > 0){
int l = rand() % N;
int r = rand() % N;
if(a[l][r] != '*'){
a[l][r] = '*';
mine_cnt--;
}
}
//统计每个格子周围地雷数量(简易扫雷数字)
int dx[]={-1,-1,-1,0,0,1,1,1};
int dy[]={-1,0,1,-1,1,-1,0,1};
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(a[i][j] == '*') continue;
int cnt=0;
for(int d=0;d<8;d++){
int ni = i+dx[d];
int nj = j+dy[d];
if(ni>=0&&ni<N && nj>=0&&nj<N){
if(a[ni][nj] == '*') cnt++;
}
}
a[i][j] = cnt + '0';
}
}
int safe_total = N*N - 3; //安全格子总数量
int opened = 0;
cout<<"====5*5扫雷===="<<endl;
cout<<"输入坐标(0~4 0~4),例如 0 0"<<endl;
bool game_over = false;
while(!game_over)
{
int b,c;
cin >> b >> c;
//边界检查
if(b<0||b>=N||c<0||c>=N){
cout<<"坐标超出范围,请重新输入!"<<endl;
continue;
}
if(vis[b][c]){
cout<<"该格子已经翻开过!"<<endl;
continue;
}
if(a[b][c] == '*'){
cout<<"game over 你踩到地雷!"<<endl;
game_over = true;
continue;
}
vis[b][c] = true;
opened++;
cout<<"该格周围地雷数:"<< a[b][c] <<endl;
if(opened == safe_total){
cout<<"恭喜!全部安全格子翻开,游戏胜利!"<<endl;
game_over = true;
}
}
return 0;
}