为什么`Console.Read()`继续跳到另一个地方?

时间:2013-04-16 17:13:20

标签: c# if-statement timer console character

我有一种方法可以用来询问一个人想要进入Console游戏的方式。

提到的方法:

private static void dirChoose()

{
    Console.SetCursorPosition(0, 7);
    Console.WriteLine("A mysterious voice says \"Which way will you go?\"");
    Console.WriteLine("Type");
    if (curLeft == false) { Console.WriteLine("(L)eft    "); }
    if (curUp == false) { Console.WriteLine("(U)p        "); }
    if (curRight == false) { Console.WriteLine("(R)ight  "); }
    if (curDown == false) { Console.WriteLine("(D)own    "); }

    Console.SetCursorPosition(49, 7);

    userDirInput = Convert.ToChar(Console.Read());
    Console.SetCursorPosition(0, 13);
    Console.Write("read as " + userDirInput);

         if (userDirInput == 'u' || userDirInput == 'U') { reDir = 1; userDirInput = 'y'; }//up
    else if (userDirInput == 'd' || userDirInput == 'D') { reDir = 3; userDirInput = 'y'; }//down
    else if (userDirInput == 'l' || userDirInput == 'L') { reDir = 0; userDirInput = 'y'; }//left
    else if (userDirInput == 'r' || userDirInput == 'R') { reDir = 2; userDirInput = 'y'; }//right
    else//anything besides
    {
        Console.SetCursorPosition(0, 14);
        Console.WriteLine("You entered an incorrect direction. Please try again.");
        Console.SetCursorPosition(rWALL_STOP - 1, 3);

        doneBool = false;
        t.Elapsed += right;
        t.Start();

    }
}//dirChoose()

在回答“你走哪条路?”的问题时。支持读取输入的第一个字符。所以你要输入整个单词“left”或“right”然后它会读“l”和“r”。然后它应该改变一个数字,并让它做它应该做的事情。由于一些奇怪的原因,它在读完第一个后跳到第二个,所以它然后将适当的方法添加到计时器并继续前进。

注意:

static Timer t = new Timer(16);
public static char userDirInput { get; set; }

public static bool curLeft { get; set; }
public static bool curUp { get; set; }
public static bool curRight { get; set; }
public static bool curDown { get; set; }
public static bool doneBool{ get; set; }

所以我的问题是“为什么光标会在第一个字符后跳到第二个字符?如何修复?”

2 个答案:

答案 0 :(得分:1)

您可以按如下方式阅读密钥。将值false传递给ReadKey()将在屏幕上回显输入的值。

ConsoleKeyInfo cki = Console.ReadKey(false);
userDirInput = cki.KeyChar;

而不是

userDirInput = Convert.ToChar(Console.Read());

答案 1 :(得分:0)

我不确定我理解你的问题,但你似乎误解了Console.Read()的行为。当您调用Console.Read()时,您将获得缓冲区中的下一个字符。如果用户键入“left”然后按Enter键,则会调用console read来获取'l',然后缓冲区中将剩下5个字符。下一个调用将返回'e',然后是'f',然后是't',然后是'\ r',然后是'\ n'。

因此,如果用户输入“left \ r \ n”,则第二次调用dirChoose()时,它将表现为无法识别的输入。