贪吃蛇c语言链表头插法实现
时间: 2023-07-12 22:46:30 浏览: 178
链表头插法实现贪吃蛇的代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define ROW 20 // 行数
#define COL 40 // 列数
// 定义结构体
typedef struct node{
int x; // x坐标
int y; // y坐标
struct node *next; // 指向下一个节点
}snake, *psnake;
typedef struct fruit{
int x; // x坐标
int y; // y坐标
}fruit;
// 定义全局变量
int map[ROW][COL] = {0}; // 地图
psnake head = NULL; // 蛇头
fruit f; // 水果
// 初始化地图
void initmap(){
int i, j;
for(i = 0; i < ROW; i++){
for(j = 0; j < COL; j++){
if(i == 0 || i == ROW - 1 || j == 0 || j == COL - 1){
map[i][j] = -1; // 地图边界
}
else{
map[i][j] = 0; // 地图内部
}
}
}
}
// 打印地图
void printmap(){
system("cls"); // 清屏
int i, j;
for(i = 0; i < ROW; i++){
for(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 createsnake(){
int x = ROW / 2;
int y = COL / 2;
psnake p = (psnake)malloc(sizeof(snake)); // 创建节点
p->x = x; // 给节点赋值
p->y = y;
p->next = NULL;
map[x][y] = 1; // 地图上标记蛇
head = p; // 头指针指向蛇头
}
// 创建水果
void createfruit(){
srand((unsigned int)time(NULL)); // 产生随机数种子
while(1){
int x = rand() % ROW;
int y = rand() % COL;
if(map[x][y] == 0){ // 判断是否可以放水果
f.x = x;
f.y = y;
map[x][y] = 2; // 地图上标记水果
break;
}
}
}
// 判断是否吃到水果
int iseaten(){
if(head->x == f.x && head->y == f.y){
return 1;
}
return 0;
}
// 蛇移动
void movesnake(int dir){
psnake p = (psnake)malloc(sizeof(snake)); // 创建新节点
p->x = head->x; // 新节点的坐标为蛇头的坐标
p->y = head->y;
p->next = head; // 新节点指向原来的蛇头
head = p; // 头指针指向新蛇头
map[head->x][head->y] = 1; // 地图上标记新蛇头
if(iseaten()){ // 判断是否吃到水果
createfruit(); // 重新创建水果
}
else{
map[p->next->x][p->next->y] = 0; // 地图上删除原来的蛇尾
psnake q = head;
while(q->next->next != NULL){ // 找到新蛇尾
q = q->next;
}
free(q->next); // 释放原来的蛇尾节点
q->next = NULL;
}
switch(dir){ // 移动方向
case 72: // 上
head->x--;
break;
case 80: // 下
head->x++;
break;
case 75: // 左
head->y--;
break;
case 77: // 右
head->y++;
break;
default:
break;
}
}
// 判断是否死亡
int isdead(){
if(head->x == 0 || head->x == ROW - 1 || head->y == 0 || head->y == COL - 1){ // 撞到墙壁
return 1;
}
psnake p = head->next;
while(p != NULL){ // 撞到自己
if(head->x == p->x && head->y == p->y){
return 1;
}
p = p->next;
}
return 0;
}
int main(){
initmap(); // 初始化地图
createsnake(); // 创建蛇
createfruit(); // 创建水果
int dir = 77; // 初始方向为右
while(1){
printmap(); // 打印地图
if(kbhit()){ // 检测键盘输入
dir = getch(); // 获取键盘输入
}
movesnake(dir); // 蛇移动
if(isdead()){ // 判断是否死亡
printf("Game Over!\n");
break;
}
}
return 0;
}
```
阅读全文