21xrx.com
2025-04-26 15:44:37 Saturday
文章检索 我的文章 写文章
易懂扫雷C++代码分享
2023-06-22 16:47:26 深夜i     12     0
扫雷 C++代码 简单易懂 分享 编程学习

扫雷是一款经典的单机游戏,在电脑程序设计方面也是一个不错的练手项目。今天,我想分享一下一个易懂的扫雷C++代码,供大家学习参考。

首先,我们需要定义一些需要用到的常量和变量:

const int maxn = 105;
const int dx[] = 0;
const int dy[] = -1;
char mine[maxn][maxn], ans[maxn][maxn];
int n, m, cnt;

其中,`maxn` 表示地图的大小,`dx` 和 `dy` 是用于遍历周围格子的数组,`mine` 存储地图,`ans` 存储玩家的答案,`n` 和 `m` 分别表示地图的行数和列数,`cnt` 表示玩家已经猜测到的雷的数量。

接下来是主函数部分:

int main() {
  cin >> n >> m; // 输入地图的行数和列数
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      cin >> mine[i][j]; // 输入地图
      ans[i][j] = '*'; // 初始化玩家的答案
    }
  }
  while (true) {
    cout << "请输入要翻开的格子:";
    int x, y;
    cin >> x >> y;
    if (mine[x][y] == '*')
      cout << "你踩雷了 else {
      cout << "地图如下:" << endl;
      cnt++;
      dfs(x, y);
      print(); // 输出当前的答案
      if (cnt == n * m)
        cout << "你赢了
    }
  }
  return 0;
}

这里的 `while` 循环表示每一轮玩家可以翻开一个格子,根据玩家翻开的格子是否是雷来判断游戏是否结束。如果是雷,游戏结束;如果不是雷,就更新玩家的答案并继续游戏。当玩家猜测到所有没有雷的格子时,游戏结束。

其中,`dfs` 和 `print` 函数分别用于更新玩家的答案和输出当前的答案。这两个函数的实现如下:

void dfs(int x, int y) {
  ans[x][y] = mine[x][y];
  if (mine[x][y] == '0') {
    for (int i = 0; i < 8; ++i) {
      int nx = x + dx[i];
      int ny = y + dy[i];
      if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && ans[nx][ny] == '*') {
        dfs(nx, ny);
      }
    }
  }
}
void print() {
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      cout << ans[i][j];
    }
    cout << endl;
  }
}

其中,`dfs` 函数采用的是深度优先搜索算法,用于翻开周围没有雷的格子。`print` 函数用于输出当前玩家的答案。

以上就是一个简单的扫雷实现,希望能够帮助大家学习C++编程。

  
  

评论区