# 在屏幕的任意位置输出字符 编写游戏的第一步就是搞定光标定位问题,这样你的程序就可以随心所欲、按任意顺序、在任意位置输出了。但是,C语言本身并不支持该功能,我们必须使用 Windows 提供的接口,所以要引入 windows.h 头文件。注意这个头文件是Windows系统的。 所谓 Windows 接口,就是 Windows 这个操作系统本身提供的函数,它们都是以C语言的形式呈现的,只要我们引入了 windows.h 头文件,就可以调用这些函数,使用 Windows 提供的强大功能了。 光标定位需要使用 windows.h 头文件中的`SetConsoleCursorPosition`函数,它的使用方式为: ```c SetConsoleCursorPosistion(HANDLE hConsoleOutput, COORD, dwCursorPosition); ``` `hConsoleOutput`表示控制台缓冲区句柄,可通过`GetStdHandle(STD_OUTPUT_HANDLE)`来获得;`dwCursorPosition`是光标位置,也就是第几行第几列,它是 COORD 类型的结构体。 例如,将光标定位到控制台的第3行第3列: ```c //定义光标位置 COORD coord; coord.X = 3; //第3行 coord.Y = 3; //第3列 //获取控制台缓冲区句柄,固定写法 HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); //设置光标位置,固定写法 SetConsoleCursorPosition(ConsoleHandle, coord); ``` 这样,程序就可以从第3行第3列开始输出了。 ```c #include #include int main(){ //定义光标位置 COORD coord; coord.X = 3; coord.Y = 3; //获取控制台缓冲区句柄,固定写法 HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(ConsoleHandle, coord); printf("wangyuedong.com"); return 0; } //注意:窗口的左上角是第 0 行第 0 列,而不是我们通常所认为的第 1 行第 1 列。编程语言中的很多计数都是从 0 开始的,而不是从 1 开始。 ``` 搞定了光标重定位,你就可以将输出顺序打乱了,想在哪里输出就在哪里输出。 ```c #include #include //设置光标位置 void setCursorPosition(int x, int y); //设置文字颜色 void setColor(int color); int main(int argc, char *argv[]){ setColor(3); setCusorPosition(3, 3); puts("www"); setColor(OXC); setCursorPosition(1, 1); puts("hhh"); setColor(6); setCursorPosition(6, 6); puts("xxx"); return 0; } //自定义光标函数 void setCursorPosition(int x, int y){ COORD coord; coord.X = x; coord.Y = y; HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(ConsoleHandle, coord); } //自定义文字颜色 void setColor(int color){ HANDLE ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(ConsoleHandle, color); } ``` 可以发现,先输出的字符位置不一定靠前,后输出的字符位置不一定靠后,它们都可以在任意位置。