首页 > 解决方案 > 从 Console.ReadKey().KeyChar 中减去 1

问题描述

作为提高我的编码技能的个人项目,我正在创建一个小型命令行文本游戏。该程序通过以下行接收用户输入: char Answer = char.ToUpper(Console.ReadKey().KeyChar)

在这个程序的大部分情况下,它工作得很好,用户点击一个按钮,它会自动抓取用户输入的内容(这个答案主要用于列出的选择选项),但是,我有一个用户可以输入的错误未显示在列表中的数字。以下是如何发生这种情况的示例。

PrintMessage.print(ViewEnter(character, input), 4);

for (int i = 0; i < x.buildings[character.CurBuild].Rooms.Length; i++)
{
    PrintMessage.print("\t" + (i + 1) + " - Room " + (i + 1));
}

try
{
    PrintMessage.printSame("Choice: ", 4);
    answer = Console.ReadKey(true);
    Console.Clear();

    if (int.TryParse(answer.KeyChar.ToString(), out num))
    {
        character.CurRoom = num - 1;
        PrintMessage.print("You enter the " + 
            x.buildings[character.CurBuild].rooms[character.CurRoom].areaDescription);
    }
}
catch
{
    PrintMessage.printError("Please enter a valid selection.");
}

for 循环显示用户输入的有效选项列表。 i+1 用于列表的用户友好数字值(因此第一个选项不是 0,而是显示为 1)。但是,我一直在试图弄清楚如何从用户输入中减去一个数值以显示如上所示的列表。我的直觉反应是重新编码我的用户输入方法,这将取消这个错误和任何其他类似的错误(我目前有)。

当玩家进入建筑物或玩家进入房间时,此错误会影响两个区域。两者都使用相同风格的代码,只是根据它们当前所在的位置使用不同的变量而已。

有没有一种半简单或优雅的方法从 Console.ReadKey() 中减去 1?如果迫在眉睫,我不介意重新编码我的用户输入,我只是希望可能有一条出路。

标签: c#

解决方案


如果您想将用户输入限制为仅有效数字,那么您可以if通过检查数字是否大于零并且小于或等于数组的长度来检查您的条件(这是您的数字范围'将它们作为选项呈现)。然后您可以从中减去1以用作索引:

if (int.TryParse(answer.KeyChar.ToString(), out num) && 
    num > 0 && num <= x.buildings[character.CurBuild].Rooms.Length)
{
    character.CurRoom = num - 1;
    PrintMessage.print("You enter the " + 
        x.buildings[character.CurBuild].rooms[character.CurRoom].areaDescription);
}

作为旁注, thetry\catch没有捕获任何东西,因为int.TryParse不会引发异常。相反,我们可以做的是将条件放在一个do\while循环中,它会一直要求输入,直到返回有效的响应:

// This do/while loop will continue until the user enters a valid number
do
{
    PrintMessage.print(ViewEnter(character, input), 4);

    for (int i = 0; i < x.buildings[character.CurBuild].Rooms.Length; i++)
    {
        PrintMessage.print("\t" + (i + 1) + " - Room " + (i + 1));
    }

    PrintMessage.printSame("Choice: ", 4);
    answer = Console.ReadKey(true);
    Console.Clear();
} while (!int.TryParse(answer.KeyChar.ToString(), out num) || 
         num < 1 || num > x.buildings[character.CurBuild].Rooms.Length);

// When we exit the loop, we know that `num` is valid. Now we subtract `1` and continue
character.CurRoom = num - 1;
PrintMessage.print("You enter the " + 
    x.buildings[character.CurBuild].rooms[character.CurRoom].areaDescription);

推荐阅读