C++扫雷游戏开发问题:二维数组存常量时出现随机值
解决扫雷游戏二维数组初始化与布雷的问题
首先,咱们先揪出你代码里的核心问题,这也是导致数组出现随机值的根本原因:
问题1:二维数组初始化完全错误
你在构造函数里写的tiles[16][16] = {0};和covers[16][16] ={1};完全不符合C++的语法逻辑:
- 首先,
tiles[16][16]是访问第17行第17列的元素(数组下标从0开始,16x16的数组合法下标是0~15),这已经属于下标越界操作,会触发未定义行为; - 其次,这种写法只能给单个元素赋值,根本没法初始化整个二维数组。所以数组里大部分元素都保留了内存中的垃圾值,也就是你看到的随机值。
正确的初始化方式
有两种简单可靠的办法初始化整个二维数组:
- 嵌套循环遍历赋值:
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; } } }
- 用标准库函数批量填充(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
相关产品推荐
相关产品推荐

