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);