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

蜗牛游戏边界控制异常:越界后输入提示重复问题排查

2D蜗牛移动游戏越界提示重复问题修复

问题现象

开发的2D蜗牛移动游戏中,蜗牛移动会留下轨迹,已实现边界校验限制移动范围,但用户输入越界指令后,系统提示重新输入时,输入提示会连续出现两次,之后才能正常操作。

问题原因

  1. 重复读取输入:原代码在越界的else分支中,手动输出输入提示并读取move值,而循环开头本身就会执行提示输入的逻辑。当触发越界后,先执行else里的提示和读取,循环结束回到开头又执行一次,导致两次提示。
  2. 边界判断逻辑错误:原代码中方向判断的边界条件搞混了行列对应变量,比如右移(修改y值)却和行数num3做比较,导致边界校验不准确。

修复方案

  • 移除else分支中的输入提示和cin >> move,改用continue让循环回到开头,由循环统一处理输入提示。
  • 修正边界判断的变量对应关系:x对应行数,y对应列数。
  • 提取地图打印逻辑为单独函数,避免代码重复。

修改后的代码

#include <iostream>
#include <vector>

using namespace std;

// 打印当前地图状态
void printMap(const vector<vector<string>>& vec) {
    for (const auto& row : vec) {
        for (const string& cell : row) {
            cout << cell << " ";
        }
        cout << endl;
    }
}

int main() {
    int rows, cols;
    cout << "请分别输入地图的行数和列数: ";
    cin >> rows >> cols;

    vector<vector<string>> map(rows, vector<string>(cols, " "));
    map[0][0] = "@";
    printMap(map);

    char move = '\0';
    int x = 0, y = 0;
    while (move != 'q') {
        cout << "请输入移动方向(w/a/s/d,按q退出): ";
        cin >> move;

        if (move == 'd') { // 右移,y增加
            if (y + 1 < cols) {
                map[x][y] = "_";
                y++;
                map[x][y] = "@";
                printMap(map);
            } else {
                cout << "超出边界,请重新输入!" << endl;
                continue; // 回到循环开头重新提示输入
            }
        } else if (move == 'a') { // 左移,y减少
            if (y - 1 >= 0) {
                map[x][y] = "_";
                y--;
                map[x][y] = "@";
                printMap(map);
            } else {
                cout << "超出边界,请重新输入!" << endl;
                continue;
            }
        } else if (move == 'w') { // 上移,x减少
            if (x - 1 >= 0) {
                map[x][y] = "_";
                x--;
                map[x][y] = "@";
                printMap(map);
            } else {
                cout << "超出边界,请重新输入!" << endl;
                continue;
            }
        } else if (move == 's') { // 下移,x增加
            if (x + 1 < rows) {
                map[x][y] = "_";
                x++;
                map[x][y] = "@";
                printMap(map);
            } else {
                cout << "超出边界,请重新输入!" << endl;
                continue;
            }
        } else if (move == 'q') {
            break;
        } else {
            cout << "无效指令,请输入w/a/s/d/q!" << endl;
        }
    }

    return 0;
}

说明

  • 新增printMap函数,将重复的地图打印逻辑提取出来,让代码更简洁易维护。
  • 修正了边界判断错误,确保x(行)的范围是0到rows-1,y(列)的范围是0到cols-1。
  • 越界或输入无效指令时,输出提示后用continue回到循环开头,由循环统一输出输入提示,避免重复提示问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:25:30