一、前言
学完C语言和数据结构的链表部分后,贪吃蛇的游戏也终于可以着手的实现了。对于贪吃蛇这个经典游戏,相信小伙伴们都不会太陌生,接下来我们 一起去剖析关于贪吃蛇游戏内部的一些逻辑结构和整体思维。
二、Win32 API
本章实现贪吃蛇会用到一些Win32API的相关知识,接下来为大家详细的介绍一下。
2.1Win32API是什么?
Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外, 它同时也是⼀个很大的服务中心,调用这个服务中心的各种服务(每⼀种服务就是⼀个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application), 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows32位平台的应⽤程序编程接口。
2.2控制台程序
在我们平时运行代码所弹出的界面就是控制台程序。
2.2.1控制窗口大小命令
mode con cols=100 lines=30
我们可以使用cmd命令来设置控制台窗口的长宽:设置控制台窗⼝的大小,30行,100列。
也可以通过命令设置控制台窗口的名字:
title 贪吃蛇
所以对于如上用来设置界面大小及命名的代码总体如下:
#include <stdio.h>
int main()
{
//设置控制台窗⼝的⻓宽:设置控制台窗⼝的⼤⼩,30⾏,100列
system("mode con cols=100 lines=30");
//设置cmd窗⼝名称
system("title 贪吃蛇");
return 0;
}
2.2.2控制台屏幕上的坐标COORD
COORD 是Windows API中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕幕缓冲区上的坐标,坐标系 (0,0) 的原点位于缓冲区的顶部左侧单元格。
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, *PCOORD;
给坐标赋值:
COORD pos = { 10, 15 };
2.2.3GetStdHandle
GetStdHandle是一个Windows API函数。它用于从⼀个特定的标准设备(标准输⼊、标准输出或标 准错误)中取得⼀个句柄(用来标识不同设备的数值),使⽤这个句柄可以操作设备。
所谓句柄可以通常理解为我们打游戏时的手柄,是用来操控控制台的。
HANDLE GetStdHandle(DWORD nStdHandle);
具体操作为:
HANDLE houtput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
2.3.4GetConsoleCursorlnfo
BOOL WINAPI GetConsoleCursorInfo(
HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
PCONSOLE_CURSOR_INFO 是指向 CONSOLE_CURSOR_INFO 结构的指针,该结构接收有关主机游标
(光标)的信息
GetConsoleCursorlnfo函数是对控制台中屏幕缓冲区光标大小进行调试和对光标的可见性进行设置,如下图所示,系统默认的光标是一个不断闪动的横向下划线,但是当我们用鼠标在屏幕上点一下时,就会出现一个长方形的实体几何,而这个长方形就是光标为百分之百的样子,而系统默认的光标百分比则是25%。
具体操作如下:
HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//影藏光标操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(houtput, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(houtput, &CursorInfo);//设置控制台光标状态
所以要设置光标总共四步:获取句柄、获取控制台信息、隐藏光标、设置控制台光标状态。
2.3.5GetConsoleCursorPosition
设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调用SetConsoleCursorPosition函数将光标位置设置到指定的位置。
关于SetConsoleCursorPosition函数的结构体如下:
BOOL WINAPI SetConsoleCursorPosition(
HANDLE hConsoleOutput,
COORD pos
);
而SetConsoleCursorPosition函数的使用也非常简单,只需调用句柄和DOORD即可。
COORD pos = { 10, 5};
HANDLE houtput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//设置标准输出上光标的位置为pos
SetConsoleCursorPosition(houtput, pos);
//设置光标的坐标
void SetPos(short x, short y)
{
COORD pos = { x, y };
HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//设置标准输出上光标的位置为pos
SetConsoleCursorPosition(hOutput, pos);
}
2.3.5GetAsyncKeyState
在贪吃蛇中,我们要对贪吃蛇进行上、下、左、右、加速、减速等操作,而要实现这些操作,必须要通过键盘或手柄来实现,那我们应该怎么让系统接收我们 按的是哪一个键呢?
GetAsyncKeyState函数就是实现这一功能的,它可以将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。
GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果 返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬 起;如果最低位被置为1则说明,该按键被按过,否则为0。
三、总结
以上便是此次贪吃蛇所要用到的一些函数,在实现贪吃蛇前要将函数稍加理解,能够在写代码时会用即可,至此,贪吃蛇文章的“前瞻”便结束了,下一章我们开始贪吃蛇的代码实现。