Непреднамеренное удаление символа в консоли при изменении позиции другого символа - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь начать игру на консоли, содержащей массив символов 20 на 40. Все символы "-" представляют фон по умолчанию для игрового поля, кроме символа "@", который представляет игрока в игре. Позиция игрока сохраняется в целочисленном массиве.

Пользователь может нажимать клавиши со стрелками для перемещения символа @. Я установил цикл для считывания нажатия клавиш, и после проверки того, что персонаж игрока не переместится за пределы массива, если он будет двигаться в этом направлении, он сначала устанавливает позицию курсора в положение, где находится игрок, и заменяет «@» на «-», обновляет позицию игрока, затем устанавливает курсор в новую позицию и записывает в «@».

По какой-то причине, когда я перемещаю персонажа вниз, влево или вверх (но не вправо), он удаляет символ «-», который был справа от предыдущей позиции игрока, например:

enter image description here

enter image description here

После отладки ошибка возникает сразу после cki = Console.ReadKey, поэтому что-то в действии нажатия клавиши - удаление символа, но я не могу понять, почему он это делает или как помешать этому. Кто-нибудь может предложить решение?

Вот код для цикла:

 Dim cki As ConsoleKeyInfo
 Console.CursorVisible = False

    While True
        'Reads keypress - **deleted character occurs after this line**
        cki = Console.ReadKey
        Select Case cki.Key
            Case ConsoleKey.UpArrow
                If playerPos(0) - 1 >= 0 Then
                    'Deletes playerChar, replaces it with boardChar
                    Console.SetCursorPosition(playerPos(1), playerPos(0))
                    Console.Write(boardChar)
                    board(playerPos(0), playerPos(1)) = boardChar

                    'Changes player position along the vertical axis (-1)
                    playerPos(0) -= 1

                    'Rewrites the playerChar in the new position
                    Console.SetCursorPosition(playerPos(1), playerPos(0))
                    Console.Write(playerChar)
                    board(playerPos(0), playerPos(1)) = playerChar
                End If

            Case ConsoleKey.DownArrow
                If playerPos(0) + 1 < board.GetLength(0) Then
                    Console.SetCursorPosition(playerPos(1), playerPos(0))
                    Console.Write(boardChar)
                    board(playerPos(0), playerPos(1)) = boardChar

                    'Changes player position along the vertical axis (+1)
                    playerPos(0) += 1

                    Console.SetCursorPosition(playerPos(1), playerPos(0))
                    Console.Write(playerChar)
                    board(playerPos(0), playerPos(1)) = playerChar
                End If

            Case ConsoleKey.LeftArrow
                If playerPos(1) - 1 >= 0 Then
                    Console.SetCursorPosition(playerPos(1), playerPos(0))
                    Console.Write(boardChar)
                    board(playerPos(0), playerPos(1)) = boardChar

                    'Changes player position along the horizontal axis (-1)
                    playerPos(1) -= 1

                    Console.SetCursorPosition(playerPos(1), playerPos(0))
                    Console.Write(playerChar)
                    board(playerPos(0), playerPos(1)) = playerChar
                End If

            Case ConsoleKey.RightArrow
                If playerPos(1) + 1 < board.GetLength(1) Then
                    Console.SetCursorPosition(playerPos(1), playerPos(0))
                    Console.Write(boardChar)
                    board(playerPos(0), playerPos(1)) = boardChar

                    'Changes player position along the vertical axis (+1)
                    playerPos(1) += 1

                    Console.SetCursorPosition(playerPos(1), playerPos(0))
                    Console.Write(playerChar)
                    board(playerPos(0), playerPos(1)) = playerChar
                End If
        End Select
    End While
...