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

C++如何读取文本文件UDLR移动指令到数组并控制动画角色移动

存在的问题&修复方案

  • 问题1:指令读取循环没有对索引i执行自增操作,所有读取到的指令都会被重复写入moves[0],剩余29个数组元素全部为空,后续执行移动时自然无法匹配到U/D/L/R指令
  • 问题2:moveNumber逻辑错误:代码中先执行moveNumber++再读取moves[moveNumber],会直接跳过第一条指令moves[0],而且当moveNumber到29时,自增后变成30会直接超出数组边界(数组长度30,下标范围是0~29)
  • 问题3:首行头文件引用缺失#号,应该是#include "game.h"
  • 额外注意:需要确认Text.txt文件放在程序运行的工作目录下,避免文件读取失败;如果文本文件里的指令是连续写在同一行而非每行一条,用getline会直接把所有指令读成一个字符串,也会导致匹配失败

修复后代码片段

指令读取部分

void Game::Init()
{
    string myNum;
    //Read "moves" from the text file into array
    ifstream MyReadFile("Text.txt");
    int i = 0;
    // 增加边界判断防止数组越界,同时每次读取后i自增
    while (i < 30 && getline(MyReadFile, myNum))
     {
        // 可选:去除读取内容里的空白字符,避免空格/换行符导致匹配失败
        myNum.erase(remove_if(myNum.begin(), myNum.end(), ::isspace), myNum.end());
        moves[i] = myNum;
        i++;
    }
    MyReadFile.close();
    
    // 原有地图绘制逻辑不变
    ...
}

如果你的Text.txt是把30个指令连续写在同一行,可以把读取逻辑换成逐个字符读取:

void Game::Init()
{
    char c;
    ifstream MyReadFile("Text.txt");
    int i = 0;
    while (i < 30 && MyReadFile.get(c))
    {
        if (c == 'U' || c == 'D' || c == 'L' || c == 'R') {
            moves[i] = string(1, c);
            i++;
        }
    }
    MyReadFile.close();

    // 原有地图绘制逻辑不变
    ...
}

移动逻辑部分

void Game::Tick(float deltaTime)
{
    frameNumber++;
    if ((frameNumber % 10) == 0)
    {
        if (moveNumber < 30)
        {
            // 先读取当前moveNumber对应的指令,执行完再自增
            if (moves[moveNumber] == "R") X++;
            if (moves[moveNumber] == "L") X--;
            if (moves[moveNumber] == "U") Y--;
            if (moves[moveNumber] == "D") Y++;
            moveNumber++;
            
            // 原有背景重绘、角色绘制逻辑不变
            ...
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:24:01