所以我现在已经开始使用控制台游戏了一段时间,我决定使用.txt文件来保存地图。此代码打开并存储txt文件内容:
static void LoadMap(string fname)
{
string _org = File.ReadAllText("Maps/" + fname + ".txt");
_org.Split(',');
string[] _tmp = new string[_org.Length];
for (int i=0;i<_org.Length;i++)
{
_tmp[i] = _org[i].ToString();
}
//This line has the error
for (int i=0;_tmp[i]!="$";i+=2)
{
mapwidth += 1;
}
for (int i=0;i<_tmp.Length;i++)
{
leveldata.Add(_tmp[i]);
}
}
我收到此错误:索引超出了数组的范围。我无法确定原因。有人可以帮忙吗?感谢
答案 0 :(得分:3)
检查变量i
是否未超出数组Length - 1
的值。
static void LoadMap(string fname)
{
string _org = File.ReadAllText("Maps/" + fname + ".txt");
_org.Split(',');
string[] _tmp = new string[_org.Length];
for (int i = 0;i < _org.Length; i++)
{
_tmp[i] = _org[i].ToString();
}
for (int i = 0;i < _tmp.Length && _tmp[i] != "$"; i += 2)
{
mapwidth += 1;
}
for (int i = 0;i < _tmp.Length; i++)
{
leveldata.Add(_tmp[i]);
}
}
答案 1 :(得分:0)
我不确定你在这里得到了什么,但我觉得foreach
可能是朝着正确方向迈出的一步。
首先,我在您提供的代码中注意到了一些事项。
string _org = File.ReadAllText("Maps/" + fname + ".txt");
_org.Split(',');
您已在此处提取了文本文件,并使用逗号分隔符拆分_org
。虽然您实际上从未将split数组分配给变量。 _org
仍然是string
,而不是string[]
。
string[] _tmp = new string[_org.Length];
for (int i = 0; i < _org.Length; i++)
{
_tmp[i] = _org[i].ToString();
}
在这个块中,我们使用_tmp
的长度将_org
设置为字符串数组。在这种情况下,Length
属性将检索字符串_org
中的字符数。假设_org
设置为"foo"
,_tmp
数组的大小现为3.(0,1,2)
然后继续加载_tmp
,将_org
的第n个字符转换为字符串。
此时我们的变量中包含以下内容。
_org = "foo"
_tmp = {"f","o","o"}
下一部分让我措手不及,因为我无法确定你想要完成什么。
for (int i = 0; _tmp[i] != "$"; i += 2)
{
mapwidth += 1;
}
您处于for循环中,直到_tmp[i]
等于"$"
,并且每次使用2
移动循环时,您都会将i
添加到i += 2
。这个逻辑将打破循环,直到它到达"$"
,或者如果i
增长到数组的边界之外,它将抛出异常。
然后,您继续为mapwidth
的每两个增量i
添加一个
在最后一个块中,您要将_tmp
数组的内容添加到leveldata
for (int i = 0; i < _tmp.Length; i++)
{
leveldata.Add(_tmp[i]);
}
现在好的东西,foreach
。
我假设您想将_org设置为数组,并且您希望所有不是“$”的内容。记住,这应该可以实现你想要的目标,虽然我不确定在第二个for循环中增加2的目的所以我现在已经把它留了。
static void LoadMap(string fname)
{
string[] _org = File.ReadAllText("Maps/" + fname + ".txt").Split(',');
foreach (var _tmp in _org)
{
if (_tmp != "$")
{
mapwidth += 1;
}
leveldata.Add(_tmp);
}
}
如果你想继续编码,那么掌握基础知识总是一个好主意。
虽然这里有点陈述是微软在C#编程基础知识的一个很好的教程: C# Programmer's Reference
答案 2 :(得分:-1)
尝试此链接。
https://www.programiz.com/csharp-programming/foreach-loop
使用建议关键字来避免索引超出数组范围。
示例代码。
for(int i = 0; i < myArray.Length; i++)
{
// Coding to Array for loop.
}