全部评论 7

  • 不过还是有一些问题:

    1. 翻开已插旗的安全格子时没有提示

      else {
          open(x, y);
      }
      

      如果 mp[x][y]=='F' 且它不是雷,open() 会因为

      if(mp[x][y] != '#') return;
      

      直接返回,玩家看不到“已标记,无法翻开”的提示。你只对“插旗的雷格”做了提示,逻辑不一致。

      应先统一判断:

      if(mp[x][y] == 'F'){
          cout << "此格子已被标记,无法翻开!";
          system("pause");
          continue;
      }
      
    2. cnt = 71 写死,和雷数强耦合

      ll cnt = 71;
      

      9×9 共 81 格,10 个雷,所以现在 71 恰好正确。但一旦修改雷数,胜利判断就错。

      而且你已经写了:

      ll n = 10;
      

      却没有使用它。建议:

      const int SIZE = 9;
      const int MINE = 10;
      cnt = SIZE * SIZE - MINE;
      
    3. 变量 n 实际完全没用

      ll n = 10;
      

      后面却仍然:

      while(placed < 10)
      

      应改成:

      while(placed < n)
      

    3天前 来自 浙江

    1
  • 可以新加两个变量n和m,用来调扫雷大小
    不然9*9太小了

    2天前 来自 广东

    0
  • dddd

    2天前 来自 广东

    0
  • 对对对

    2天前 来自 广东

    0
  • 3天前 来自 浙江

    0
  • 可以可以

    3天前 来自 浙江

    0
  • 我发现你的代码主要是以下几点问题:

    1. 插旗后的地雷仍然可以被“翻开”并触雷

      if(gm[x][y] == -1){
          cout << "你踩到地雷啦!";
      }
      

      这里没有先判断 mp[x][y] == 'F'。因此对一个已经插旗的地雷执行 0,仍会直接判定踩雷。建议翻开前先判断:

      if(mp[x][y] == 'F') continue;
      
    2. 失败后没有显示最终雷区
      踩雷后只是提示“你踩到地雷啦”,随后退出程序,没有把所有地雷显示出来。不是逻辑错误,但扫雷游戏通常会在失败后揭示雷的位置。

    3. 存在多个未使用变量

      ll s = 10;
      ll ans;
      ll n = 10;
      

      这三个变量实际没有参与程序逻辑,可以删除。

    4. cai 的处理较多余
      现在是:

      cai = true;
      

      然后下一轮:

      if(cai)return 0;
      

      可以在踩雷后直接 return 0;break;,代码更简洁。

    5. system("cls")system("pause") 只适用于 Windows
      如果在 Linux、macOS 或部分在线评测环境运行,会失效。因此程序的平台兼容性较差。

    6. 没有处理非法输入导致的 cin 失败
      如果用户输入:

      abc
      

      cin >> op >> x >> y 会进入失败状态,之后可能一直无法正常读取输入。若只是自己运行小游戏,影响不大;若想做得完整,应检测 cin.fail()

    4天前 来自 浙江

    0

热门讨论