用C语言实现贪吃蛇小游戏(基于控制台实现)

目录

GitHub仓库

win32 API

控制台程序

控制台屏幕上的坐标COORD

GetStdHandle 函数

GetConsoleCursorInfo 函数

CONSOLE_CURSOR_INFO 结构

SetConsoleCursorInfo 函数

SetConsoleCursorPosition 函数

getAsyncKeyState 函数

贪吃蛇游戏设计与分析

地图

​编辑

​编辑

本地化

类项

setlocale函数

宽字符的打印

地图坐标

蛇身和食物

数据结构设计

游戏流程设计

核心逻辑实现分析

游戏主逻辑

游戏开始(GameStart)

打印欢迎界面

创建地图

初始化蛇身

创建第⼀个⻝物

游戏运行(GameRun)

KEY_PRESS

PrintHelpInfo

蛇⾝移动(SnakeMove)

IsNextFood

EatFood

NotFood

KillByWall

KillBySelf

游戏结束

完整代码

main.c

Snake.h

Snake.c

持续探索,不断进步


GitHub仓库

本项目已在GitHub上开源,不要吝啬你的小星星哦!亲!

GitHub - Themberfue/GreedySnake: Console-based GreedySnake mini-game

win32 API

        在使用C语言实现贪吃蛇小游戏之前,由于其是通过控制台实现的,在之前还需了解一些win32 API的相关知识。

        所谓win32 API即为Microsoft 32位平台的应用程序编程接口(Application Programming Interface)。所有在Win32平台上运行的应用程序都可以调用这些函数

        在使用这些函数接口前,建议先更改如下选项

        1.呼出cmd命令台窗口(输入win+r后输入cmd)。

        2.在窗口上处右键点击“属性”,找到“启动”选项卡。

        3.找到“默认终端应用程序”选项,将其改为“让Windows决定”或者“Windows控制台主机”。

        ps:建议改为“Windows控制台主机”。

控制台程序

        平常我们运行起来的黑框就是控制台程序,我们可以用cmd命令来改变控制台的一些相关参数,也可以用C语言来改变,这里就要用到system函数来进行修改,在使用system函数前,还需包含头文件<stdlib.h>。

system("mode con cols=100 lines=30");

        上述代码表示将控制台的行改为30行,列为100列

        我们还可以用system函数改变控制台左上侧的标题

system("title 贪吃蛇小游戏");

将上述代码结合起来就是这样的一个C语言代码

#include <stdio.h> 
#include <stdlib.h>

int main() {
	
	system("mode con cols=100 lines=30");
	
	system("title 贪吃蛇小游戏");
	
    getchar();
    
	return 0;
}

将代码运行起来就是如下效果(这里的getchar()是为了防止程序立即结束导致title不显示)

控制台屏幕上的坐标COORD

COORD 是Windows API中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕幕缓冲区上的坐标,坐标系 (0,0) 的原点位于缓冲区的顶部左侧单元格。
COORD类型的声明:
typedef struct _COORD {
 SHORT X;
 SHORT Y;
} COORD, *PCOORD;

给坐标赋值:

 COORD pos = { 20, 15 };

GetStdHandle 函数

GetStdHandle

GetStdHandle是⼀个Windows API函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。
HANDLE GetStdHandle(DWORD nStdHandle);

实例:

HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleCursorInfo 函数

GetConsoleCursorInfo

