游戏背景:
贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。
实现基本的功能:
- 贪吃蛇地图绘制
- 蛇吃⻝物的功能 (上、下、左、右⽅向键控制蛇的动作)
- 蛇撞墙死亡
- 蛇撞⾃⾝死亡
- 计算得分
- 蛇⾝加速、减速
- 暂停游戏
技术要点:
C语⾔函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。
一、地图的制作思路:
关于地图的制作,我们要将地图制作成什么样子呢?
在我们的预想中,我们需要使用控制台的界面进行贪吃蛇的游戏操作。
控制台的设置-CSDN博客https://blog.csdn.net/2301_76445610/article/details/133975868?spm=1001.2014.3001.5501
二、地图内的场景设置:
- 在游戏地图上,我们打印墙体使用宽字符‘□’,打印蛇使用宽字符'●',打印食物使用宽字符'★'
三、地图坐标和宽字符的冲突:
由于我们是在控制台上进行实现贪吃蛇游戏,所以我们需要在控制台上实现以宽字符为主体的墙面、蛇身、食物,但是在控制台中,我们是以普通字符为主,作为一个坐标点的。
而普通字符是以一个字节为单位,可是宽字符是以两个字节为一组的。
并且根据打印宽字符的特点,只需要打印一个坐标点,就能将宽字符完全显现,比如,在(5,5)上打印宽字符,则宽字符会占据两个字节的位置,会把(6,5)的位置也占了 。
- 所以,最后,我们在考虑墙面、蛇身、食物的时候,我们必须要往2的倍数方向进行考虑,特别是蛇身,我们需要将蛇身以2的倍数进行构造。
C语言 ——宽字符-CSDN博客https://blog.csdn.net/2301_76445610/article/details/133978119?spm=1001.2014.3001.5501
四、蛇的身体分析:
- 对于蛇的身体,我们需要用到链表的知识,将蛇的身体化为一个又一个字节,使用指针进行连接。
typedef struct SnakeNode
{
int x;
int y;
struct SnakeNode* next;
}SnakeNode,* pSnakeNode;
- int x ;int y ;表示控制台的坐标。
- SnakeNode 是使用 typedef 将struct SankNode 进行重命名后的名字,方便以后书写suruct SankNode
- * pSnakeNode 是 使用 typedef 将 struct SankNode * 这个指针类型进行重命名,以后需要使用 struct SankNode * 可以用 pSnakeNode 代替 。
五、贪吃蛇游戏的文件:
- test.c —— —— 游戏的整体运行测试
- snake.c —— —— 函数的实现
- snake.h —— —— 函数和类型的声明
贪吃蛇的游戏结构:
需要的内容:
- 对于一个贪吃蛇游戏,蛇是必须存在,且因为蛇是一个链表形式,所以我们需要蛇的头节点的指针
- 同时,根据贪吃蛇的游戏规则,我们需要一个食物,且因为吃掉食物蛇会变长,因此食物也可以看作链表中的一个节点,只是这个节点需要使用链表的某些操作进行插入到蛇的身体中,所以我们需要食物的节点指针
- 因为贪吃蛇是一个看长度积分的游戏,所以我们需要一个累计分数的变量
- 同时,我们也需要对食物赋予分数
- 同时,我们需要对蛇进行一个速度的附加值,让它加速减速
- 对于操作蛇,是一个非常重要的东西,我们要让蛇上下左右进行移动
- 最后,我们需要对整个游戏的状态进行判断和显示出该状态下会出现的结果
//描述蛇的方向
enum DIRECTION
{
UP = 1,
DOWN,
LEFT
RIGHT
}
//游戏的状态
enum GAME_STATUS
{
//正常运行
OK,
//按ESC退出
END_NORMAL,
//撞墙死亡
KILL_BY_WALL,
//吃到自己死亡
KILL_BY_SELF
}
//贪吃蛇的游戏结构
struct Snake
{
pSnakeNode _pSnake;//指向贪吃蛇头结点的指针
pSnakeNode _pFood;//指向食物结点的指针
int _Score;//贪吃蛇累计的总分
Foodweight;//-个食物的分数int
int _sleepTime;//每走一步休息的时间,时间越短,速度越快,时间越长,速度越慢
enum DIRECTION _Dir;//描述蛇的方向
enum GAME_STATUS _status;//游戏的状态: 正常、退出、撞墙、吃到自己
}
游戏的创建:
初始化:
snake.c
未完待续!!!!!!!!!!!!!!!!!!!!!