Змейка c# , изменение направления

608
30 декабря 2016, 09:45
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. На другом ПК работает все четко...

Answer 1

По итогам диалога в комментариях:

Главным действующим элементом в данном случае является "змейка", именно она знает, какое направление для нее допустимо а какое нет. Поэтому и проверку на допустимость нового направления, нужно делать в методе движения "змейки", а пользователь может вводить что угодно, нам просто нужно знать что было введено перед очередным движением. Соответственно - действия пользователя, без проверок складываем в буферную переменную, и перед очередным перемещением проверяем: новое направление допустимо - меняем направление и движемся, недопустимо - игнорируем и движемся в предыдущем направлении.

Подобная схема позволяет реализовать все возможные модификации поведения "змейки" при попытке изменить направление на противоположное, которые встречались в истории этой игры:

  • реверс, голова и хвост меняются местами без паузы.
  • остановка, встречается в облегченном варианте оригинала.
  • смерть, встречается в хардкорных вариантах, рассматривается как столкновение с хвостом.
READ ALSO
Кодирование текста из textBox с помощью pictureBox на С#

Кодирование текста из textBox с помощью pictureBox на С#

Всем приветНадеюсь, что здесь я найду ответ на интересующий меня вопрос

530
Знаки сравнения из string

Знаки сравнения из string

Всем приветИнтересна такая вещь,можно ли получить знаки сравнения (> < = >= <=) из string и потом использовать их?

508
Как узнать, является ли список или массив пустым

Как узнать, является ли список или массив пустым

Каким образом можно узнать, что в списке или массиве не содержится ни одного элемента?

384
Вызвать свойства окна [требует правки]

Вызвать свойства окна [требует правки]

Нужно вызвать свойства из своего приложения (путем нажатия кнопки) окна cmd с использованием c# или winapi по примеру скриншота, вся информации...

351