c# - 从 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?如果迫在眉睫,我不介意重新编码我的用户输入,我只是希望可能有一条出路。
解决方案
如果您想将用户输入限制为仅有效数字,那么您可以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);
推荐阅读
- node.js - 使用服务使用 Angular 7 迭代 json
- nginx - nginx缓存过早清空
- git - TFS xamarin 构建任务步骤
- php - barryvdh laravel dompdf 只渲染两页
- regex - 按 分割字符串。但忽略 [] 里面的内容
- amazon-web-services - 如何暂停 AWS 步骤功能并恢复它?
- python-3.x - 对 narray 使用/不使用“astype(np.float)”有什么区别吗?
- c# - 测试 ASP.NET Web API 2 应用程序时如何修复“ApplicationUserManager 为空”
- c# - 哪个更快:删除 sqlite 文件中的所有表或删除文件本身?
- ios - 使用 iOS 和 Swift 的 RestKit 映射属性的 null 值