Как заставить программу go вернуться к указанной c строке кода C# - PullRequest
0 голосов
/ 13 июля 2020

Я создаю текстовую игру. Выберите свою собственную приключенческую игру, и я хочу иметь возможность заставить программу возвращаться к определенной строке кода c, если в программе выбран тупиковый вариант. Я новичок в C# и все еще учусь, так что простите меня, если это простое решение. В настоящее время я использую возврат; просто остановить программу. Вот пример моего кода ...

        Console.Write("Type OPEN or KNOCK: ");
        string doorChoice = Console.ReadLine();
        string capDoor = doorChoice.ToUpper();
        Console.WriteLine();

        if (capDoor == "OPEN")
        {
            Console.WriteLine(" The door is locked! See if one of your three keys will open it.");
            Console.Write("Enter a number (1-3): ");

            string keyChoice = Console.ReadLine();

            //Respone to the preferred key choice
            switch (keyChoice)
            {
                case "1":
                    Console.WriteLine(" You fumble getting the key into the lock, but it works!\n You open the door to find the room as if it were untouched. Strange.\n  TRY AGAIN.");
                    return;
                    

                case "2":
                    Console.WriteLine(" You choose the second key. The door doesn't open.\n TRY AGAIN");
                    return;

                case "3":
                    Console.WriteLine(" You choose the second key. The door doesn't open.\n TRY AGAIN");
                    return;
            }
        }
        else if (capDoor == "KNOCK")
        {
            Console.WriteLine(" A voice behind the door speaks to you. It says, \"Answer this riddle: \"");
            Console.WriteLine(" \"Poor people have it. Rich people need it. If you eat it you die. What is it?\"");
            
        }

Я бы хотел, чтобы программа в конечном итоге перешла на строку Console.Write ("Введите число (1-3):"); Чтобы пользователь мог просто сделать еще один выбор, а не перезапускать. Я уверен, что есть простое решение, просто не могу понять. Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 13 июля 2020

Вам нужно поместить свой запрос в al oop, который вы оставите только после того, как будет сделан правильный выбор. Поскольку вы используете переключатель, который использует ключевое слово break после каждого случая, и я рекомендую al oop, который использует break для выхода, нам нужно немного по-другому структурировать вещи, потому что мы не можем получить из l oop путем выдачи break внутри корпуса переключателя

while(true){ //loop forever unless we break
        Console.Write("Enter a number (1-3): ");
        string keyChoice = Console.ReadLine();

        //Respone to the preferred key choice
        switch (keyChoice)
        {
            case "1":
                Console.WriteLine(" You fumble ...");
                break; //break out of the switch but not the loop
                
            case "2":
                Console.WriteLine(" You choose ...");
                continue; //restart the loop

            case "3":
                Console.WriteLine(" You choose ...");
                continue; //restart the loop

            default:
                Console.WriteLine(" That isn't a valid key number, enter 1, 2 or 3");
                continue; //restart the loop
        }
        break; //break out of the loop 
}

Я изменил ваш переключатель, чтобы он имел корпус по умолчанию; до того, как ваш код не смог бы обработать пользователя, вводящего мусор

Мы также можем управлять al oop с помощью переменной, которую мы устанавливаем, когда хотим остановить цикл:

    bool keepLooping = true;
    while(keepLooping){ 
        Console.Write("Enter a number (1-3): ");
        string keyChoice = Console.ReadLine();

        switch (keyChoice)
        {
            case "1":
                Console.WriteLine(" You fumble ...");
                keepLooping = false; //stop the loop from running next time 
                break;
                
            case "2":
                Console.WriteLine(" You choose ...");
                break; 

            case "3":
                Console.WriteLine(" You choose ...");
                break;

            default:
                ...
        } 
}

Или вы можете отказаться от переключателя / корпуса и использовать if и break для выхода из l oop:

while(true){ 
        Console.Write("Enter a number (1-3): ");
        string keyChoice = Console.ReadLine();

        if(keyChoice == "1"){
                Console.WriteLine(" You fumble ...");
                break; //exit the loop
        } else
                Console.WriteLine(" You choose ...");
}

Это просто выдает сообщение «неправильный ключ», если пользователь вводит неправильный ключ или мусор.

Старайтесь видеть в своем коде не «go, чтобы указать X, если», а скорее «повторить этот раздел кода, пока какое-то условие не выполняется» - это тонкая разница, но она побудит вас задуматься о петле нужно сделать

пс; ваша жизнь станет несколько проще, если вы создадите метод, который задает вопросы и возвращает ответ:

public static string Ask(string question){
    Console.WriteLine(question + " ");
    return Console.ReadLine();
}

Используйте его как:

string keyChoice = Ask("Enter a key 1-3:");

Мы можем улучшить вещи, чтобы пользователи не вводили мусор:

public static int AskNumber(string question, int lower, int upper){
    Console.WriteLine(question + " ");

    int result; //variable for the result
    bool isNumber = int.TryParse(Console.ReadLine(), out result); //try turning the string into a number 

    //while not a number was entered or number was out of range 
    while(!isNumber || result < lower || result > upper) {
      //repeat the question
      Console.WriteLine(question + " ");

      //try parse their input again
      isNumber = int.TryParse(Console.ReadLine(), out result);
    }
    return result;
}

