贪吃蛇大作战【纯c语言】

本文详细介绍了使用C语言实现贪吃蛇游戏的全过程。包括游戏前期准备,如设置控制台信息、使用Win32 API函数;游戏设计与分析,涉及本地化、地图和蛇身设计;还阐述了游戏的初始化、运行和结束逻辑,并给出了总代码文件。

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

如果有看到不懂的地方或者对c语言某些知识忘了的话,可以找我之前的文章哦!!!

个人主页:小八哥向前冲~-CSDN博客

所属专栏:c语言_小八哥向前冲~的博客-CSDN博客

贪吃蛇游戏演示:

贪吃蛇游戏动画演示

目录

游戏前期准备:

设置控制台相关信息

GetStdHanle

GetConsoleCursorInfo

SetConsoleCursorInfo

SetConsoleCursorPosition

GetAsynckeyState

贪吃蛇游戏设计与分析

本地化

地图,食物和蛇身设计

游戏的初始化

打印欢迎界面

绘制贪吃蛇地图

初始化蛇

初始化食物

游戏的运行

打印帮助信息

贪吃蛇的运行

游戏的结束

贪吃蛇的总代码


游戏前期准备:

需要注意的是,纯使用c语言实现贪吃蛇会使用到一些Win32 API知识,接下来我们一一介绍学习一下。

那么什么是Win32 API呢?

介绍:

Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是⼀个很⼤ 的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application),所以便 称之为ApplicationProgrammingInterface,简称API函数。WIN32API也就是MicrosoftWindows 32位平台的应⽤程序编程接口。

设置控制台相关信息

我们知道平常我们运行程序弹出来的那个框框就是控制台终端。(如图)

我们可以使用cmd命令来设置控制台窗口的大小。如:

//         列       行
mode con cols=100 lines=30

值得注意的是:

1.使用这个命令之前,需要把这个控制台改为让Windows决定或Windows 控制台主机。

2.使用system函数所需要的头文件既可以是stdlib.h,也可以是Windows.h(不区分大小,也可以使用windows.h或WINDOWS.H等形式引用头文件。

演示一下:

控制台的改变

同样我们也能通过命令来设置控制台名字

title 贪吃蛇

效果:

控制台上的坐标COORD

COORD是什么呢?其实它是Windows API中定义的结构体,表示一个字符在控制台屏幕缓冲区上的坐标,而坐标系(0,0)的原点位于缓冲区的顶部左端单元格。

COORD的结构体声明:

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

坐标赋值:

COORD pos={20,30};

GetStdHanle

GetStdHanle是一个Windows API函数。它用于从一个特定的标准设备(标准输入,标准输出等)中取得一个句柄(用来标识不同设备的数值),使用这个句柄可以操作设备

注意:标准输入是指键盘,标准输出指的是屏幕。

我们要知道的是只要得到的这个句柄,咋们就能操控设备。所以我们能用GetStdHanle函数来获得句柄,从而进行一系列操作。

我们来看看这个函数:

那么我们来尝试获取句柄:

HANDLE houtput=NULL;
//从标准输出获取句柄
houtput=GetStdHanle(STD_OUTPUT_HANDLE);

我们在程序运行跳出控制台的时候,是不是有一个光标在闪动?那么我们试想一下,倘若我们不将那个光标隐藏的话,蛇在移动的时候就会有一个光标一直在闪动,不美观。那么我们如何隐藏光标呢?接下来就要用到GetConsoleCursorInfo这个函数。

GetConsoleCursorInfo

同样的我们来看看这个函数的语法:

从中我们知道,这个函数就是用来检索控制台屏幕缓冲区的光标大小和光标可见性的信息

BOOL WINAPI GetConsoleCursorInfo(
  _In_  HANDLE               hConsoleOutput,
  _Out_ PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
//注意:PCONSOLE_CURSOR_INFO是指向CONSOLE_CURSOR_INFO 结构的指针,该结构接受有关主机游标

CONSOLE_CURSOR_INFO 这个结构体这个结构体它是包含了光标信息。

我们来看看它的相关信息:

我们来使用一下:

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

 //影藏光标操作
 CONSOLE_CURSOR_INFO CursorInfo;
 GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息

SetConsoleCursorInfo

那么我们得到了光标信息,下一步就是设置我们想要的光标信息,设置光标相关信息的函数其实就是SetConsoleCursorInfo函数,它是用来设置控制台指定控制台屏幕缓冲区的光标大小和可见性

相关信息:

我们来使用看看:


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

    //影藏光标操作
    CONSOLE_CURSOR_INFO CursorInfo;
    GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
    CursorInfo.bVisible = false; //隐藏控制台光标
    //设置光标状态
    SetConsoleCursorInfor(hOutput,&CursorInfo);

SetConsoleCursorPosition

设置好了光标的状态,那么能不能设置光标位置,让我们能在任意位置打印我们想要的信息呢?那么我们就要用到SetConsoleCursorPosition函数。我们将坐标位置放到COORD类型中,然后调用SetConsoleCursorPosition函数就能将光标设置指定位置。

看看详情:

使用一下:

    COORD pos = { 10, 20 };
    HANDLE hOutput = NULL;
    //获取标准输出的句柄(用来标识不同设备的数值)
    hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    //设置标准输出上光标的位置为pos
    SetConsoleCursorPosition(hOutput, pos);

需要注意的是:这个pos位置可能会设置不成功。

GetAsynckeyState

玩过贪吃蛇游戏的都知道,键盘上的上,下,左,右按键来控制蛇的方向。那么我们如何获取玩家是否按了哪个按键呢?GetAsynckeyState函数就能解决这个问题。

老样子,我们来看看它的详情:

详细解释:将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果 返回的16位的short数据中,最高位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬 起;如果最低位被置为1则说明,该按键被按过,否则为0。 如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1

虚拟按键代码详细见:虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn

我们来使用看看:


#define KEY_PRESS(VK)  ((GetAsyncKeyState(VK)&0x1) ? 1 : 0)
 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");
        }
     }
}
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值