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

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类型存储本应为整数的关卡标记,存在隐式类型转换风险。

修复方法

  1. 补全display数组的玩家显示项,为索引3添加合法的字符映射:
    const char *display[] = {"   ", "[ ]", "[X]", "[P]"};
    
  2. 修正右移逻辑,将移动操作改为索引递增:
    if (input == 2) {
        level[playerpos] = 0;
        playerpos = playerpos + 1; // 修正原减1的错误,实现右移效果
        level[playerpos] = 3;
    }
    
  3. 修正玩家初始位置与关卡数据匹配:
    playerpos = 14; // 对齐level数组中初始玩家标记的索引位置
    
  4. 调整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};
    
  5. (可选优化)将render和player函数的返回类型改为void,移除函数末尾无意义的return 0(即删除end;语句),避免冗余代码。

内容的提问来源于stack exchange,提问作者Jerry Todd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 00:54:04