资料合集下载链接:
https://pan.quark.cn/s/472bbdfcd014
今天,我们将在此基础上迈出关键一步,为我们的“贪吃蛇”游戏添加核心玩法:吃食物、身体增长、计分以及游戏结束判断。这会让我们的程序从一个简单的移动演示,蜕变为一个真正有挑战性的游戏。
本文将带你深入理解并实现以下功能:
- 食物的生成与显示
- “吃到食物”的判断逻辑
- 蛇身体如何“神奇地”自动变长
- 游戏结束条件的判断(撞墙与撞自己)
- 计分与游戏结束画面
1. 核心思想:数据结构先行
在开始编码前,我们需要先定义好“蛇”和“食物”的数据结构。这能让我们的代码更加清晰和模块化。
- 蛇 (Snake): 蛇是由多个身体节段组成的。我们可以用一个坐标数组来存储每一节身体的位置,并用一个变量
size
来记录它的当前长度。蛇头就是数组的第一个元素 body[0]
。 - 食物 (Food): 食物很简单,只需要一个坐标
(x, y)
即可。
// 定义坐标结构体
typedef struct {
int x;
int y;
} Point;
// 定义蛇的结构体
typedef struct {
Point body[100]; // 假设蛇最长为100节
int size; // 蛇的当前长度
} Snake;
// 定义食物的结构体
typedef struct {
int x;
int y;
} Food;
2. 吃食物的实现:判断与响应
根据课堂笔记,吃食物的逻辑分为两步:判断和响应。
判断:非常直接,就是检查蛇头的位置是否与食物的位置完全重合。
if (snake.body[0].x == food.x && snake.body[0].y == food.y) {
// 吃到食物了!
}
响应:当蛇吃到食物后,需要发生三件事:
- 蛇的身体变长:这是最关键的一步。笔记中提到“身体增长不需要存储食物坐标,只需增加size即可”。这是一个非常精妙的设计!我们只需要将蛇的
size
变量加一。在后续的移动逻辑中,由于 size
变大了,原本要被擦除的蛇尾那一节就不会被擦除,从而实现了身体的增长。 - 食物消失并重新生成:食物被吃掉后,需要立即在地图的一个新位置生成。为了避免生成在蛇身上,一个严谨的做法是循环生成,直到找到一个不在蛇身上的空位为止。
- 分数增加:记录玩家的得分。
下面是实现这些逻辑的函数:
#include <stdlib.h> // for rand()
#include <time.h> // fo