最近写贪吃蛇游戏时,需要用到光标定位,故总结如下。
方法一:
1 #include<windows.h> 2 #include<stdio.h> 3 4 HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE); 5 COORD coord; 6 void locate(int x,int y) 7 { 8 coord.X=x; 9 coord.Y=y; 10 SetConsoleCursorPosition(hout,coord); 11 12 }; 13 14 int main() 15 16 { 17 locate(2,2); 18 printf("hello world\n“); 19 return 0; 20 }
方法二:利用goto()函数
1 #include <stdio.h> 2 #include <windows.h> 3 4 void gotoxy(int x, int y) 5 { 6 COORD coord = {x, y}; 7 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); 8 } 9 10 void main() 11 { 12 gotoxy(3, 3); 13 printf("Hello World!\n"); 14 }
在贪吃蛇类的小游戏中经常会用到光标定位和隐藏光标。
1 /*** 光标定位 ***/ 2 HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE); 3 COORD coord; 4 void locate(int x,int y) 5 { 6 coord.X=x; 7 coord.Y=y; 8 SetConsoleCursorPosition(hout,coord); 9 }; 10 /*** 隐藏光标 ***/ 11 void hide() 12 { 13 CONSOLE_CURSOR_INFO cursor_info={1,0}; 14 SetConsoleCursorInfo(hout, &cursor_info); 15 }
这样一来,做个字符版的俄罗斯方块或者贪吃蛇一类的小游戏就比较容易了。
1 #include <windows.h> 2 3 void HideCursor() 4 { 5 CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 6 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); 7 } 8 9 函数和结构体都在windows.h中定义,函数用法简单就不说了。 10 CONSOLE_CURSOR_INFO结构体定义如下: 11 typedef struct 12 { DWORD dwSize; 13 BOOL bVisible; //为0时光标不可见 14 }CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO; 15 16 VC,MinGW中均没问题。
CROOD就是这样的一个玩意:
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, *PCOORD;
很明显这个结构可以用来记录坐标
GetStdHandle()函数获得标准输入输出的句柄,参数STD_OUTPUT_HANDLE是个宏,代表标准输出,可以看作显示器
SetConsoleCursorPosition(hout,coord); 看函数名称:设置控制台光标坐标,参数就是设备句柄,坐标,那么把标准输出的句柄传给函数,就可以把光标定位在对应的位置了(左上角位置是0,0然后向左 向下延伸)
下面这段代码可以在屏幕第10行第30列输出"Hello world"
1 #include <windows.h> 2 #include <iostream> 3 using namespace std; 4 int main() 5 { 6 HANDLE hout; 7 COORD coord; 8 coord.X=30; 9 coord.Y=10; 10 hout=GetStdHandle(STD_OUTPUT_HANDLE); 11 SetConsoleCursorPosition(hout,coord); 12 13 cout<<"Hello world!\n"; 14 return 0; 15 }