Почему строка ConsoleKey key = Console.ReadKey (). Клавиша удаляет самую старую букву «O» на экране консоли? - PullRequest
0 голосов
/ 27 сентября 2019

Попытка сделать игру змея.Я использую Console.SetCursorPosition (int x, int y) для рисования частей тела («O»), 2D-массив для хранения «O» предыдущих местоположений и Console.KeyAvailable для обнаружения изменений направления.Когда нажата клавиша, которой нет в операторе switch, рисование останавливается на одну итерацию.Когда нажата клавиша, которая находится в операторе switch, консоль стирает самую старую часть тела.

Отладчик не показывает причину.Может кто-нибудь помочь мне понять, почему это происходит?

static void Main(string[] args)
{
    Console.CursorVisible = false;

    while (true)
    {
        ConsoleKey key = Console.ReadKey().Key;
        switch (key)
        {
            case ConsoleKey.RightArrow:
                direction = "RIGHT";
                break;
            case ConsoleKey.LeftArrow:
                direction = "LEFT";
                break;
            case ConsoleKey.DownArrow:
                direction = "DOWN";
                break;
            case ConsoleKey.UpArrow:
                direction = "UP";
                break;
        }

        breakOut = false;

        switch (direction)
        {
            case "RIGHT":
                for (int i = x; i <= 100; i++)
                {
                    Iterator(i, y);
                    x = i;
                    if (breakOut)
                        break;
                };
                break;
            case "LEFT":
                break;
            case "DOWN":
                for (int i = y; i <= 100; i++)
                {
                    Iterator(x, i);
                    y = i;
                    if (breakOut)
                        break;
                }
                break;
            case "UP":
                break;
        }
    }
}

static void Iterator(int x, int y)
{
    Draw(x, y);

    xSlot = x;
    ySlot = y;

    histPoints[slotCounter, (int)place.x] = xSlot;
    histPoints[slotCounter, (int)place.y] = ySlot;

    if (slotCounter >= length)
    {
        Erase(histPoints[slotCounter - length, (int)place.x], histPoints[slotCounter - length, (int)place.y]);
    }

    slotCounter += 1;

    if (Console.KeyAvailable)
    {
        breakOut = true;
        return;
    }

    Sleep();
}
...