Инструкция по умолчанию в переключателе, в цикле 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 только случай В противном случае, чтобы запрашивать у пользователя новый номер в каждом цикле, используйте решение Судхакара.

Другие вопросы по тегам