如何更新用 CursorPosition 插入的字符 (C/Windows API)

How to Update Characters Inserted With CursorPosition (C/Windows API)

在 CODELIGHT 上使用 C 和 MinGW 编译器。

我正在尝试制作一个简单的 ASCII 游戏。我使用 2D 数组来制作地图,然后我使用了一个函数,将光标放在数组上的特定点上,通过击键 WASD(函数是 gotoXY(int x,int y)来跟踪玩家的移动。我能够让它工作(有点),但我对一些没有按预期出现的事情有疑问。

  • 每当用户按下键 a(向左)时,我的代码片段就会出现。未注释的部分在正确的位置打印出字符 \\'@\\',但是它不会更新应该具有表示空白图块的 \\'-\\' 的先前位置。这就是我使用注释代码的目的,但是,当我在所有这些行都未注释的情况下运行程序时,只要我按下 \\'a\\',它就会崩溃。 gotoXY() 函数只是将光标指向它作为参数的 x、y 坐标。为什么添加注释部分时我的代码会崩溃?(第 18-22 行)

    1
    2
    3
    4
    5
            //gotoXY(x, y);
            //printf('-');
            x-=2;
            gotoXY(x, y);
            printf("@");
  • 另外,每当我按下键移动我的角色时,它在屏幕上的射击速度太快了。我尝试使用 system("pause") 来解决这个问题,但没有奏效。那么,有没有办法在按下某些键后延迟一段时间?这样,@ 字符在屏幕上的移动速度更慢且更一致。

  • 功能:

    1
    2
    3
      printBoard(char board[50][50]); //Prints the gameboard just a 50 by 50 tile
      createBoard(int size, int xPos, int yPos); //Creates the array
      gotoXY(int x, int y); //Sets position of Cursor

    图片:

    -在按键之前编程。

    - 按键后的程序(行仍然注释)

    -按键后编程(行未注释)

    问题:

    1.为什么我的代码会崩溃?

    2.如何让我的角色从快速输入屏幕的速度变慢。

    完整代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include <stdio.h>
    #include <stdlib.h>
    #include <Windows.h>


    void createBoard(int size, int xPos, int yPos);
    void printBoard(char board[50][50]);
    int main()
    {
        int xPos = 32, yPos = 21, bSize = 50;
        createBoard(bSize, xPos, yPos);
        int x = 42, y = 32;                  //Starting coords for player

        while(1){
            if(GetKeyState(65)<0){  //left
                //gotoXY(x, y);
                //printf('-');
                x-=2;               //Moves 1 space left
                gotoXY(x, y);
                printf("@");
            }
            if(GetKeyState(83)<0){  //down
                 y+=2;
                 gotoXY(x, y);
                 printf("@");
            }
            if(GetKeyState(68)<0){  //right
                x+=2;
                gotoXY(x, y);
                printf("@");
            }
            if(GetKeyState(87)<0){  //up
                 y-=2;
                 gotoXY(x, y);
                 printf("@");
            }

        }
        return 0;
    }

    void printBoard(char board[50][50]){
         HANDLE  hConsole;
         hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
         int i, j;

         for(i = 0; i < 50; i++){
            for(j = 0; j < 50; j++){
                SetConsoleTextAttribute(hConsole,7); //Sets tiles to white
                if(board[i][j]=='@'){
                    SetConsoleTextAttribute(hConsole, 4);  //Sets @ to red
                }
                printf("%c", board[i][j]);
            }
            printf("\
    "
    );
        }
    }

    void createBoard(int size, int xPos, int yPos){
        int i, j;
        char sampleBoard[size][size], person = '@';

        for(i = 0; i < size; i++){
            for(j = 0; j < size; j++){
                sampleBoard[i][j] = '-';
            }
        }

        sampleBoard[xPos][yPos] = person;
        printBoard(sampleBoard);
    }

    void gotoXY(int x, int y) {
            //Initialize the coordinates
            COORD coord = {x, y};
            //Set the position
            SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
            return;

    }

    我们不能这样写代码

    1
    printf('-');

    但是你可以把这段代码写成

    1
    printf("-");