检索有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息
BOOL WINAPI GetConsoleCursorInfo(
 HANDLE hConsoleOutput,
 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
PCONSOLE_CURSOR_INFO 是指向 CONSOLE_CURSOR_INFO 结构的指针,该结构接收有关主机游标
实例:
HANDLE hOutput = NULL;

//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

CONSOLE_CURSOR_INFO CursorInfo;

GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息

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 函数

SetConsoleCursorInfo

设置指定控制台屏幕缓冲区的光标的⼤⼩和可⻅性。
BOOL WINAPI SetConsoleCursorInfo(
 HANDLE hConsoleOutput,
 const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);

实例:

HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

//影藏光标操作
CONSOLE_CURSOR_INFO CursorInfo;

GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息

CursorInfo.bVisible = false; //隐藏控制台光标

SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态

SetConsoleCursorPosition 函数

SetConsoleCursorPosition

设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调用SetConsoleCursorPosition函数将光标位置设置到指定的位置。
BOOL WINAPI SetConsoleCursorPosition(
 HANDLE hConsoleOutput,
 COORD pos
);

实例:

COORD pos = { 10, 5};

HANDLE hOutput = NULL;

//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

//设置标准输出上光标的位置为pos
SetConsoleCursorPosition(hOutput, 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 函数

getAsyncKeyState

获取按键情况,GetAsyncKeyState的函数原型如下:
SHORT GetAsyncKeyState(
 int vKey
);
将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。
GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果
返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;如果最低位被置为1则说明,该按键被按过,否则为0。
如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1。
这里我们写一个宏定义来快速实现这个功能
#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )

虚拟键代码

实例:检测数字键
#include <stdio.h>
#include <windows.h>
int main()
{ 
 while (1)
 {
 if (KEY_PRESS(0x30))
 {
 printf("0\n");
 }
 else if (KEY_PRESS(0x31))
 {
 printf("1\n");
 }
 else if (KEY_PRESS(0x32))
 {
 printf("2\n");
 }
 else if (KEY_PRESS(0x33))
 {
 printf("3\n");
 }
 else if (KEY_PRESS(0x34))
 {
 printf("4\n");
 }
 else if (KEY_PRESS(0x35))
 {
 printf("5\n");
 }
 else if (KEY_PRESS(
Symantec Backup Exec System Recovery 2010 是 Windows® 系统恢复的金牌标 准。它使企业和 IT 部门能够在几分钟(而不是几小时或几天)内从系统丢失或灾难 中恢复。Backup Exec System Recovery 2010 提供了快捷、易用的系统还原来帮助 IT 管理员实现恢复的时间目标。您甚至可以为服务器、台式机或便携式计算机执行 完全裸机恢复,以恢复到不同的硬件和虚拟环境。它还具有对远程、无人值守位置 的系统进行恢复的能力。 Backup Exec System Recovery 2010 捕获整个实时 Windows 系统的恢复点。其中 包括操作系统、应用程序、系统设置、配置、文件等等,因此不会影响生产力。可 以将恢复点方便地保存到各种介质或磁盘存储设备,其中包括 SAN、NAS、直接附 加存储、RAID,蓝光/DVD/CD 等等。系统发生故障时,可以快速将其还原,而不 需要进行手动、长时间、容易出错的过程。 可以使用 Backup Exec System Recovery 2010 的另一个许可副本,或使用 Backup Exec System Recovery 2010 Management Solution(单独销售)远程管理 Backup 1 Exec System Recovery 2010。Backup Exec System Recovery 2010 Management Solution 是一个集中式的管理应用程序,使 IT 管理员可以迅速了解整个组织中系 统恢复作业的全貌。可以集中部署、修改和维护本地和远程系统的恢复活动、作业 和策略。还可以监视实时状态,迅速解决发现的任何问题。 Backup Exec System Recovery 2010 与 Google™ Desktop 及 Backup Exec Retrieve 2010 集成,可在没有 IT 部门干预的情况下恢复最终用户文件。 通过使用集成的 Granular Restore Option,可以迅速还原各个 Microsoft® Exchange 电子邮件、文件夹和邮箱。 如果需要 Backup Exec System Recovery 2010 的低价简化版本,请考虑 Backup Exec for Windows Servers System Recovery Option。此软件专为 Backup Exec For Windows Servers 客户构建。包括备份和恢复 Windows 计算机所需的组件。它拥 有与 Backup Exec System Recovery 相同的恢复能力,而不包含完整版本的 Backup Exec System Recovery 中的某些其他可用功能。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值