C#基于文本的游戏-选择错误后返回

C#基于文本的游戏-选择错误后返回,c#,text-based,C#,Text Based,我正在写一个基于C#文本的游戏来学习如何编码 我不知道如何解释这一点,但我不希望我的游戏能够识别你是否输入了错误的参数,并再次向你提问 例如 密码问题:你不想打开那扇门吗 你的答案是:asdhasd 代码回答:我不明白 密码问题:你不想打开那扇门吗 通常,对于此类任务,我编写一个助手方法,该方法接收字符串“prompt”(这是向用户提出的问题)和一个或多个有效响应。然后,该方法在do/while循环中重复询问问题,其条件是响应是有效答案之一 请注意,为用户提供一些有效输入的选择通常是一个好主意

我正在写一个基于C#文本的游戏来学习如何编码

我不知道如何解释这一点,但我不希望我的游戏能够识别你是否输入了错误的参数,并再次向你提问

例如

  • 密码问题:你不想打开那扇门吗
  • 你的答案是:asdhasd
  • 代码回答:我不明白
  • 密码问题:你不想打开那扇门吗

通常,对于此类任务,我编写一个助手方法,该方法接收字符串“prompt”(这是向用户提出的问题)和一个或多个有效响应。然后,该方法在
do/while
循环中重复询问问题,其条件是响应是有效答案之一

请注意,为用户提供一些有效输入的选择通常是一个好主意,这样他们就会明白,如果他们输入了其他内容,为什么你会一遍又一遍地问他们相同的问题。尽管如果你接受其他答案,他们可能会惊喜不已,比如
“当然”
“不”

在下面的示例中,此方法返回一个
bool
,并接受两个有效答案列表:valid
true
答案和valid
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;
}
输出

下面是如果你运行它并给出一些不好的响应时的样子


如果你正在为C#console应用程序编写文本冒险,你可以在厄斯本20世纪80年代的《编写你自己的Adveture程序》一书中找到一个很好的描述,该书后来在

它使用的编程语言是旧的BASIC,因此我不建议直接使用代码(尽管.NET控制台应用程序有
Console.ReadLine()
Console.WriteLine()
,它们的工作原理与基础
INPUT
PRINT
几乎相同),但除此之外,这本书还讲述了《时代历险记》的文本是如何构建的,以及其中的计划

对于您的特定情况,旧文本adventures定义了一个可能的
动词列表
(动作)和一个可能的
名词列表
(对象)。用户可以键入单个
动词
,或者键入
动词
名词
。代码将这些与列表匹配,并根据输入的谓词跳转到特定的函数(或子例程)

然后,游戏循环提示用户进行操作,接受一些输入,以这种方式进行处理,然后返回提示

例如:

我现在该怎么办

。。。将匹配动词列表中的“north”
动词,因此程序将运行例程,将玩家向北移动一个房间(这将确保玩家实际上可以从当前位置向北移动)

我现在该怎么办

开门

。。。将字符串拆分为一个空格,匹配动词列表中的“open”
动词
,以及名词列表中的“door”
名词
。打开功能将检查播放器的位置、是否有“门”、门是否已经打开等。然后更新“门状态”以打开,并返回消息

我现在该怎么办

asdf asdf

。。。与列表中的任何动词都不匹配,因此程序将以“我不懂如何使用‘asdf’”或“我不知道‘asdf’是什么”来响应

当然,有很多方法可以解决这个问题,您可能已经有了一个与此不同的设计


希望这有帮助

你的问题毫无疑问。请阅读以获得关于如何以清晰、可回答的方式表达您的问题的批判性建议。这个问题过于宽泛,即将结束。建议:不要使用基于文本的游戏来学习如何用C#编写代码。基于文本的游戏有完整的语言。出于某种原因,“想要”一词中没有撇号。在
do{}while()中提问(并得到回答)退出条件为正确答案的循环。
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();
}