如果有看到不懂的地方或者对c语言某些知识忘了的话,可以找我之前的文章哦!!!
个人主页:小八哥向前冲~-CSDN博客
贪吃蛇游戏演示:
贪吃蛇游戏动画演示
目录
游戏前期准备:
需要注意的是,纯使用c语言实现贪吃蛇会使用到一些Win32 API知识,接下来我们一一介绍学习一下。
那么什么是Win32 API呢?
介绍:
Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是⼀个很⼤ 的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application),所以便 称之为ApplicationProgrammingInterface,简称API函数。WIN32API也就是MicrosoftWindows 32位平台的应⽤程序编程接口。
设置控制台相关信息
我们知道平常我们运行程序弹出来的那个框框就是控制台终端。(如图)
我们可以使用cmd命令来设置控制台窗口的大小。如:
// 列 行
mode con cols=100 lines=30
值得注意的是:
1.使用这个命令之前,需要把这个控制台改为让Windows决定或Windows 控制台主机。
2.使用system函数所需要的头文件既可以是stdlib.h,也可以是Windows.h(不区分大小,也可以使用windows.h或WINDOWS.H等形式引用头文件。
演示一下:
控制台的改变
同样我们也能通过命令来设置控制台名字:
title 贪吃蛇
效果:
控制台上的坐标COORD
COORD是什么呢?其实它是Windows API中定义的结构体,表示一个字符在控制台屏幕缓冲区上的坐标,而坐标系(0,0)的原点位于缓冲区的顶部左端单元格。
COORD的结构体声明:
typedef struct _COORD
{
SHORT X;
SHORT Y;
}COORD,*PCOORD;
坐标赋值:
COORD pos={20,30};
GetStdHanle
GetStdHanle是一个Windows API函数。它用于从一个特定的标准设备(标准输入,标准输出等)中取得一个句柄(用来标识不同设备的数值),使用这个句柄可以操作设备。
注意:标准输入是指键盘,标准输出指的是屏幕。
我们要知道的是只要得到的这个句柄,咋们就能操控设备。所以我们能用GetStdHanle函数来获得句柄,从而进行一系列操作。
我们来看看这个函数:
那么我们来尝试获取句柄:
HANDLE houtput=NULL;
//从标准输出获取句柄
houtput=GetStdHanle(STD_OUTPUT_HANDLE);
我们在程序运行跳出控制台的时候,是不是有一个光标在闪动?那么我们试想一下,倘若我们不将那个光标隐藏的话,蛇在移动的时候就会有一个光标一直在闪动,不美观。那么我们如何隐藏光标呢?接下来就要用到GetConsoleCursorInfo这个函数。
GetConsoleCursorInfo
同样的我们来看看这个函数的语法:
从中我们知道,这个函数就是用来检索控制台屏幕缓冲区的光标大小和光标可见性的信息。
BOOL WINAPI GetConsoleCursorInfo(
_In_ HANDLE hConsoleOutput,
_Out_ PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
//注意:PCONSOLE_CURSOR_INFO是指向CONSOLE_CURSOR_INFO 结构的指针,该结构接受有关主机游标
CONSOLE_CURSOR_INFO 这个结构体这个结构体它是包含了光标信息。
我们来看看它的相关信息:
我们来使用一下:
//获取标准输出的句柄(用来标识不同设备的数值)
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//影藏光标操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
SetConsoleCursorInfo
那么我们得到了光标信息,下一步就是设置我们想要的光标信息,设置光标相关信息的函数其实就是SetConsoleCursorInfo函数,它是用来设置控制台指定控制台屏幕缓冲区的光标大小和可见性。
相关信息:
我们来使用看看:
//获取标准输出的句柄(用来标识不同设备的数值)
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//影藏光标操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
//设置光标状态
SetConsoleCursorInfor(hOutput,&CursorInfo);
SetConsoleCursorPosition
设置好了光标的状态,那么能不能设置光标位置,让我们能在任意位置打印我们想要的信息呢?那么我们就要用到SetConsoleCursorPosition函数。我们将坐标位置放到COORD类型中,然后调用SetConsoleCursorPosition函数就能将光标设置指定位置。
看看详情:
使用一下:
COORD pos = { 10, 20 };
HANDLE hOutput = NULL;
//获取标准输出的句柄(用来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//设置标准输出上光标的位置为pos
SetConsoleCursorPosition(hOutput, pos);
需要注意的是:这个pos位置可能会设置不成功。
GetAsynckeyState
玩过贪吃蛇游戏的都知道,键盘上的上,下,左,右按键来控制蛇的方向。那么我们如何获取玩家是否按了哪个按键呢?GetAsynckeyState函数就能解决这个问题。
老样子,我们来看看它的详情:
详细解释:将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果 返回的16位的short数据中,最高位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬 起;如果最低位被置为1则说明,该按键被按过,否则为0。 如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1
虚拟按键代码详细见:虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn
我们来使用看看:
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK)&0x1) ? 1 : 0)
int main()
{
while (1)
{
if (KEY_PRESS(0x30))
{
printf("0\n");
}
else if (KEY_PRESS(0x31))
{
printf("1\n");
}
else if (KEY_PRESS(0x32))
{
printf("2\n");
}
else if (KEY_PRESS(0x33))
{
printf("3\n");
}
else if (KEY_PRESS(0x34))
{
printf("4\n");
}
else if (KEY_PRESS(0x35))
{
printf("5\n");
}
}
}