问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言实现贪吃蛇游戏:从Win32API到完整代码

创作时间:
作者:
@小白创作中心

C语言实现贪吃蛇游戏:从Win32API到完整代码

引用
CSDN
1.
https://blog.csdn.net/laso2024/article/details/139885628

本文将详细介绍如何使用C语言在Windows控制台环境中实现经典的贪吃蛇游戏。通过学习本文,你将掌握Win32API的使用、控制台操作、键盘输入检测等关键技术,并了解如何通过链表数据结构来实现蛇身的移动和增长。

1.游戏效果演示

基于控制台实现贪吃蛇小游戏

2.技术要求

C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32API等。

3.win32API

在写关于贪吃蛇的代码之前,我们要先掌握Win32API如何使用

3.1控制台程序

平常我们运行起来的黑框程序其实就是控制台程序
我们可以用一些cmd命令来设置控制台窗口的长宽,如mode
也可以改变窗口命名,如title

3.2 控制台屏幕上的坐标COORD

COORD
是Windows API中定义的一个结构体,用于表示控制台屏幕上的一个字符的坐标。它有两个成员:
X
(表示列位置)和
Y
(表示行位置)。

COORD类型的声明:

typedef struct _COORD {
    SHORT X;
    SHORT Y;
} COORD, *PCOORD;

给坐标赋值:

COORD pos;
pos.X = 10;
pos.Y = 5;

3.3 GetStdHandle

GetStdHandle
是一个 Windows API 函数,用于从特定的标准设备(标准输入、标准输出或标准错误)中获取一个句柄(handle)。句柄相当于控制台的权限,有了它才能操控控制台。需包含头文件
windows.h。

函数原型:

HANDLE WINAPI GetStdHandle(
  _In_ DWORD nStdHandle
);

实例:

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

3.4 GetConsoleCursorInfo

GetConsoleCursorInfo
是 Windows API 中的一个函数,用于检索有关指定的控制台屏幕缓冲区的光标的可见性和大小信息。

函数原型:

BOOL WINAPI GetConsoleCursorInfo(
  _In_ HANDLE hConsoleOutput,
  _Out_ PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);

实例:

CONSOLE_CURSOR_INFO cursorInfo;
GetConsoleCursorInfo(hConsole, &cursorInfo);

3.4.1 CONSOLE_CURSOR_INFO

CONSOLE_CURSOR_INFO
是一个在 Windows 编程中使用的结构体,用于表示控制台光标的信息。该结构体主要在
GetConsoleCursorInfo

SetConsoleCursorInfo
函数中使用,以获取或设置控制台光标的大小和可见性。

结构体定义:

typedef struct _CONSOLE_CURSOR_INFO {
  DWORD dwSize;
  BOOL  bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
  • dwSize
    描述:这个成员变量表示光标填充的字符单元格的百分比。其值通常在 1 到 100 之间,表示光标从完全不可见(接近0)到完全填充(100)的大小。

  • bVisible
    描述:这个成员变量表示光标的可见性。如果
    bVisible

    TRUE
    ,则光标是可见的;如果为
    FALSE
    ,则光标是不可见的。

3.5 SetConsoleCursorInfo

SetConsoleCursorInfo
是 Windows API 中的一个函数,用于设置控制台屏幕缓冲区的光标信息,包括光标的大小和可见性。

函数原型:

BOOL WINAPI SetConsoleCursorInfo(
  _In_ HANDLE hConsoleOutput,
  _In_ const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);

实例:

CONSOLE_CURSOR_INFO cursorInfo;
cursorInfo.dwSize = 100;
cursorInfo.bVisible = FALSE;
SetConsoleCursorInfo(hConsole, &cursorInfo);

3.6 SetConsoleCursorPosition

SetConsoleCursorPosition
是Windows API中的一个函数,用于设置控制台窗口中光标的位置。

函数原型:

BOOL WINAPI SetConsoleCursorPosition(
  _In_ HANDLE hConsoleOutput,
  _In_ COORD  dwCursorPosition
);

实例:

COORD pos;
pos.X = 10;
pos.Y = 5;
SetConsoleCursorPosition(hConsole, pos);

SetPos:封装一个设置光标位置的函数

void SetPos(int x, int y) {
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(hConsole, pos);
}

3.7 GetAsyncKeyState

GetAsyncKeyState是一个Windows API函数,用于检测程序运行时某个按键的状态,包括是否按下或弹起。

函数原型:

SHORT WINAPI GetAsyncKeyState(
  _In_ int vKey
);

将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。GetAsyncKeyState 的返回值是short类型,在上一次调用GetAsyncKeyState 函数后,如果 返回的16位的short数据中,最高位是1,说明按键的状态是按下,如果最高是0,说明按键的状态是抬起;如果最低位被置为1则说明,该按键被按过,否则为0。

如果我们要判断一个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1。

实例:

4.贪吃蛇游戏设计和分析

为实现贪吃蛇游戏的运行,我们将分成三个文件(一个头文件和源文件)来实现
snake.h:包含头文件
snake.c:实现游戏各功能代码的函数实现
tect.c:贪吃蛇游戏中的类型声明和函数的声明。

4.1初始化蛇的结构体

我们通过链表的方式来维护蛇的结构体

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号