优化贪吃蛇在前进过程中,前进和后退的问题

1.        左边为head,右边为tail

        定义相反数在abs()绝对值函数中实现

2. 在转向函数turn()中,如果绝对值不相等的时候才赋予方向的值

3.贪吃蛇吃食物的思路

3.1 初始化食物initFood(), 蛇碰到食物函数hasFood(),在移动过程中if函数把蛇的尾巴的行和列传过来调用hasFood()来初始化食物initFood()

3.2 static 是静态数值

   

3.2食物的随机

3.3撞到自己的时候死亡

在ifSnakedie()函数中,第一个if是判断是否撞墙,因为while每次都会遍历完到自己,

为了防止遍历到自己,p->next !=NULL 忽略自己与自己比较,

在移动蛇的函数里面做修改

4.完整贪吃蛇代码

#include <curses.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

#define UP       1
#define DOWN    -1
#define LEFT     2
#define RIGHT   -2

void initNcurses()
{
        initscr();
        keypad(stdscr,1);
        noecho();
}

struct 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()
{
        int x = rand()%20;
        int y = rand()%20;

        food.hang = x;
        food.lie = y;
}

int hasSnakeNode(int i,int j){       // da yin she shen ti
        struct Snake *p;
        p = head;  //ding tou 

        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 <=18)
                {
                        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 caoshupei,key= %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 deleteNode()
{
        struct Snake *p;
        p = head;
        head = head ->next;

        free(p);    // fang zhi zao cheng hen duo kong yu de jie dian
}

void  initSnakebody()
{
        struct Snake *p;

        dir = RIGHT;
                                                //di yi ci yun xing shi bu hui zou
        while(head != NULL)                  //yi kai shi deng yu kong
        {                                  //zhuang qiao la jiu shi bu wei kong 
                p = head;
                head = head -> next;
free(p);                   //shi fang nei cun
        }

        initFood();

        head = (struct Snake*)malloc(sizeof(struct Snake));
        head -> hang = 1;                   // gu ding chu shi weizhi 
        head -> lie = 1;
        head -> next = NULL;               // tou de xie yi ge wei kong

        tail = head;                       // wei ba bian cheng tou
        addNode();                         // zeng jia jie dian
        addNode();
        addNode();
}

int ifSnakedie()
{
        struct Snake *p;
        p =head;
        if(tail -> hang <0|| tail ->lie == 0|| tail->hang == 20 ||
                tail->lie ==20){
                return 1;  // zhuang dao bian jie
        }
        while(p->next!=NULL){
                if(p -> hang == tail -> hang && p ->lie == tail-> lie){
                        return 1;  // zhuang dao zi ji
                }
                p = p->next;
        }
        return 0;
}

void moveSnake()
{
        struct Snake *p;
        struct Snake *new;
        addNode();
        if(hasFood(tail->hang,tail->lie))
        {
                initFood();
        }else{
deleteNode();
        }
        if(ifSnakedie())
        {
                initSnakebody();
        }
}

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 KEY_DOWN:
                                turn(DOWN);
                                break;
                        case KEY_UP:
                                turn(UP);
                                break;
                        case KEY_LEFT:
                                turn(LEFT);
                                break;
                        case KEY_RIGHT:
                                turn(RIGHT);
                                break;
                }
        }
}

