蛇游戏开发中数组单元素赋值却修改多元素的问题排查
问题根源与修复方案
你的核心问题是二维数组的声明顺序搞反了,导致内存越界访问,进而出现修改单个元素却多个变化、部分宽高组合失效的情况。
具体原因
你定义width=120为列数、height=30为行数,目标是创建30行120列的网格,但代码里错误声明为:
snakenode gamearr[width][height]; // 实际是120个"子数组",每个子数组仅30个元素
构造函数中循环i < height(遍历30次,当作行)、j < width(遍历120次,当作列),访问gamearr[i][j]时,j的范围是0~119,但每个子数组的长度只有30——当j >=30时,会直接越界访问到内存中相邻的子数组元素(比如gamearr[i][30]等价于gamearr[i+1][0]),初始化阶段的越界写入已经把内存搞乱,后续修改元素自然出现异常。
修复步骤
- 修正数组声明顺序,将维度改为先行数后列数,匹配你预期的网格结构:
// 在snakegame类的private区域修改 snakenode gamearr[height][width]; // 对应height行、width列的网格 - 确认访问逻辑匹配:你当前构造函数和
displayframe里的循环已经是i遍历行、j遍历列,修改数组声明后,gamearr[i][j]就能正确访问第i行第j列的元素。 - (可选但建议)初始化所有成员,避免野指针和垃圾值:
// 在构造函数的双层循环中补充 gamearr[i][j].next = nullptr; gamearr[i][j].dir = 0; gamearr[i][j].data = '#';
修改后,再执行gamearr[5][5].data = 'O'就只会修改目标单个元素,宽高120×30的场景也能正常工作。
内容的提问来源于stack exchange,提问作者jzing
相关产品推荐
相关产品推荐

