欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > (C语言贪吃蛇)15.贪吃蛇吃食物

(C语言贪吃蛇)15.贪吃蛇吃食物

2025/4/3 2:59:30 来源:https://blog.csdn.net/2303_79502195/article/details/142702559  浏览:    关键词:(C语言贪吃蛇)15.贪吃蛇吃食物

目录

前言

注意事项⚠️

效果预览

 实现方法

运行效果

新的问题🙋

最终效果 

总结


前言

        我们上一节实现了解决了贪吃蛇不合理走位的情况,不理解的再回去看看(传送门:解决贪吃蛇不合理走位),那么贪吃蛇自然是要吃食物的啊,所以我们本节来实现贪吃蛇吃食物的效果

注意事项⚠️

        贪吃蛇食物关心的是位置及符号,位置同样可以使用贪吃蛇节点结构体,食物显示为“##”。

效果预览

        

我们用“##”来表示食物,贪吃蛇的头节点碰到食物就吃掉食物。

 实现方法

        我们创建一个结构体struct Snake food(我们先来测试一下食物能不能成功生成,所以我们赋予了食物坐标的初始值)。

struct Snake food;
void initfood()
{int x = 4;int y = 5;food.lie = x;food.lie = y;
}

我们创造出了食物节点,那么要显示这个节点呢,我们需要修改gamePic()函数,增加判断,该节点位置是否为食物节点,是的话就打印“##”:

int hasSnakeNode(int i,int j)
{struct Snake * p;p = head;while(p != NULL){if(p->hang == i && p->lie == j){return 1;}p = p -> next;}return 0;    
}void gamePic()
{int hang;int lie;move(0,0);for(hang = 0;hang < 20;hang ++){if(hang == 0){for(lie = 0;lie < 20;lie ++){printw("--");}printw("\n");}if(hang >= 0 && hang <= 19){for(lie = 0;lie <= 20;lie ++){if(lie == 0 || lie == 20) printw("|");else if(hasSnakeNode(hang,lie)) printw("[]");else if(hasfood(hang,lie)) printw("##");else printw("  ");}printw("\n");}if(hang == 19){for(lie = 0;lie < 20;lie ++){printw("--");}printw("\n");printw("by beiweiqiuAC,%d\n",key);}}}

我们在上面的函数中新增了一个判断函数hasfood(),是用来判断这个节点是否时食物节点,这个函数其实非常熟悉,因为我们判断蛇身节点的函数跟这个函数可以说是大同小异吧

先来看一下判断蛇身节点的函数:

int hasSnakeNode(int i,int j)
{struct Snake * p;p = head;while(p != NULL){if(p->hang == i && p->lie == j){return 1;}p = p -> next;}return 0;    
}

我们稍微修改下就变成了hasfood()函数,非常简单哈:

int hasfood(int i,int j)
{if(food.hang == i && food.lie == j) return 1;return 0;    
}

运行效果

        运行测试一下这个程序:

可以看到食物已经出现在屏幕上了。

新的问题🙋

        既然是食物,那贪吃蛇应该如何吃掉呢?

在这个贪吃蛇里面,贪吃蛇的蛇头实际上是链表的尾节点,那么尾节点的坐标和食物的坐标一样,然后消除就代表吃食物了。

最终效果 

#include <curses.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>#define UP    1
#define DOWN  -1
#define LEFT  2
#define RIGHT -2struct Snake
{int hang;int lie;struct Snake * next;
};struct Snake * head = NULL;
struct Snake * tail = NULL;
int key;
int dir;struct Snake food;void initfood()
{static int x = 11;static int y = 6;food.hang = x;food.lie = y;x += 2;y += 2;
}void initNcurse()
{initscr();keypad(stdscr,1);noecho();
}int hasSnakeNode(int i,int j)
{struct Snake * p;p = head;while(p != NULL){if(p->hang == i && p->lie == j){return 1;}p = p -> next;}return 0;    
}int hasfood(int i,int j)
{if(food.hang == i && food.lie == j) return 1;return 0;    
}void gamePic()
{int hang;int lie;move(0,0);for(hang = 0;hang < 20;hang ++){if(hang == 0){for(lie = 0;lie < 20;lie ++){printw("--");}printw("\n");}if(hang >= 0 && hang <= 19){for(lie = 0;lie <= 20;lie ++){if(lie == 0 || lie == 20) printw("|");else if(hasSnakeNode(hang,lie)) printw("[]");else if(hasfood(hang,lie)) printw("##");else printw("  ");}printw("\n");}if(hang == 19){for(lie = 0;lie < 20;lie ++){printw("--");}printw("\n");printw("by beiweiqiuAC,%d\n",key);}}}void addNode()
{struct Snake * new = (struct Snake *)malloc(sizeof(struct Snake));new->next = NULL;switch(dir){case UP:new->hang = tail->hang - 1;new->lie = tail->lie;break;case DOWN:new->hang = tail->hang + 1;new->lie = tail->lie;break;case LEFT:new->hang = tail->hang;new->lie = tail->lie - 1;break;case RIGHT:new->hang = tail->hang;new->lie = tail->lie + 1;break;}tail->next = new;tail = new;
}void initSnake(){struct Snake * p;dir = RIGHT;while(head != NULL){p = head;head = head -> next;free(p);}initfood();head = (struct Snake *)malloc(sizeof(struct Snake));head->hang = 1;head->lie = 1;head->next = NULL;tail = head;addNode();addNode();addNode();addNode();
}void deleNode()
{// struct Snake * p;// p = head;head = head ->next;// free(p);
}void moveSnake()
{addNode();if(hasfood(tail->hang,tail->lie)){initfood();}else{deleNode();}if(tail ->hang == 0 || tail->lie == 0 || tail->hang == 20 || tail ->lie == 20){initSnake();}
}void* refreshJieMian()
{while(1){moveSnake();gamePic();refresh();usleep(100000);}
}void turn(int direction)
{if(abs(dir) != abs(direction)){dir = direction;}
}void* changeDir()
{while (1){key = getch();switch (key){case 0402:turn(DOWN);break;case 0403:turn(UP);break;case 0404:turn(LEFT);break;case 0405:turn(RIGHT);break;}}
}int main()
{pthread_t t1;pthread_t t2;initNcurse();initSnake();gamePic();pthread_create( &t1, NULL,refreshJieMian, NULL);pthread_create( &t2, NULL, changeDir, NULL);while(1);getch();//防止程序退出endwin();return 0;
}

 

        但其实这个程序还是有点小bug,食物到后面就跑到地图外面了,我们下一节实现食物随机出现的效果。

总结

        我们本节实现了贪吃蛇吃食物的效果,吃一个食物身体就伸长一个节点,但还是有点小bug,我们下一节来解决📨。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com