【问题标题】:Hangman - when I enter a wrong letter, the message system index out of range appearsHangman - 当我输入错误的字母时,出现消息系统索引超出范围
【发布时间】: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#


【解决方案1】:

问题出在异常点之前的代码

public bool Raadletter(char letter)
{

    char[] guesses = guessedWord.ToArray();

    // Here guessedWord is truncated
    guessedWord = "";

    // Now if the letter is not in the secretword you don repopulate the guessedword
    // So at the next loop the code builds a guesses array 
    // that doesn't match anymore to the secretWord length
    if (secretWord.Contains(letter))
    {
        for (int i = 0; i < secretWord.Length; i++)
        {
            if (secretWord[i] == letter)
            {
                guesses[i] = letter;
            }
        }
        // Here you rebuild the guessedWord, but only if you have a match
        foreach (var element in guesses)
        {
            guessedWord += element;
            ....
        }
    }
    else
    {
        // fail messages
    }

解决方法是关闭 if 并在每种情况下重建guessedWord

    char[] guesses = guessedWord.ToArray();
    guessedWord = "";

    if (secretWord.Contains(letter))
    {
        for (int i = 0; i < secretWord.Length; i++)
        {
            if (secretWord[i] == letter)
            {
                guesses[i] = letter;
            }
        }
    }
    foreach(var element in guesses)
    {
         guessedWord += element;
         .....
    }

【讨论】:

  • 非常感谢它帮了我很多你最好的:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 2013-03-08
  • 2020-09-04
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
相关资源
最近更新 更多