C# - Проблемы с анимацией, используя метод readkey()

Я пытаюсь создать консольное приложение, которое позволит пользователю управлять анимацией слова на экране. В основном я показываю слово, и затем оно начинает двигаться в соответствии с клавишами, нажатыми пользователем. Это почти работает, но по некоторым причинам, я не могу понять, пользователь должен был бы нажать 2 или 3 раза клавишу leftArrow, чтобы слово двигалось влево, и то же самое происходит для других клавиш upArrow, RightArrow и downArrow. Пользователь должен нажимать клавишу только один раз, и слово будет двигаться в этом направлении.

Я знаю, что мне все еще приходится иметь дело с исключениями для конца экрана (indexoutofrange), но это будет сделано буквой. Сначала я хочу заставить работать элементы управления.

Спасибо за помощь

using System;
using System.Threading;

namespace Annimation
{
    class Program
    {
        static void Main(string[] args)
        {
            Boolean endOfCanvas = false;
            int x = 20, y = 25;
            ConsoleKeyInfo dir = new ConsoleKeyInfo();
            String word = "@@@@@@@@@@@";

            Console.WriteLine(word);

            do
            {
                do
                {
                    dir = Console.ReadKey(true);
                    while (Console.KeyAvailable == false)
                    {
                        if (dir.Key == ConsoleKey.DownArrow)
                        {
                            System.Console.Clear();
                            Console.SetCursorPosition(x, y);
                            Console.WriteLine(word);
                            Thread.Sleep(100);
                            Console.WriteLine("down");
                            y++;
                        }
                        else if (dir.Key == ConsoleKey.UpArrow)
                        {
                            System.Console.Clear();
                            Console.SetCursorPosition(x, y);
                            Console.WriteLine(word);
                            Thread.Sleep(100);
                            Console.WriteLine("up");
                            y--;
                        }
                        else if (dir.Key == ConsoleKey.LeftArrow)
                        {
                            System.Console.Clear();
                            Console.SetCursorPosition(x, y);
                            Console.WriteLine(word);
                            Thread.Sleep(100);
                            Console.WriteLine("Left");
                            x--;
                        }
                        else if (dir.Key == ConsoleKey.RightArrow)
                        {
                            System.Console.Clear();
                            Console.SetCursorPosition(x, y);
                            Console.WriteLine(word);
                            Thread.Sleep(100);
                            Console.WriteLine("Right");
                            x++;
                        }

                    }
                } while (Console.ReadKey(true).Key == ConsoleKey.DownArrow ||
                                Console.ReadKey(true).Key == ConsoleKey.UpArrow ||
                                Console.ReadKey(true).Key == ConsoleKey.RightArrow ||
                                Console.ReadKey(true).Key == ConsoleKey.LeftArrow);
            } while (!endOfCanvas);
        } 
    }
}

2 ответа

Кажется, проблема в вашем нижнем цикле.

while ((Console.ReadKey(true).Key == ConsoleKey.DownArrow ||
                                Console.ReadKey(true).Key == ConsoleKey.UpArrow ||
                                Console.ReadKey(true).Key == ConsoleKey.RightArrow ||
                                Console.ReadKey(true).Key == ConsoleKey.LeftArrow);

Пусть цикл продолжится и примет решение прервать на основе dir = Console.ReadKey(true);, Если введенный ключ не тот, который ожидается, вы можете взломать.

Вы можете почувствовать свою ошибку, заменив выше, в то время как условие, как while(true) затем запустите вашу программу.

Попробуй это

...
do {
    ...
} while (dir.Key == ConsoleKey.DownArrow ||
         dir.Key == ConsoleKey.UpArrow ||
         dir.Key == ConsoleKey.RightArrow ||
         dir.Key == ConsoleKey.LeftArrow);

Вместо этого

...
do {
    ...
} while (Console.ReadKey(true).Key == ConsoleKey.DownArrow ||
         Console.ReadKey(true).Key == ConsoleKey.UpArrow ||
         Console.ReadKey(true).Key == ConsoleKey.RightArrow ||
         Console.ReadKey(true).Key == ConsoleKey.LeftArrow);
Другие вопросы по тегам