游戏效果演示
贪吃蛇
实现基本的功能
• 贪吃蛇地图绘制
• 蛇吃食物的功能 (上、下、左、右⽅向键控制蛇的动作)
• 蛇撞墙死亡
• 蛇撞自身死亡
• 计算得分
• 蛇身加速、减速
• 暂停游戏
Win32 API
在制作贪吃蛇之前我们需要对Win32 API有一定程度的了解。
Win32 API
Windows 这个多作业系统除了协调应用程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤ 的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形、使⽤周边设备等目的,由于这些函数服务的对象是应⽤程序(Application), 所以便 称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows 32位平台的应⽤程序编程接⼝。
控制台程序
我们可以使⽤cmd命令来设置控制台窗⼝的⻓宽:设置控制台窗⼝的⼤⼩,30⾏,100列
mode con cols=100 lines=30
将其输入到一个默认打开的窗口上面在回车就会改变窗口的大小。
也可以通过命令设置控制台窗⼝的名字:
title 贪吃蛇
这些能在控制台窗口执行的命令,也可以调⽤C语⾔函数system来执行。例如:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
system("mode con cols=30 lines=30");
system("title 贪吃蛇");
return 0;
}
控制台屏幕上的坐标COORD
COORD 是Windows API中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕幕缓冲区上的坐标,坐标系 (0,0) 的原点位于缓冲区的顶部左侧单元格。
COORD类型的声明:
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, * PCOORD;
给坐标赋值:
COORD pos = { 10, 15 };
GetStdHandle
GetStdHandle是⼀个Windows API函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标 准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使用这个句柄可以操作设备。
我们可以将句柄想象成为一个游戏手柄,只有获得这个手柄之后,我们才可以控制游戏界面。
int main()
{
//获得标准输出设备的句柄
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
return 0;
}
GetConsoleCursorInfo
检索有关指定控制台屏幕缓冲区的光标大小和可见性的信息
BOOL WINAPI GetConsoleCursorInfo(
HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
//PCONSOLE_CURSOR_INFO 是指向 CONSOLE_CURSOR_INFO 结构的指针,该结构接收有关主机游标
函数的第一个参数是所要控制的句柄,第二个参数是是指向 CONSOLE_CURSOR_INFO 结构的指针,该结构接收有关主机游标。
_CONSOLE_CURSOR_INFO
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize;
BOOL bVisible;
} CONSOLE_CURSOR_INFO, * PCONSOLE_CURSOR_INFO;
• dwSize,由光标填充的字符单元格的百分⽐。 此值介于1到100之间。 光标外观会变化,范围从完 全填充单元格到单元底部的水平线条。
• bVisible,游标的可见性。 如果光标可见,则此成员为 TRUE。
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo
设置指定控制台屏幕缓冲区的光标的大小和可见性。
BOOL WINAPI SetConsoleCursorInfo(
HANDLE hConsoleOutput,
const CONSOLE_CURSOR_INFO * lpConsoleCursorInfo
);
函数的第一个参数是所要控制的句柄,第二个参数是是指向 CONSOLE_CURSOR_INFO 结构的指针,该结构接收有关主机游标。
接下来,我们就可以完成设置光标的信息了,代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<windows.h>
int main()
{
//获得标准输出设备的句柄
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//定义一个光标信息的结构体变量
CONSOLE_CURSOR_INFO cursor_info = { 0 };
//获取和houtput句柄相关的控制台上的光标信息,存放在cursor_info中
GetConsoleCursorInfo(houtput, &cursor_info);
//修改光标的占比
cursor_info.bVisible = TRUE;
cursor_info.dwSize = 50;
//设置和houtput句柄相关的控制台上的光标信息
SetConsoleCursorInfo(houtput, &cursor_info);
system("pause");
return 0;
}
SetConsoleCursorPosition
设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调 ⽤SetConsoleCursorPosition函数将光标位置设置到指定的位置。
语法:
BOOL WINAPI SetConsoleCursorPosition(
HANDLE hConsoleOutput,
COORD pos
);
第一个参数是控制台屏幕缓冲区的句柄。第二个参数坐标是屏幕缓冲区字符单元的列和行。 坐标必须位于控制台屏幕缓冲区的边界以内。
#include<stdio.h>
#include<windows.h>
int main()
{
COORD pos = { 10, 5 };
HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//设置标准输出上光标的位置为pos
SetConsoleCursorPosition(hOutput, pos);
printf("hehe");
return 0;
}
为了后续方便使用,我们可以直接将其分装成一个函数。
void SetPos(short x, short y)
{
COORD pos = { x, y };
HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//设置标准输出上光标的位置为pos
SetConsoleCursorPosition(hOutput, pos);
}
int main()
{
SetPos(30, 30);
printf("hehe");
return 0;
}
GetAsyncKeyState
GetAsyncKeyState的函数原型如下:
SHORT GetAsyncKeyState(
int vKey
);