Это еще один пример кода, который выглядит как «l oop до тех пор, пока желаемое условие не будет выполнено» - желаемое условие, когда пользователь вводит действительный ввод

Используйте его например:

int keyChoice = AskNumber("Which key? Enter 1, 2 or 3", 1, 3);

Вы можете быть уверены, что ответ будет 1, 2 или 3, поэтому вам не нужно обрабатывать мусор в каждом переключателе et c

0 голосов
/ 13 июля 2020

Хотя предложения использовать while(){} l oop действительно верны и очень желательны для языков высокого уровня, все же есть возможность сделать именно то, что вам нужно в c#, используя метки и goto команда:

<some code>
My_label:
<some other code>
goto My_label;

Остерегайтесь, это довольно низкоуровневая конструкция, и поэтому вам полностью решать, чтобы не возникло никаких проблем (например, это может создать бесконечный l oop без предупреждения...). Тем не менее, это полезная конструкция, которую, например, можно использовать для выхода из вложенных блоков кода.

Проверьте документы Microsoft: . NET docs

0 голосов
/ 13 июля 2020

Вы можете использовать цикл do-while. Я не уверен, каково ваше условие выхода

       int x;
            do
            {
                bool result = int.TryParse(Console.ReadLine(), out x);
                switch (x)    
                {
              
                case 1:
                    {
                       // some code  
                        break;
                    }
                case 2:
                    {
                        some code
                        break;
                    }
                default:
                    {
                        if (x == 3)
                        {
                            Console.WriteLine("Exit");
                        }
                        else
                        {
                            Console.WriteLine("Choose a number from 1 or 2");
                        }
                        break;
                    }
               }
        } while (x!=3);

Вы можете использовать оператор goto https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/goto

using System;
                    
public class Program
{
    public static void Main()
    {
        Console.Write("Type OPEN or KNOCK: ");
        string doorChoice = Console.ReadLine();
        string capDoor = doorChoice.ToUpper();
        Console.WriteLine();

        if (capDoor == "OPEN")
        {
            One:
            Console.WriteLine(" The door is locked! See if one of your three keys will open it.");
            Console.Write("Enter a number (1-3): ");

            string keyChoice = Console.ReadLine();

            //Respone to the preferred key choice
            switch (keyChoice)
            {
                case "1":
                    Console.WriteLine(" You fumble getting the key into the lock, but it works!\n You open the door to find the room as if it were untouched. Strange.\n  TRY AGAIN.");
                    goto One;
                    return;
                    

                case "2":
                    Console.WriteLine(" You choose the second key. The door doesn't open.\n TRY AGAIN");
                    return;

                case "3":
                    Console.WriteLine(" You choose the second key. The door doesn't open.\n TRY AGAIN");
                    return;
            }
        }
        else if (capDoor == "KNOCK")
        {
            Console.WriteLine(" A voice behind the door speaks to you. It says, \"Answer this riddle: \"");
            Console.WriteLine(" \"Poor people have it. Rich people need it. If you eat it you die. What is it?\"");
            
        }
    }
}
0 голосов
/ 13 июля 2020

Поместите console.write в его собственный метод и вызовите этот метод, когда захотите, например, из оператора if или оператора case. Вы не вводите код go на конкретный номер строки c. Это не линейное программирование, такое как BASI C.

Например, я создал метод с именем EnterNumber ():

 Console.Write("Type OPEN or KNOCK: ");
        string doorChoice = Console.ReadLine();
        string capDoor = doorChoice.ToUpper();
        Console.WriteLine();

        if (capDoor == "OPEN")
        {
            Console.WriteLine(" The door is locked! See if one of your three keys will open it.");
            EnterNumber();

            string keyChoice = Console.ReadLine();

            //Respone to the preferred key choice
            switch (keyChoice)
            {
                case "1":
                    Console.WriteLine(" You fumble getting the key into the lock, but it works!\n You open the door to find the room as if it were untouched. Strange.\n  TRY AGAIN.");
                  
                    EnterNumber();
                    return;
                    

                case "2":
                    Console.WriteLine(" You choose the second key. The door doesn't open.\n TRY AGAIN");
                    EnterNumber();
                    return;

                case "3":
                    Console.WriteLine(" You choose the second key. The door doesn't open.\n TRY AGAIN");
                    return;
            }
        }
        else if (capDoor == "KNOCK")
        {
            Console.WriteLine(" A voice behind the door speaks to you. It says, \"Answer this riddle: \"");
            Console.WriteLine(" \"Poor people have it. Rich people need it. If you eat it you die. What is it?\"");
            
        }


private void EnterNumber()
{
     Console.Write("Enter a number (1-3): ");
}

В этом случае я установил logi c чтобы попросить пользователя ввести число, если capDoor = "open" и если keyChoice = 1 или 2. Но дело в том, что вы можете попросить пользователя ввести число, когда захотите.

Это помогает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...