贪吃蛇(C语言详解)

贪吃蛇游戏运行画面-CSDN直播

目录

贪吃蛇游戏运行画面-CSDN直播

1. 实验目标

2. Win32 API介绍

2.1 Win32 API

2.2 控制台程序(Console)

2.3 控制台屏幕上的坐标COORD

2.4 GetStdHandle

2.5 GetConsoleCursorlnfo

2.5.1 CONSOLE_CURSOR_INFO

2.6 SetConsoleCursorlnfo

2.7 SetConsoleCursorPosition

2.8 GetAsyncKeyState

3. 贪吃蛇准备阶段

3.1 地图

3.1.1 本地化

3.1.2 类型

3.1.3 setlocale函数

3.14 宽字符的打印

3.1.5 地图坐标

3.2 蛇身和食物

3.3 链表定义蛇身

3.4 结构体维护贪吃蛇游戏

3.5 枚举定义蛇的方向和游戏状态

3.6 确定游戏流程设计

4. 游戏开始(GameStart)

4.1 设置游戏窗口大小和名字以及隐藏光标

 4.2 打印欢迎界面

4.3 绘制地图

4.4 初始化蛇身 

4.5 创建食物

5. 游戏运行(GameRun)

5.1 打印帮助信息(PrintHelpInfo)

5.2 按键判断与打印得分

5.3 蛇身移动(SnakeMove)

5.3.1 判断移动过程中是否遇到食物(NextIsFood)

5.3.1.1 吃食物(EatFood)

5.3.1.2 不吃食物(NoFood)

5.3.2 撞到墙游戏结束(KillByWall) 

5.3.3 咬到自身游戏结束(KillBySelf)

6. 游戏结束(GameEnd)

6.1 总代码


 

1. 实验目标

使用C语言在Windows环境的控制台中模拟实现经典小游戏贪吃蛇
实现的基本功能为:
  1. 贪吃蛇地图绘制
  2. 蛇吃食物的功能(上、下、左、右方向键控制蛇的动作)
  3. 蛇撞墙死亡
  4. 蛇撞自身死亡
  5. 计算得分
  6. 蛇身加速、减速
  7. 暂停游戏
要实现这些功能,首先我们必须具备一些知识的储备。例如:C语言函数、枚举、结构体、动态
内存管理、预处理指令、链表、Win32 API等。

2. Win32 API介绍

本次实现贪吃蛇会使用到的一些Win32 API知识,那么就学习一下

2.1 Win32 API

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

其实说人话就是:如果你要基于Windows操作系统来编写一些程序,则Windows会提供各种接口,便于你完成一些功能

2.2 控制台程序(Console)

平常我们运行起来的黑框程序其实就是控制台程序
我们可以使用cmd命令来设置控制台窗口的长宽:设置控制台窗口的大小,30行,100列
mode con cols=100 lines=30

也可以通过命令设置控制台窗口的名字:

title 贪吃蛇
这些能在控制台窗口执行的命令,也可以调用C语言函数system来执行。例如:
注意:system是执行系统命令,使用system需要包含头文件<stdlib.h>
#include <stdlib.h>

int main()
{
	//设置控制台窗口的长度:设置控制台窗口的大小,30行,100列
	system("mode con cols=100 lines=30");
	//设置cmd窗口名称
	system("title 贪吃蛇");
	return 0;
}

运行效果图0f43d6b6a8a54055b1a1fbfe00f336f4.png

执行完后我们会发现窗口大小调制好了,但窗口名却没有,这是因为程序已经结束了。

解决方法:

  1. getchar(); 执行到这行会停下来,等待接收一个字符
  2. system("pause") 执行到这行命令程序会暂停

0714bb65aee34cf989d2273ee7e1ea8e.png

2.3 控制台屏幕上的坐标COORD

注意:使用COORD需要包含头文件<windows.h>

COORD是WindowsAPI中定义的一个结构体,表示一个字符在控制台屏幕幕缓冲区上的坐标,坐标系(0,0)的原点位于缓冲区的顶部左侧单元格。f806d7efdd374f8c96b212810b8fb74c.png

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

给坐标赋值:

COORD pos = { 10, 15 };

2.4 GetStdHandle

使用需要包含头文件<windows.h>

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

说人话:要操作特定的控制台程序就要获得它的操作权限,能要识别你在操作谁

实例:
c7447ce830e54964ab22506709ef2550.png
d7e75cd40cea4af3874e001c3ab98c8e.png

2.5 GetConsoleCursorlnfo

检索有关指定控制台屏幕缓冲区的光标大小和可见性的信息

BOOL WINAPI GetConsoleCursorInfo(
         HANDLE                                               hConsoleOutput,
         PCONSOLE_CURSOR_INFO              lpConsoleCursorInfo
    );
 PCONSOLE_CURSOR_INFO是指向CONSOLE_CURSOR_INFO 结构的指针,该结构接收有关主机游标(光标)的信息

总结:使用GetConsoleCursorlnfo传入的第一个参数是句柄,为何需要句柄?原因是如要隐藏光标首先需要获得当前控制台对应的光标信息。第二个参数是结构体指针

	HANDLE hOutput = NULL;
	//获取标准输出设备的句柄(⽤来标识不同设备的数值)
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	//定义结构体变量
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息
	//调用完这个函数后就能把hOutput对应的光标信息填充到这个结构体变量中去

2.5.1 CONSOLE_CURSOR_INFO

这个结构体,包含有关控制台光标的信息
typedef struct _CONSOLE_CURSOR_INFO {
    DWORD dwSize;
    BOOL  bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
  • dwSize,由光标填充的字符单元格的百分比。 此值介于1到100之间。 光标外观会变化,范围从完全填充单元格到单元底部的水平线条。 31fd5c3f00da452ab26b801bb1d54ed1.png
  •  bVisible,游标的可见性。 如果光标可见,则此成员为 TRUE。
    CursorInfo.bVisible = fa
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值