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 |
另外,每当我按下键移动我的角色时,它在屏幕上的射击速度太快了。我尝试使用 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 |
但是你可以把这段代码写成
1 |