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

C#控制台应用角色移动异常问题求助

问题分析与修复方案

你的代码存在以下核心问题:

  • 多余的Console.ReadLine():强制要求按回车键才显示角色,打乱后续按键响应逻辑,导致移动操作异常。
  • 无边界碰撞检测:移动时未限制坐标范围,角色可直接移出房间边界。
  • 错误使用Console.WriteLine():该方法自动换行,会造成输出混乱,应使用Console.Write()输出角色。
  • 边界绘制索引错误:房间宽高为20,控制台光标坐标从0开始,底部和右侧边界应使用MapHeight-1和MapWidth-1,否则会超出有效范围,出现奇怪的数字输出。
  • 无效数组创建:MapGeneratorArray被创建但从未使用,属于冗余代码。
  • 移动后未重绘房间:按下方向键后直接清屏仅绘制角色,导致房间边界消失,角色失去参照。

修复后的完整代码:

static void Main(string[] args)
{
    ConsoleKeyInfo consoleKey;

    int XPositionCursor = 5;
    int YPositionCursor = 5;

    int MapWidth = 20;
    int MapHeight = 20;

    int GameOver = 0;

    string Character = "H";

    do
    {
        Console.Clear();

        // 绘制房间边界(修正索引,使用MapWidth-1和MapHeight-1)
        for (int i = 0; i < MapWidth; i++)
        {
            Console.SetCursorPosition(i, 0);
            Console.Write("I");
            Console.SetCursorPosition(i, MapHeight - 1);
            Console.Write("I");
        }

        for (int i = 0; i < MapHeight; i++)
        {
            Console.SetCursorPosition(0, i);
            Console.Write("I");
            Console.SetCursorPosition(MapWidth - 1, i);
            Console.Write("I");
        }

        // 绘制角色
        Console.SetCursorPosition(XPositionCursor, YPositionCursor);
        Console.Write(Character);

        // 获取按键输入
        consoleKey = Console.ReadKey(true);

        // 根据按键更新坐标,并添加边界检测
        switch (consoleKey.Key)
        {
            case ConsoleKey.UpArrow:
                if (YPositionCursor > 1) // 上方边界是0,角色不能小于1
                    YPositionCursor--;
                break;
            case ConsoleKey.DownArrow:
                if (YPositionCursor < MapHeight - 2) // 下方边界是MapHeight-1,角色不能大于这个值减1
                    YPositionCursor++;
                break;
            case ConsoleKey.LeftArrow:
                if (XPositionCursor > 1) // 左边界是0,角色不能小于1
                    XPositionCursor--;
                break;
            case ConsoleKey.RightArrow:
                if (XPositionCursor < MapWidth - 2) // 右边界是MapWidth-1,角色不能大于这个值减1
                    XPositionCursor++;
                break;
        }
    } while (GameOver == 0);
}

关键修改说明:

  1. 移除多余的Console.ReadLine(),让角色和房间直接显示,按键响应更流畅。
  2. 给角色移动添加边界判断,确保角色始终在房间内部(不会碰到边界墙)。
  3. 修正边界绘制坐标,使用MapWidth-1和MapHeight-1,避免超出控制台有效范围。
  4. 将移动逻辑中的Console.WriteLine()改为Console.Write(),移除移动后不必要的清屏和单独绘制角色的代码,改为每次循环重绘整个房间和角色,保证界面一致性。
  5. 删除未使用的MapGeneratorArray数组,精简代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:45:30