Вам нужно поместить свой запрос в 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