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();
}
P.S. На другом ПК работает все четко...
По итогам диалога в комментариях:
Главным действующим элементом в данном случае является "змейка", именно она знает, какое направление для нее допустимо а какое нет. Поэтому и проверку на допустимость нового направления, нужно делать в методе движения "змейки", а пользователь может вводить что угодно, нам просто нужно знать что было введено перед очередным движением. Соответственно - действия пользователя, без проверок складываем в буферную переменную, и перед очередным перемещением проверяем: новое направление допустимо - меняем направление и движемся, недопустимо - игнорируем и движемся в предыдущем направлении.
Подобная схема позволяет реализовать все возможные модификации поведения "змейки" при попытке изменить направление на противоположное, которые встречались в истории этой игры:
Виртуальный выделенный сервер (VDS) становится отличным выбором
Всем приветНадеюсь, что здесь я найду ответ на интересующий меня вопрос
Всем приветИнтересна такая вещь,можно ли получить знаки сравнения (> < = >= <=) из string и потом использовать их?
Каким образом можно узнать, что в списке или массиве не содержится ни одного элемента?
Нужно вызвать свойства из своего приложения (путем нажатия кнопки) окна cmd с использованием c# или winapi по примеру скриншота, вся информации...