#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;

}

1 条评论

  • 1