贪吃蛇实现(c实现)

本文围绕C语言实现贪吃蛇游戏展开。先介绍了COORD、GetStdHandle等游戏相关知识,接着对游戏进行设计与分析,包括游戏主逻辑、开始、运行、结束各阶段,如开始阶段涉及欢迎界面、规则界面、地图、蛇身和食物的设计,最后给出了Snake.h、Snack.c、test.c的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

贪吃蛇是一个久负盛名的游戏,与俄罗斯方块和扫雷游戏相同都是非常经典的游戏

一.游戏相关知识

1.COORD

(1)说明:

控制台屏幕上的坐标,有两个参数x,y,分别对应着横纵坐标,(0,0)对应控制台屏幕左上角顶格位置

(2)声明:

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

2.GetStdHandle

(1)说明:

它用于从一个特定的标准设备中获得一个句柄,用来操作该设备(具体咋理解呢?就相当于你炒菜的肯定是要用锅的嘛,那既然要用锅,那就一定要用把手呗,通过该把手来操控这口锅,然后进行炒菜。这里的把手就相当与这里的句柄,必须你获得了该句柄才能对操作台屏幕上的某些信息进行操作)

(2)声明:

HANDLE WINAPI GetStdHandle(
  _In_ DWORD nStdHandle
);

(3)参数:

STD_INPUT_HANDLE((DWORD)-10) 标准输入设备。 最初,这是输入缓冲区 CONIN$ 的控制台。
STD_OUTPUT_HANDLE((DWORD)-11) 标准输出设备。 最初,这是活动控制台屏幕缓冲区 CONOUT$
STD_ERROR_HANDLE((DWORD)-12) 标准错误设备。 最初,这是活动控制台屏幕缓冲区 CONOUT$

由于我们是要向屏幕输出信息,所以这里我们对该函数的传参选择第二个参数 !!

3.CONSOLE_CURSOR_INFO

(1)说明:

是一个结构体,用来存储控制台屏幕上的光标的占比大小和可见性

(2)声明:

typedef struct _CONSOLE_CURSOR_INFO {
  DWORD dwSize;
  BOOL  bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

4. GetConsoleCursorInfo

(1)说明:

用来获取有关控制台屏幕上的光标的占比和可见性的相关信息

(2)声明:

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

 (3)参数:

第一个就是刚才的句柄 ,第二个是光标

5.SetConsoleCursorInfo

(1)说明:

对修改过后的光标信息进行设置

(2)声明:

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

6.SetConsoleCursorPosition 

(1)说明:

设置光标的位置(初始打印位置)

(2)声明:

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

7. GetAsyncKeyState

(1)说明:

获取键盘上按键的状态,调用函数时键是向上还是向下,以及上次调用 GetAsyncKeyState 后是否按下了该键。

(2)声明:

SHORT GetAsyncKeyState(
  [in] int vKey
);

 (3)参数:

这里的参数是虚拟键代码,传参可以传常数(VK_ESCAPE),也可以传value(0x1B)。在该游戏会用到的虚拟键代码有:

VK_ESCAPE 0x1B ESC 键
VK_SPACE 0x20 空格键
VK_LEFT 0x25 LEFT ARROW 键
VK_UP 0x26 UP ARROW 键
VK_RIGHT 0x27 RIGHT ARROW 键
VK_DOWN 0x28 DOWN ARROW 键
VK_F1 0x70 F1 键
VK_F2 0x71 F2 键

(4)使用方式:

检测按键状态,是看它返回值的最低位,最低位为1表示按下,为0表示没按下

#define KEY_PRESS(VK) (GetAsyncKeyState(VK) & 1) ? 1 : 0

 

8.setlocale

(1)说明:头文件为:<locale.h>

于修改当前地区,可以针对⼀个类项修改,也可以针对所有类项
(2)声明:

char* setlocale (int category, const char* locale);

(3)参数:

第一个参数:该参数为类项,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值