C#基于文本的游戏-选择错误后返回
我正在写一个基于C#文本的游戏来学习如何编码 我不知道如何解释这一点,但我不希望我的游戏能够识别你是否输入了错误的参数,并再次向你提问 例如C#基于文本的游戏-选择错误后返回,c#,text-based,C#,Text Based,我正在写一个基于C#文本的游戏来学习如何编码 我不知道如何解释这一点,但我不希望我的游戏能够识别你是否输入了错误的参数,并再次向你提问 例如 密码问题:你不想打开那扇门吗 你的答案是:asdhasd 代码回答:我不明白 密码问题:你不想打开那扇门吗 通常,对于此类任务,我编写一个助手方法,该方法接收字符串“prompt”(这是向用户提出的问题)和一个或多个有效响应。然后,该方法在do/while循环中重复询问问题,其条件是响应是有效答案之一 请注意,为用户提供一些有效输入的选择通常是一个好主意
- 密码问题:你不想打开那扇门吗
- 你的答案是:asdhasd
- 代码回答:我不明白
- 密码问题:你不想打开那扇门吗
do/while
循环中重复询问问题,其条件是响应是有效答案之一
请注意,为用户提供一些有效输入的选择通常是一个好主意,这样他们就会明白,如果他们输入了其他内容,为什么你会一遍又一遍地问他们相同的问题。尽管如果你接受其他答案,他们可能会惊喜不已,比如“当然”
或“不”
在下面的示例中,此方法返回一个bool
,并接受两个有效答案列表:validtrue
答案和validfalse
答案。这样,它只返回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();
}