C# текстовая игра - возвращение после неправильной опции

Я пишу текстовую игру на C#, чтобы научиться кодировать.

Я не знаю, как это объяснить, но я не хочу, чтобы моя игра могла распознавать, если вы вводите неправильный параметр и задает вам вопрос, который вам задают снова.

Например

  • Кодовый вопрос: ты не хочешь открыть эту дверь?
  • Ваш ответ: asdhasd
  • Ответ на код: я не могу этого понять.
  • Кодовый вопрос: ты не хочешь открыть эту дверь?

2 ответа

Обычно для такого рода задач я пишу вспомогательный метод, который принимает строку "prompt" (которая является вопросом, задаваемым пользователю) и один или несколько допустимых ответов. Затем метод неоднократно задает вопрос в do/while цикл, условие которого состоит в том, что ответ является одним из действительных ответов.

Обратите внимание, что обычно хорошей идеей является дать пользователю несколько вариантов правильного ввода (y/n) поэтому у них есть идея, почему вы продолжаете задавать им один и тот же вопрос снова и снова, если они вводят что-то еще. Хотя они могут быть приятно удивлены, если вы примете другие ответы, такие как "sure" или же "nope",

В приведенном ниже примере этот метод возвращает boolи принимает два списка правильных ответов: действительный true ответы и действительные false ответы. Таким образом, это только возвращает true или же false, но принимает широкий спектр ввода от пользователя:

public static bool GetBoolFromUser(string prompt, List<string> validTrueResponses, 
    List<string> validFalseResponses, StringComparison comparisonType)
{
    string response;

    // Combine all valid responses for the sake of the loop
    var allValidResponses = 
        validTrueResponses?.Union(validFalseResponses) ?? validFalseResponses;

    do
    {
        Console.Write(prompt);
        response = Console.ReadLine();
    } while (allValidResponses != null &&
             !allValidResponses.Any(r => r.Equals(response, comparisonType)));

    // Now return true or false depending on which list the response was found in
    return validTrueResponses?.Any(r => r.Equals(response, comparisonType)) ?? false;
}

Затем в нашем основном коде мы можем создать два списка допустимых ответов, передать их вместе с приглашением вышеописанному методу, и мы знаем, что он вернет нам true или же false результат, который мы можем использовать для принятия решения:

private static void Main()
{
    // Add any responses you want to allow to these lists
    var trueResponses = new List<string>
    {
        "y", "yes", "ok", "sure", "indeed", "yep", "please", "true"
    };

    var falseResponses = new List<string>
    {
        "n", "no", "nope", "nah", "never", "not on your life", "false"
    };

    bool openDoor = GetBoolFromUser("Do you want to open the door? (y/n): ",
        trueResponses, falseResponses, StringComparison.OrdinalIgnoreCase);

    if (openDoor)
    {
        Console.WriteLine("Ok, opening the door now!");
    }
    else
    {
        Console.WriteLine("Ok, leaving the door closed!");
    }

    Console.Write("\nDone!\nPress any key to exit...");
    Console.ReadKey();
}

Выход

Вот как это выглядит, если вы запустите его и дадите несколько плохих ответов...

введите описание изображения здесь

Если вы пишете текстовое приключение для консольного приложения на C#, вы можете найти хорошее описание одного из возможных способов структурирования текстовой приключенческой игры в компьютерной книге Usborne 1980-х годов под названием "Напишите свои собственные программы Adveture", которая с тех пор была выпущена бесплатно. на https://usborne.com/browse-books/features/computer-and-coding-books/

Используемый язык программирования - старый бейсик, поэтому я не рекомендовал бы использовать код напрямую (хотя консольные приложения.NET имеют Console.ReadLine() а также Console.WriteLine() которые работают почти так же, как бейсики INPUT а также PRINT), но более того, в книге рассказывается о том, как были структурированы текстовые приключения того времени, и о планировании, которое в него входит.

Для вашей конкретной ситуации старые текстовые приключения определили список возможных verbs (действия) и список возможных nouns (объекты). Пользователь будет вводить либо один verbили verb и noun, Код сопоставит их со списками и перейдет к определенной функции (или подпрограмме) на основе введенного глагола.

Затем игровой цикл попросил пользователя о действии, принял некоторые данные, обработал их таким образом и вернулся к запросу.

Например:

Что мне теперь делать?

к северу

... будет соответствовать "северу" verb в списке глаголов, так что программа будет запускать процедуру, чтобы переместить игрока на одну комнату на север (что позволит игроку на самом деле идти на север от своего текущего местоположения).

Что мне теперь делать?

открытая дверь

... разбил бы строку на пробел, соответствовал бы "открытому" verb из списка глаголов и "дверь" noun из списка существительных. Затем функция открытия проверяет, где находится игрок, есть ли там "дверь", была ли дверь уже открыта и т. Д., Затем обновляет "состояние двери", чтобы открыть, и возвращает сообщение.

Что мне теперь делать?

asdf asdf

... не соответствует ни одному глаголу в списке, поэтому программа ответит: "Я не понимаю, как" asdf "" или "Я не знаю, что такое" asdf "".

Конечно, есть много подходов к решению этой проблемы, и у вас уже может быть дизайн, который отличается от этого.

Надеюсь это поможет

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