利用链表做一条可移动的蛇,C语言
时间: 2023-07-25 17:29:36 浏览: 83
使用C语言实现贪吃蛇小游戏(双向链表实现)snake.c
好的,下面是利用链表实现可移动的蛇的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define ROW 20 //地图的行数
#define COL 30 //地图的列数
#define MAX_LENGTH 100 //蛇的最大长度
typedef struct Node
{
int x; //节点的行坐标
int y; //节点的列坐标
struct Node *next; //节点的下一个节点
}Node;
Node *snake_head = NULL; //蛇头
Node *snake_tail = NULL; //蛇尾
int map[ROW][COL]; //地图
int direction = 3; //方向
int score = 0; //得分
//初始化地图
void initMap()
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (i == 0 || i == ROW - 1 || j == 0 || j == COL - 1)
{
map[i][j] = 2; //墙
}
else
{
map[i][j] = 0; //空地
}
}
}
}
//初始化蛇
void initSnake()
{
Node *node = (Node*)malloc(sizeof(Node));
node->x = ROW / 2;
node->y = COL / 2;
node->next = NULL;
snake_head = node;
snake_tail = node;
map[node->x][node->y] = 1; //蛇身
}
//在地图上显示蛇
void showSnake()
{
Node *p = snake_head;
while (p != NULL)
{
map[p->x][p->y] = 1; //蛇身
p = p->next;
}
}
//在地图上随机产生一个食物
void generateFood()
{
while (1)
{
int x = rand() % ROW;
int y = rand() % COL;
if (map[x][y] == 0)
{
map[x][y] = -1; //食物
break;
}
}
}
//在地图上显示食物
void showFood()
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (map[i][j] == -1)
{
printf("*");
}
else if (map[i][j] == 0)
{
printf(" ");
}
else if (map[i][j] == 1)
{
printf("#");
}
else if (map[i][j] == 2)
{
printf("#");
}
}
printf("\n");
}
}
//移动蛇
void moveSnake()
{
Node *node = (Node*)malloc(sizeof(Node));
node->x = snake_head->x;
node->y = snake_head->y;
node->next = NULL;
if (direction == 1) //向上
{
node->x--;
}
else if (direction == 2) //向下
{
node->x++;
}
else if (direction == 3) //向左
{
node->y--;
}
else if (direction == 4) //向右
{
node->y++;
}
if (map[node->x][node->y] == -1) //吃到食物
{
snake_head->next = node;
snake_head = node;
map[node->x][node->y] = 1; //蛇身
score++;
generateFood();
}
else if (map[node->x][node->y] == 0) //空地
{
snake_head->next = node;
snake_head = node;
map[node->x][node->y] = 1; //蛇身
map[snake_tail->x][snake_tail->y] = 0; //蛇尾消失
snake_tail = snake_tail->next;
}
else if (map[node->x][node->y] == 2) //碰到墙
{
printf("\n游戏结束,得分:%d\n", score);
exit(0);
}
else if (map[node->x][node->y] == 1) //碰到自己
{
printf("\n游戏结束,得分:%d\n", score);
exit(0);
}
}
//改变方向
void changeDirection()
{
if (_kbhit())
{
char ch = _getch();
if (ch == 'w' || ch == 'W')
{
if (direction != 2)
{
direction = 1;
}
}
else if (ch == 's' || ch == 'S')
{
if (direction != 1)
{
direction = 2;
}
}
else if (ch == 'a' || ch == 'A')
{
if (direction != 4)
{
direction = 3;
}
}
else if (ch == 'd' || ch == 'D')
{
if (direction != 3)
{
direction = 4;
}
}
}
}
int main()
{
initMap(); //初始化地图
initSnake(); //初始化蛇
generateFood(); //随机产生一个食物
while (1)
{
system("cls"); //清屏
showFood(); //显示地图和食物
Sleep(100); //延时
changeDirection(); //改变方向
moveSnake(); //移动蛇
}
return 0;
}
```
这段代码中,使用链表存储蛇的身体,每个节点代表一个蛇身的位置,蛇头表示链表的头节点,蛇尾表示链表的尾节点。每次移动蛇时,新的节点插入到链表的头部,旧的尾节点被删除。同时,每次移动蛇时,需要判断蛇头是否碰到了食物、墙或自己,如果碰到了,游戏结束。
阅读全文