请帮我写C++代码(2)snake.h头文件、snakec源文件。 snake.h头文件中定义了枚举 Edirection 来标识蛇的移动方向:定义了枚举 EsnakeStutas 标识蛇吃了食物后的状态;蛇用双向链表来表示,则定义struct Snake 表示链表结点。此外,还定义了Snakelnit()、SnakeMove()、Snakelnsert()、SnakeDestroy()、SnakeNormalFn()、SnakeShorten()、SnakeAccelerateO)函数,分别用于蛇的生成、移动、增长等一系列动作。snake.c源文件用于实现snake.h头文件中的函数。
时间: 2024-03-19 09:44:41 浏览: 157
afx.h头文件.zip
以下是snake.h头文件的代码:
```C++
#ifndef SNAKE_H
#define SNAKE_H
// 定义蛇的移动方向
enum Edirection {
UP,
DOWN,
LEFT,
RIGHT
};
// 定义蛇的状态
enum EsnakeStatus {
SNAKE_NORMAL, // 正常状态
SNAKE_SHORTEN, // 吃到缩短食物
SNAKE_ACCELERATE // 吃到加速食物
};
// 蛇的链表结点
struct Snake {
int x, y; // 节点的坐标
Snake* pre; // 前驱节点指针
Snake* next; // 后继节点指针
};
// 初始化蛇
Snake* SnakeInit(int x, int y);
// 蛇的移动
void SnakeMove(Snake* head, Edirection dir, EsnakeStatus& status);
// 在蛇头增加一个节点
void SnakeInsert(Snake* head);
// 销毁蛇
void SnakeDestroy(Snake* head);
// 正常情况下蛇的移动
void SnakeNormalFn(Snake* head, Edirection dir);
// 吃到缩短食物后蛇的移动
void SnakeShorten(Snake* head, Edirection dir);
// 吃到加速食物后蛇的移动
void SnakeAccelerate(Snake* head, Edirection dir);
#endif // SNAKE_H
```
以下是snake.c源文件的代码:
```C++
#include "snake.h"
#include <stdlib.h>
// 初始化蛇
Snake* SnakeInit(int x, int y) {
Snake* head = (Snake*)malloc(sizeof(Snake));
head->x = x;
head->y = y;
head->pre = NULL;
head->next = NULL;
return head;
}
// 蛇的移动
void SnakeMove(Snake* head, Edirection dir, EsnakeStatus& status) {
// 根据状态调用不同的移动函数
switch (status) {
case SNAKE_NORMAL:
SnakeNormalFn(head, dir);
break;
case SNAKE_SHORTEN:
SnakeShorten(head, dir);
break;
case SNAKE_ACCELERATE:
SnakeAccelerate(head, dir);
break;
}
}
// 在蛇头增加一个节点
void SnakeInsert(Snake* head) {
Snake* node = (Snake*)malloc(sizeof(Snake));
node->x = head->x;
node->y = head->y;
node->next = head;
node->pre = NULL;
head->pre = node;
head = node;
}
// 销毁蛇
void SnakeDestroy(Snake* head) {
while (head->next != NULL) {
head = head->next;
free(head->pre);
}
free(head);
}
// 正常情况下蛇的移动
void SnakeNormalFn(Snake* head, Edirection dir) {
// 先在头部添加一个新的节点
SnakeInsert(head);
// 再删除尾部节点
Snake* tail = head;
while (tail->next != NULL) {
tail = tail->next;
}
tail = tail->pre;
free(tail->next);
tail->next = NULL;
// 根据方向修改头部节点的坐标
switch (dir) {
case UP:
head->y--;
break;
case DOWN:
head->y++;
break;
case LEFT:
head->x--;
break;
case RIGHT:
head->x++;
break;
}
}
// 吃到缩短食物后蛇的移动
void SnakeShorten(Snake* head, Edirection dir) {
// 先在头部添加一个新的节点
SnakeInsert(head);
// 不删除尾部节点
// 根据方向修改头部节点的坐标
switch (dir) {
case UP:
head->y--;
break;
case DOWN:
head->y++;
break;
case LEFT:
head->x--;
break;
case RIGHT:
head->x++;
break;
}
}
// 吃到加速食物后蛇的移动
void SnakeAccelerate(Snake* head, Edirection dir) {
// 先在头部添加一个新的节点
SnakeInsert(head);
// 再删除尾部两个节点
Snake* tail = head;
while (tail->next != NULL && tail->next->next != NULL) {
tail = tail->next;
}
free(tail->next->pre);
free(tail->next);
tail->next = NULL;
// 根据方向修改头部节点的坐标
switch (dir) {
case UP:
head->y--;
break;
case DOWN:
head->y++;
break;
case LEFT:
head->x--;
break;
case RIGHT:
head->x++;
break;
}
}
```
阅读全文