视频地址: https://www.bilibili.com/video/av73222610
需要包含的头文件
因为这次课的内容需要使用C标准库之外的一些函数,因此,需要包含对应的头文件。
- Windows.h:我们将使用其提供的函数,实现任意位置输出
- conio.h:我们将使用其中的函数,实现响应键盘按键
封装函数用于移动坐标
以下函数封装了Windows的API,使得我们可以将光标移动到任意坐标位置,方便我们在任意位置打印字符。
void MoveCursorTo(int nRow, int nCol)
{
COORD crdLocation;
crdLocation.X = nCol;
crdLocation.Y = nRow;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), crdLocation);
}
使用getchar获取移动方向并响应
移动到原位置覆盖内容,并移动到新位置打印内容
MoveCursorTo(nRow, nCol);
printf(" ");
nCol -= 1;
MoveCursorTo(nRow, nCol);
printf("*");
循环响应用户输入
使用_kbhit响应键盘按键
_kbhit可以检测用户是否按下,而_getch可以配合_kbhit拿到用户输入。
当_kbhit返回值不为0的时候,代表用户有按键按下。
附录代码
// 17-move-player.cpp : 定义控制台应用程序的入口点。
//
#include <windows.h>
#include <conio.h>
#include <stdio.h>
void MoveCursorTo(int nRow, int nCol)
{
COORD crdLocation;
crdLocation.X = nCol;
crdLocation.Y = nRow;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), crdLocation);
}
int main(int argc, char* argv[])
{
char chInput = 0;
int nRow = 10;
int nCol = 10;
MoveCursorTo(nRow, nCol);
printf("*");
while (1)
{
if (_kbhit() != 0)
{
chInput = _getch();
switch (chInput)
{
case 'a':
//移动到原有位置
MoveCursorTo(nRow, nCol);
//覆盖掉原有内容
printf(" ");
//改变坐标并移动、打印
nCol -= 1;
MoveCursorTo(nRow, nCol);
printf("*");
break;
case 'w':
//移动到原有位置
MoveCursorTo(nRow, nCol);
//覆盖掉原有内容
printf(" ");
//改变坐标并移动、打印
nRow -= 1;
MoveCursorTo(nRow, nCol);
printf("*");
break;
case 's':
//移动到原有位置
MoveCursorTo(nRow, nCol);
//覆盖掉原有内容
printf(" ");
//改变坐标并移动、打印
nRow += 1;
MoveCursorTo(nRow, nCol);
printf("*");
break;
case 'd':
//移动到原有位置
MoveCursorTo(nRow, nCol);
//覆盖掉原有内容
printf(" ");
//改变坐标并移动、打印
nCol += 1;
MoveCursorTo(nRow, nCol);
printf("*");
break;
default:
break;
}
}
}
return 0;
}