C++控制台小游戏修改level数组实现玩家移动时渲染异常截断
控制台小游戏移动渲染中断问题说明
根本诱因
- 核心问题为数组越界访问:
display数组仅定义了索引0、1、2对应的3个元素,而玩家移动逻辑中会向level数组写入值3,渲染时直接将level的元素值作为display的下标。首次渲染时level数组仅包含0、1、2三类值,对应display的有效索引,因此可正常渲染;移动操作写入3后,渲染时访问到display[3]属于非法内存操作,直接触发程序崩溃,导致渲染流程截断。 - 附带逻辑错误:
- 右移逻辑与预期不符:输入2触发的移动操作实际为
playerpos = playerpos -1,对应向左移动,与右移需求相反。 - 玩家初始位置不匹配:
level数组中初始值为2(玩家标记)的索引为14,代码中playerpos初始值设为15,导致初始逻辑不一致。 level数组类型定义不合理:使用double类型存储本应为整数的关卡标记,存在隐式类型转换风险。
- 右移逻辑与预期不符:输入2触发的移动操作实际为
修复方法
- 补全
display数组的玩家显示项,为索引3添加合法的字符映射:const char *display[] = {" ", "[ ]", "[X]", "[P]"}; - 修正右移逻辑,将移动操作改为索引递增:
if (input == 2) { level[playerpos] = 0; playerpos = playerpos + 1; // 修正原减1的错误,实现右移效果 level[playerpos] = 3; } - 修正玩家初始位置与关卡数据匹配:
playerpos = 14; // 对齐level数组中初始玩家标记的索引位置 - 调整
level数组的类型为int:int level[] = {1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 2, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1}; - (可选优化)将
render和player函数的返回类型改为void,移除函数末尾无意义的return 0(即删除end;语句),避免冗余代码。
内容的提问来源于stack exchange,提问作者Jerry Todd
相关产品推荐
相关产品推荐