int main()
{
        pthread_t t1;
        pthread_t t2;
        initNcurses();
        initSnakebody();
        gamePic();

        pthread_create(&t1,NULL,refreshjiemian,NULL);
        sleep(1);
        pthread_create(&t2,NULL,changeDir,NULL);
        while(1);
        getch();
        endwin();
        return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/578407.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何用Python实现智能客服问答系统

随着人工智能技术的不断发展&#xff0c;机器人客服与聊天系统成为了热门话题。Python作为一种简单易学、功能强大的编程语言&#xff0c;在机器人客服与聊天系统的开发中具有广泛应用。 本文将介绍如何使用Python实现机器人客服与聊天系统&#xff0c;包括实现方式、代码示例和…

Mysql-主从复制理解

环境&#xff1a;mysql&#xff0c;主从复制&#xff0c;必须有2个mysql实例&#xff0c;也就是说可以在一台电脑上安装2个msyql&#xff0c;或者2台服务器&#xff0c;一个主服务器&#xff0c;一个从服务器 在实际的生产中&#xff0c;为了解决Mysql的单点故障已经提高MySQL的…

【Unity动画系统】动画基本原理与Avater骨骼复用

动画基本原理 动画片段文件是一个描述物体变化状态的文本文件 在Unity中创建的资源文件大多都是YAML语言编写的文本文件 Curves表示一种变化状态&#xff0c;为空的话则没有记录任何内容 位置变化后的旋转变化状态&#xff1a; 动画文件里的Path名字要相同才能播放相同的动画 …

外贸财务挑战面面观:应对难题之道大揭秘!

出海也开始卷起来了。越来越多的中国企业投身海外市场&#xff0c;寻求更广阔的发展空间。然而&#xff0c;出海之路并非坦途&#xff0c;企业既需把握全球商机&#xff0c;又需应对数字化转型、本土化运营、文化差异性等多重挑战。企业出海&#xff0c;该如何应对这些风浪&…

GPU服务器和普通服务器有何区别?

众所周知&#xff0c;服务器是网络中的重要设备&#xff0c;要接受少至几十人、多至成千上万人的访问&#xff0c;因此对服务器具有大数据量的快速吞吐、超强的稳定性、长时间运行等严格要求。 GPU服务器和普通服务器的主要区别在于硬件配置和适用场景&#xff0c;特别是处理器…

C 函数递归

目录 什么是递归 递归的限制条件 递归的例子 1、用递归求n的阶乘 递归扩展学习 1、青蛙跳台阶 思路 代码实现 2、汉诺塔问题​ 思路 代码实现 总结 什么是递归 递归&#xff1a;“递推” “回归” 在C语言中&#xff0c;函数递归就是&#xff1a;函数自己调用自…

FANUC机器人SOCKET连接指令编写

一、创建一个.KL文件编写连接指令 创建一个KL文本来编写FANUC机器人socket连接指令 二、KAREL指令代码 fanuc机器人karel编辑器编辑的karel代码如下&#xff1a; PROGRAM SM_CON %COMMENT SOCKET连接 %STACKSIZE 4000 --堆栈大小 %INCLUDE klevccdfVAR status,data_type,in…

武汉星起航:成功挂牌新起点,董事长张振邦引领行业再攀高峰

2023年10月30日&#xff0c;对于武汉星起航电子商务有限公司而言&#xff0c;是一个具有里程碑意义的日子。这一天&#xff0c;公司在上海股权托管交易中心成功挂牌展示&#xff0c;正式登陆资本市场&#xff0c;开启了公司发展的新篇章。这一创举不仅彰显了公司在跨境电商领域…

刷题日记 ---- 顺序表与链表相关经典算法题(C语言版)

目录 1. 移除元素2. 合并两个有序数组3. 移除链表元素4. 反转链表5. 合并两个有序链表6. 链表的中间结点7. 环形链表的约瑟夫问题8. 分割链表总结 正文开始 1. 移除元素 题目链接: 移除元素 题目描述: 思路历程: 题目明确要求, 不能使用额外的数组空间, 也就是说不可以创建…

新时代凌迟:考研

我不喜欢上班&#xff0c;但我很欣赏老板的品味&#xff0c;因为咱们公司竟然还在订阅报纸&#xff0c;而且只有一份&#xff0c;《中国青年报》。 这份报纸我最喜欢看的是“冰点周刊”专栏&#xff0c;因为这个栏目能让读者相信&#xff1a;报纸远远可以超越一天的生命。 昨天…

类和对象【三】析构函数和拷贝构造函数

文章目录 析构函数析构函数的定义析构函数的作用主要作用次要作用 析构函数的特点 拷贝构造函数拷贝构造函数的定义拷贝构造函数的作用主要作用次要作用 拷贝构造函数的特点浅拷贝和深拷贝浅拷贝深拷贝 拷贝构造函数的调用场景 析构函数 析构函数的定义 析构函数(destructor) …

stm32 hid自定义接收发送程序开发过程记录

cubleMX配置如下 修改端点描述符一次传输的数据大小 根据cubelMX标准在这里修改 编译错误 直接修改&#xff08;因为没有使用nodef &#xff09;编译通过 修改报告描述符&#xff08;默认的描述符无法传输数据&#xff09; 参考&#xff1a;USB协议详解第10讲&#xff08;USB描…

C++从入门到精通——string类

string类 前言一、为什么学习string类C语言中的字符串示例 二、标准库中的string类string类string类的常用接口说明string类对象的常见构造string类对象的容量操作string的接口测试及使用string类对象的访问及遍历操作下标和方括号遍历范围for遍历迭代器遍历相同的代码&#xf…

元宇宙APP搭建重点,会用到哪些三方服务?

元宇宙APP的搭建是一个综合性的项目&#xff0c;涉及到众多关键要素和第三方服务。以下是一些元宇宙APP搭建的重点&#xff0c;以及可能用到的第三方服务&#xff1a; 一、搭建重点 技术框架的选择与搭建&#xff1a;元宇宙APP需要稳定、高效的技术框架来支撑其运行。这包括前…

上位机图像处理和嵌入式模块部署(树莓派4b与视觉slam十四讲)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 实际使用中&#xff0c;树莓派4b是非常好的一个基础平台。本身板子价格也不是很贵&#xff0c;建议大家多多使用。之前关于vslam&#xff0c;也就是…

Leetcode刷题-(36~40)-Java

算法是码农的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持刷算法题吧。 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就可…

深入理解Python协程:从基础到实战

title: 深入理解Python协程&#xff1a;从基础到实战 date: 2024/4/27 16:48:43 updated: 2024/4/27 16:48:43 categories: 后端开发 tags: 协程异步IO并发编程Pythonaiohttpasyncio网络爬虫 第1章&#xff1a;协程基础 1.1 协程概念介绍 协程&#xff08;Coroutines&…

【科学研究】读博:一场精神赌博❓

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

C++必修:类与对象(一)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 面向过程与面向对象 1.1. 面向过程 我们之前学习的C语言就是一种面向过程的语…

java中http调用组件深入详解

目录 一、前言 二、http调用概述 2.1 什么是http调用 2.1.1 http调用步骤 2.2 HTTP调用特点 2.3 HTTP调用应用场景 三、微服务场景下http调用概述 3.1 微服务开发中http调用场景 3.2 微服务组件中http的应用 四、常用的http调用组件 4.1 java中常用的http组件介绍 4…