0.前言
在前面几篇文章中,学习了键盘事件和光标移动,在这篇文章中,我们要使用键盘的上下左右键控制在控制台中出现的角色
1.原理
因为我们要通过移动键盘控制光标位置,那么在此之前需要提前获取到光标位置,然后再捕获键盘事件,根据按键给gotoxy函数参数,让光标移动到参数位置,然后刷新控制台,就可以实现“移动”的效果。
2.获取光标当前位置函数
通过下面这个函数可以获取到当前光标。
void getXY()
{
HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO pBuffer;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hStdout, &pBuffer);
cout << pBuffer.dwCursorPosition.X << pBuffer.dwCursorPosition.Y <<endl;
}
注意:这个函数不是必须用,只是为了保险起见,在移动之前可以先获取一下光标的位置。而且,经过实际测试发现一个小问题,比如我当前gotoxy(5,5),然后我打印一个字符‘a’,再获取光标位置,这个时候光标的位置肯定是变化了,不再是5,5了。
3.通过键盘控制图形移动
我们上一篇说过,gotoxy和二维数组类似,但是实际上经过测速,有区别。
实际操作中发现了一些问题,
上是 (x,y-d)
下是 (x,y+d)
左是 (x-d,y)
右是 (x+d,y)
也就是符合下面这个规律:
最终发现getXY不是很好用,于是就用了自增自减的方法,而且把按键改成WASD了。
#include<iostream> #include<cstdio> #include<cstdlib> #include<ctime> #include<conio.h> #include<windows.h> int X,Y; //光标位置 //移动函数 void gotoxy(int x, int y) { COORD pos = {x,y}; HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄 SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置 } //获取当前光标坐标 //void getXY() //弃用,不好用 //{ // HANDLE hStdout; // CONSOLE_SCREEN_BUFFER_INFO pBuffer; // hStdout = GetStdHandle(STD_OUTPUT_HANDLE); // GetConsoleScreenBufferInfo(hStdout, &pBuffer); // X=pBuffer.dwCursorPosition.X; // Y=pBuffer.dwCursorPosition.Y; //} using namespace std; int main() { system("cls"); gotoxy(10,10); X=10; Y=10; printf("★"); int ch; while (1){ if (_kbhit()){//如果有按键按下,则_kbhit()函数返回真 ch = _getch();//使用_getch()函数获取按下的键值 if (ch == 119){ //上键 38 system("cls"); gotoxy(X,Y-1); printf("★"); Y-=1; }; if (ch == 115){ //下键 40 system("cls"); gotoxy(X,Y+1); printf("★"); Y+=1; }; if (ch == 97){ //左 37 system("cls"); gotoxy(X-1,Y); printf("★"); X-=1; }; if (ch == 100){ //39 system("cls"); gotoxy(X+1,Y); printf("★"); X+=1; }; } } return 0; }
返回目录:C++/趣味小程序