技术要点
贪吃蛇的简易实现会运用到语⾔函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等,接下来首先简单介绍一下会运用到的东西。
Win32 API介绍
Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application), 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows32位平台的应⽤程序编程接⼝。
控制台程序介绍
平常我们运⾏起来的⿊框程序其实就是控制台程序,我们可以使⽤cmd命令来设置控制台窗⼝的⻓宽,如:
设置
mode con
命令设置
控制台窗⼝的⼤⼩,30⾏,100列。 命令:
mode con cols=100 lines=30
通过
title
命令设置控制台窗⼝的名字 如:
title 贪吃蛇
这些命令,在c语言中,就需要调用c语言函数system来执行:
#
include
<stdio.h>
int
main
()
{
//
设置控制台窗⼝的⻓宽:设置控制台窗⼝的⼤⼩,
30
⾏,
100
列
system(
"mode con cols=100 lines=30"
);
//
设置
cmd
窗⼝名称
system(
"title
贪吃
蛇
"
);
return
0
;
}
控制台屏幕上的坐标COORD
COORD 是Windows API中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕上的坐标
给坐标赋值:
COORD pos = { 10, 15 };
GetStdHandle 函数 - Windows Console | Microsoft Learn
GetStdHandle是⼀个Windows API函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标 准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。
HANDLE GetStdHandle(DWORD nStdHandle);
如:
GetConsoleCursorInfo 函数 - Windows Console | Microsoft Learn
检索有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息
BOOL WINAPI GetConsoleCursorInfo( HANDLE hConsoleOutput, PCONSOLE_CURSOR_INFO lpConsoleCursorInfo );
如:
CONSOLE_CURSOR_INFO
这个结构体,包含有关控制台光标的信息
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize;
BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
dwSize,由光标填充的字符单元格的百分⽐。 此值介于1到100之间。 光标外观会变化,范围从完
全填充单元格到单元底部的⽔平线条。
bVisible,游标的可⻅性。 如果光标可⻅,则此成员为 TRUE。
SetConsoleCursorInfo 函数 - Windows Console | Microsoft Learn
设置指定控制台屏幕缓冲区的光标的⼤⼩和可⻅性。
BOOL WINAPI SetConsoleCursorInfo(
HANDLE hConsoleOutput,
const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);
如:
SetConsoleCursorPosition 函数 - Windows Console | Microsoft Learn
设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调 ⽤SetConsoleCursorPosition函数将光标位置设置到指定的位置。
BOOL WINAPI SetConsoleCursorPosition( HANDLE hConsoleOutput, COORD pos );
SetPos:封装⼀个设置光标位置的函数
如:
//
设置光标的坐标
void
SetPos
(
short
x,
short
y)
{
COORD pos = { x, y };
HANDLE hOutput =
NULL
;
//
获取标准输出的句柄
(
⽤来标识不同设备的数值
)
hOutput =
GetStdHandle
(STD_OUTPUT_HANDLE);
//
设置标准输出上光标
的位置为
pos
SetConsoleCursorPosition
(hOutput, pos);
}
GetAsyncKeyState function (winuser.h) - Win32 apps | Microsoft Learn
获取按键情况:
SHORT GetAsyncKeyState( int vKey );
将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。 GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤
GetAsyncKeyState
函数后,如果 返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬 起;如果最低位被置为1则说明,该按键被按过,否则为0。
如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1。
如:
#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )
贪吃蛇游戏设计与分析
地图
首先,想在控制台的窗⼝中指定位置输出信息,我们得知道该位置的坐标。
控制台窗⼝的坐标横向的是X轴,从左向右依次增⻓,纵向是Y轴,从上到下依次增⻓。
<locale.h>(本地化)
<locale.h>提供的函数⽤于控制C标准库中对于不同的地区会产⽣不⼀样⾏为的部分。
其中提供了允许程序员针对特定
地区(通常是国家或者说某种特定语⾔的地理区域)调整程序⾏为的函数。
在游戏地图上,我们打印墙体使⽤宽字符:□,打印蛇使⽤宽字符●,打印⻝物使⽤宽字符★ 。
普通的字符是占⼀个字节的,这类宽字符是占⽤2个字节。
所以我们需要包含
头文件<locale.h>(本地化)
来实现
加⼊
宽字符的类型 wchar_t。