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
相关产品推荐
相关产品推荐

