请实现贪吃蛇移动的函数,考虑移动时分别当吃到果子和没有吃的果子的场景同时还要判断在移动一步之后是否会造成碰到蛇自己本身《不考虑碰壁》,即当 蛇的头部碰到蛇身体任何部分即表示失败。(25分)“ int SnakeMove(Food S *pFood 8LIST S *pHeadSnake, SLIST S *pTailSnake);4 函说明:f 参微pFood;作为入参表示下一个移动的位置,当成员IsHsveFood为FLASE时表示仅仅只是移动位置,当IsHeveFood为IRUE时,表示吃到了果子;4 参微pHeadSnake、pTailSnake: 分别表示女吃蛇的头屋节点即是入参也是出参;4返回值:表示食吃蛇移动函数的结果是成功还是失败,0表示成功, -1表示失败;4 typedef struct SLIST{e int x;fint y;f struct SLIST *prev;f struct SLIST *next;# SLIST 8;4typedef struct Food[e int x;f int y;f bool IsHaveFood;}Food s;
时间: 2024-02-21 10:59:36 浏览: 46
openFrameworks实现的简单版可360度移动的贪吃蛇游戏-Snake
以下是基于题目要求实现的贪吃蛇移动函数的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct SLIST {
int x;
int y;
struct SLIST* prev;
struct SLIST* next;
} SLIST;
typedef struct Food {
int x;
int y;
bool IsHaveFood;
} Food;
int SnakeMove(Food* pFood, SLIST** pHeadSnake, SLIST** pTailSnake) {
// 计算下一个移动的位置
int nextX = (*pHeadSnake)->x + pFood->x;
int nextY = (*pHeadSnake)->y + pFood->y;
// 判断是否吃到了果子
if (pFood->IsHaveFood && nextX == pFood->x && nextY == pFood->y) {
// 吃到果子了,将果子标记为没有
pFood->IsHaveFood = false;
} else {
// 没有吃到果子,删除尾部节点
SLIST* pTail = *pTailSnake;
*pTailSnake = pTail->prev;
(*pTailSnake)->next = NULL;
free(pTail);
}
// 判断是否碰到了蛇身体
SLIST* pNode = (*pHeadSnake)->next;
while (pNode != NULL) {
if (nextX == pNode->x && nextY == pNode->y) {
return -1; // 碰到了蛇身体,游戏失败
}
pNode = pNode->next;
}
// 在头部添加新节点
SLIST* pNewHead = (SLIST*) malloc(sizeof(SLIST));
pNewHead->x = nextX;
pNewHead->y = nextY;
pNewHead->prev = NULL;
pNewHead->next = *pHeadSnake;
(*pHeadSnake)->prev = pNewHead;
*pHeadSnake = pNewHead;
return 0; // 移动成功
}
int main() {
// 初始化蛇
SLIST* pHeadSnake = (SLIST*) malloc(sizeof(SLIST));
pHeadSnake->x = 0;
pHeadSnake->y = 0;
pHeadSnake->prev = NULL;
pHeadSnake->next = NULL;
SLIST* pTailSnake = pHeadSnake;
// 初始化果子
Food food = {2, 2, true};
// 移动蛇
int result = SnakeMove(&food, &pHeadSnake, &pTailSnake);
if (result == 0) {
printf("移动成功\n");
} else {
printf("游戏失败\n");
}
return 0;
}
```
在这个实现中,我们使用双向链表来表示蛇的身体,链表的头部表示蛇的头部,链表的尾部表示蛇的尾部。在每次移动时,我们首先计算出下一个移动的位置,然后判断是否吃到了果子,如果吃到了,则将果子标记为没有;如果没有吃到,则删除尾部节点。接着,我们判断是否碰到了蛇身体,如果碰到了,则游戏失败;否则,在头部添加一个新节点。最后,根据移动的结果返回相应的值。
阅读全文