public void ChangeDirection(object state)
{
while (true)
{
while (Console.KeyAvailable)
{
Console.ReadKey(true);
}
ConsoleKeyInfo key = Console.ReadKey(true);
lock (state)
{
switch (key.Key)
{
//
}
}
}
这里实现了蛇的方向改变。
它是这样工作的:如果蛇向右移动,那么它可以向任何方向改变方向,但不能向左移动(也就是说,蛇不会反向移动)。一切正常,除了一件事,但如果你快速按下,例如,向上和向左,那么在同一条线上它会改变它的方向相反(禁止向左)。
在我看来,问题在于清除控制台缓冲区
while (Console.KeyAvailable)
{
Console.ReadKey(true);
}
在空旷的地方我找到了这样一种清洁它的方法,但显然它不起作用。
你能告诉我错误在哪里或者我做错了什么吗?是否有可能以某种方式获得按键队列?
我唯一的输入是在这个方法中(该方法属于 Snake 类),它在线程上调用
Snake snake = new Snake();
object obj = new object();
Thread keyboard = new Thread(snake.ChangeDirection); // Смена направления.метод, который рассматривается с самого начала
keyboard.Start(obj);
while (true)
{
lock (obj)
{
Thread.Sleep(100);
snake.Movement(obj); // перемещение координат ,switch с увелечением X или Y
}
snake.Draw();
}
PS 在另一台电脑上一切正常......
由于评论中的对话:
在这种情况下,主要的活动元素是“蛇”,她知道哪个方向对她来说是可以接受的,哪个不是。因此,必须在“snake”移动方法中检查新方向的可接受性,用户可以输入任何内容,我们只需要知道在下一个移动之前输入了什么。因此,我们将用户的操作添加到缓冲区变量中,不加检查,在下一步之前我们检查:新方向是允许的 - 我们改变方向并移动,这是不可接受的 - 我们忽略并朝之前的方向移动。
这样的方案允许您在尝试将方向更改为相反时对“蛇”的行为进行所有可能的修改,这在该游戏的历史中遇到过: