You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++扫雷游戏开发问题:二维数组存常量时出现随机值

解决扫雷游戏二维数组初始化与布雷的问题

首先,咱们先揪出你代码里的核心问题,这也是导致数组出现随机值的根本原因:

问题1:二维数组初始化完全错误

你在构造函数里写的tiles[16][16] = {0};和covers[16][16] ={1};完全不符合C++的语法逻辑:

  • 首先,tiles[16][16]是访问第17行第17列的元素(数组下标从0开始,16x16的数组合法下标是0~15),这已经属于下标越界操作,会触发未定义行为;
  • 其次,这种写法只能给单个元素赋值,根本没法初始化整个二维数组。所以数组里大部分元素都保留了内存中的垃圾值,也就是你看到的随机值。

正确的初始化方式

有两种简单可靠的办法初始化整个二维数组:

  1. 嵌套循环遍历赋值:
Table::Table() {
    // 遍历所有元素,初始化tiles为0,covers为1
    for (int i = 0; i < 16; ++i) {
        for (int j = 0; j < 16; ++j) {
            tiles[i][j] = 0;
            covers[i][j] = 1;
        }
    }
}
  1. 用标准库函数批量填充(C++11及以上更简洁):
#include <algorithm> // 需要包含这个头文件

Table::Table() {
    // 把tiles的所有元素填充为0
    std::fill(&tiles[0][0], &tiles[0][0] + 16*16, 0);
    // 把covers的所有元素填充为1
    std::fill(&covers[0][0], &covers[0][0] + 16*16, 1);
}

问题2:布雷函数的逻辑漏洞

你的placemines函数还有两个明显问题:

  • i和j只在循环外初始化了一次,整个循环里坐标不会变,会一直往同一个位置塞雷(如果初始位置是0的话),根本达不到随机布雷的效果;
  • 没有设置随机数种子,每次运行程序布雷的位置都会完全一样。

修正后的布雷函数

#include <cstdlib>
#include <ctime>

void Table::placemines() {
    // 初始化随机数种子,确保每次运行布雷位置不同
    std::srand(std::time(nullptr));
    
    int minecount = 0;
    while (minecount < 40) {
        // 每次循环都生成新的随机坐标(范围0~15,对应16x16数组)
        int i = std::rand() % 16;
        int j = std::rand() % 16;
        if (tiles[i][j] == 0) { // 这个位置还没放雷
            tiles[i][j] = -10; // 用-10标记地雷
            minecount++;
        }
    }
}

额外提醒

数组下标一定要严格控制在0~15范围内,越界访问不仅会产生随机值,还可能导致程序崩溃或者其他奇怪的bug,一定要注意哦。

内容的提问来源于stack exchange,提问作者Jordan Zax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:06:41