【发布时间】:2020-05-07 14:33:20
【问题描述】:
我正在尝试在控制台应用程序中制作刽子手游戏,但收到一条消息index out of range。
下图显示我可以输入字母。如果我输入了一个错误的字母,我可以在输入一个新字母后输入一个新字母,我会导致消息系统超出范围。
我认为错误可以在方法 public bool raadletter (char letter) 中找到。
这个程序包含2个类,第一类是galgjespel类(hangmangame),第二类是program类。
//我得到了这个stacktrace值 ~ 错误信息 在 C:\Users\surface pro\source\repos\week3opdracht1\galgje2\Galgjespel.cs 中的 galgje2.GalgjeSpel.Raadletter(Char letter):第 37 行 在 C:\Users\surface pro\source\repos\week3opdracht1\galgje2\Program.cs 中的 galgje2.Program.Speelgalgje(GalgjeSpel galgje):第 128 行 在 C:\Users\surface pro\source\repos\week3opdracht1\galgje2\Program.cs 中的 galgje2.Program.Start():第 28 行 在 C:\Users\surface pro\source\repos\week3opdracht1\galgje2\Program.cs 中的 galgje2.Program.Main(String[] args):第 14 行 ~
//
class GalgjeSpel
{
public string secretWord;
public string guessedWord;
public void Init(string secretword)
{
this.secretWord = secretword;
this.guessedWord="";
char[] letter = new char [secretword.Length];
for (int i =0; i< letter.Length; i++)
{
this.guessedWord += ".";
}
}
public bool Raadletter(char letter)
{
char[] guesses = guessedWord.ToArray();
guessedWord = "";
if (secretWord.Contains(letter))
{
for(int i=0; i<secretWord.Length; i++)
{
// somewhere on this place i get the index out of range message
if (secretWord[i]==letter)
{
guesses[i] = letter;
}
}
foreach(var element in guesses)
{
guessedWord += element;
if (element!='.')
{
Console.Write($"{element} ");
}
else
{
Console.Write($". ");
}
}
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("------------------------------");
Console.ResetColor();
Console.WriteLine();
// return true;
}
else
{
Console.WriteLine("letter does not match secretword");
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("------------------------------");
Console.ResetColor();
}
return false;
}
}
////
class Program
{
static void Main(string[] args)
{
Program myProgam = new Program();
myProgam.Start();
Console.ReadKey();
}
void Start()
{
GalgjeSpel galgje = new GalgjeSpel();
galgje.Init("eetlepel");
List<string> woordenlijst = WoordenLijst();
string nieuwwoord= SelecteerWoord(woordenlijst);
galgje.Init(nieuwwoord);
ToonWoord(nieuwwoord);Speelgalgje(galgje);
//Console.WriteLine("Het geheime woord is: " + galgje.geheimWoord);
//Console.WriteLine("Het geraden woord is: " + galgje.geradenWoord);
}
List <string> WoordenLijst()
{
List<string> Woordenlijst = new List<string>();
Woordenlijst.Add("slapen");
Woordenlijst.Add("poepen");
Woordenlijst.Add("eten");
Woordenlijst.Add("vakantie");
Woordenlijst.Add("reizen");
return Woordenlijst;
}
string SelecteerWoord(List<string> woorden)
{
GalgjeSpel gaglje = new GalgjeSpel();
Random rnd = new Random();
int randomwoord = rnd.Next(1, 5);
string nieuwwoord = woorden[randomwoord];
gaglje.secretWord = nieuwwoord;
return nieuwwoord;
}
void ToonWoord(string woord)
{
GalgjeSpel galgje = new GalgjeSpel();
Console.Write($"The secret word is : ");
char[] letter = woord.ToArray();
for (int i = 0; i< woord.Length; i++)
{
galgje.secretWord += letter[i];
Console.Write($"{letter[i]} ");
}
Console.WriteLine();
Console.Write("the guessed word is : ");
for (int i = 0; i < woord.Length; i++)
{
galgje.guessedWord += (". ");
Console.Write(". ");
}
Console.WriteLine();
}
void ToonLetter(List<char> letters)
{
Console.Write("the letters entered are : ");
foreach (var element in letters)
{
Console.Write($" {element} ");
}
Console.WriteLine();
}
char LeesLetter(List<char> geheimeletters)
{
char letter;
do
{ Console.WriteLine();
Console.Write("enter a letter : ");
letter = char.Parse(Console.ReadLine());
return letter;
} while (geheimeletters.Contains(letter));
{
}
}
bool Speelgalgje(GalgjeSpel galgje)
{
//char lijst van ingevoerde letters
List<char> ingevoerdeLetters = new List<char>();
// char lijst van geheime letters
List<char> geheimeletters = new List<char>();
// zet elke geheime letter in een char array
char[]geheimewoord = galgje.secretWord.ToArray();
// voeg elke char letter toe aan lijst van geheime letters
for (int i=0; i<geheimewoord.Length; i++)
{
geheimeletters.Add(geheimewoord[i]);
if (galgje.guessedWord == galgje.secretWord)
{
return true;
}
else
{ char letter = LeesLetter(geheimeletters);
ingevoerdeLetters.Add(letter);
ToonLetter(ingevoerdeLetters);
galgje.Raadletter(letter);
}
}return false;
}
}
【问题讨论】:
-
如果您还包括错误消息和堆栈跟踪,人们会更容易帮助回答问题。这将有助于指出问题所在的代码行。
-
我添加了一张带有错误信息的图片
-
请将堆栈跟踪作为文本粘贴到问题中。如果单击右侧的小放大镜或堆栈跟踪,您可以看到完整的堆栈跟踪(并复制它)
-
当索引超出范围时,通常意味着您试图在数组中获取的值大于或小于数组本身。确保数组中的选定值永远不会大于数组。
标签: c#