Палач - при вводе неправильной буквы появляется индекс системы сообщений вне допустимого диапазона - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь сделать игру-палач в консольном приложении, но получаю сообщение: индекс вне допустимого диапазона . На изображении ниже показано, что я могу ввести букву. Если я ввожу неправильную букву, я могу ввести новую букву. После ввода новой буквы система сообщений выходит за пределы допустимого диапазона. Я думаю, что ошибку можно найти в методе publi c bool raadletter (char letter). Эта программа содержит 2 класса, первый класс - это galgjespel класс (Hangmangame), а второй класс - program класс.

enter image description here

// Я получил это значение stacktrace ~ сообщение об ошибке на galgje2.GalgjeSpel.Raadletter (символьная буква) в C: \ Users \ surface pro \ source \ repos \ week3opdracht1 \ galgje2 \ Galgjespel.cs: строка 37 на galgje2.Program. Speelgalgje (GalgjeSpel galgje) в C: \ Users \ surface pro \ source \ repos \ week3opdracht1 \ galgje2 \ Program.cs: строка 128 в galgje2.Program.Start () в C: \ Users \ surface pro \ source \ repos \ week3opdracht1 \ galgje2 \ Program.cs: строка 28 в galgje2.Program.Main (String [] args) в C: \ Users \ surface pro \ source \ repos \ week3opdracht1 \ galgje2 \ Program.cs: строка 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;

        }
    }

1 Ответ

2 голосов
/ 07 мая 2020

Проблема заключается в коде перед точкой исключения

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;
         .....
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...