Инструкция по умолчанию в переключателе, в цикле while, не прерывая C#
Основная карточная игра, есть оператор switch в цикле while. case - номер карты, выбранный пользователем, затем замененный. эта часть работает нормально. но проверяя оператор по умолчанию (любое число не 0-5), и он входит в бесконечный цикл стандартного console.writeline там, и я не уверен, почему он не ломается. в предыдущих переключателях, вложенных в циклы while, он работал для меня, но у меня никогда не было этой проблемы с бесконечным циклом в предыдущих настройках по умолчанию. любая помощь / советы?
int userInput;
string userString;
Console.WriteLine("Would you like to replace a card?");
Console.WriteLine("Select which card you would like to replace, 1-5. Enter 0 to skip");
userString = Console.ReadLine();
int.TryParse(userString, out userInput);
while (userInput != 0)
{
switch (userInput)
{
case 1:
userInput--;
userHand[userInput] = cardDeck.GetOneCard();
break;
case 2:
userInput--;
userHand[userInput] = cardDeck.GetOneCard();
break;
case 3:
userInput--;
userHand[userInput] = cardDeck.GetOneCard();
break;
case 4:
userInput--;
userHand[userInput] = cardDeck.GetOneCard();
break;
case 5:
userInput--;
userHand[userInput] = cardDeck.GetOneCard();
break;
default:
Console.WriteLine("Incorrect input, try again");
break;
}
}
2 ответа
Проблема: вы не читаете пользовательский ввод в while loop
,
если вы не читаете user input
в while
цикл это работает только one iteration
и если выбранное число находится между 1-5
это хорошо, но если выбрано число, это не 1-5
это идет к default case
и, как вы не читаете userinput
это остается тем же самым, поэтому оно войдет в infinite loop
,
Решение:
Поместите следующие операторы внутри цикла while, чтобы прочитать userInput
userString = Console.ReadLine();
int.TryParse(userString, out userInput);
Полное решение:
int userInput;
string userString;
Console.WriteLine("Would you like to replace a card?");
Console.WriteLine("Select which card you would like to replace, 1-5. Enter 0 to skip");
userString = Console.ReadLine();
int.TryParse(userString, out userInput);
while (userInput != 0)
{
switch (userInput)
{
case 1:
userInput--;
userHand[userInput] = cardDeck.GetOneCard();
break;
case 2:
userInput--;
userHand[userInput] = cardDeck.GetOneCard();
break;
case 3:
userInput--;
userHand[userInput] = cardDeck.GetOneCard();
break;
case 4:
userInput--;
userHand[userInput] = cardDeck.GetOneCard();
break;
case 5:
userInput--;
userHand[userInput] = cardDeck.GetOneCard();
break;
default:
Console.WriteLine("Incorrect input, try again");
break;
}
Console.WriteLine("Select which card you would like to replace, 1-5. Enter 0 to skip");
userString = Console.ReadLine();
int.TryParse(userString, out userInput);
}
Это потому что default
дело не меняет значение userInput
, так userInput
всегда нет 0
и петля бесконечна. Вы можете исправить это, предложив пользователю ввести новый номер:
default:
Console.WriteLine("Incorrect input, try again");
int.TryParse(Console.ReadLine(), out userInput);
break;
Это если вы хотите изменить default
только случай В противном случае, чтобы запрашивать у пользователя новый номер в каждом цикле, используйте решение Судхакара.