【C语言】贪吃蛇

游戏效果演示

贪吃蛇

实现基本的功能

• 贪吃蛇地图绘制

• 蛇吃食物的功能 (上、下、左、右⽅向键控制蛇的动作)

• 蛇撞墙死亡

• 蛇撞自身死亡

• 计算得分

• 蛇身加速、减速

• 暂停游戏

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
);

​
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值