嵌入式Linux编程--贪吃蛇

习得:

1.ncurse库:
    使用ncurse是因为案件响应灵敏,不用回车;头文件#include<curses.h>
   创建.c文件,同时gcc编译也需要添加 -lcurses
   主函数中:

             initscr();//ncurse界面初始化函数
             printw();//ncurse模式下的print
             getch();//等待用户输入,如果没这句话程序就退出了,看不到运行结果
             endwin();//程序退出,调用改函数来恢复shell终端显示,如果没这句话,shell终端字乱码坏掉

2.Linux线程

       程序都是从上到下运行,要想2个同时运行,需要线程;一个程序有多个线程,互不影响
        线程头文件#include<pthread.h>,gcc编译的时候需要添加-lpthread
        运用 :

                pthread_t th1;
               pthread_create(&th1,NULL,func1,null);//func1
为创建的函数,null为函数中的参数
                 //void *func1(),定义的该函数返回值是void*型

3.食物随机,不出边界

rand()函数随机数

不出边界(20x20)rand%20(对随机数取余数)
    

 

4.制作贪吃蛇方向按键
    vi /usr/include/curses.h 查看相应按键编码
    方向头文件,include<curses.h>
    KEY_DOWN ==0402;
    KEY_UP   ==0403;
    KEY_LEFT ==0404;
    KEY_RIGHT==0405;
    :cq退出
 

代码:

#include <stdio.h>
#include <curses.h>
#include <stdlib.h>#include <pthread.h>#define UP      1
#define DOWN    -1
#define LEFT    2
#define RIGHT   -2 // jue dui zhi fangxiang bugstruct Snake{int hang;int lie;struct Snake *next;};int dir;
int key;
struct Snake *head=NULL;
struct Snake *tail=NULL;struct Snake food;void initFood()
{int x = rand()%20;int y = rand()%20;food.hang = x;food.lie  = y;}void initNcurse(){initscr();keypad(stdscr,1);
}void addNode()
{struct Snake *new=(struct Snake *)malloc(sizeof(struct Snake));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;}new->next = NULL;tail->next = new;tail = new;}void initSnake()
{struct Snake* p;dir = RIGHT;while(head!=NULL){p=head;head=head->next;free(head);}initFood();head=(struct Snake *)malloc(sizeof(struct Snake));head->hang=2;head->lie=2;head->next=NULL;tail=head;addNode();//add new nodeaddNode();}int  hasFood(int i,int j)
{if(food.hang==i && food.lie==j){return 1;}return 0;
}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 GameMap()
{int hang;int lie;move(0,0);//move cursor positionfor(hang=0;hang<20;hang++){if(hang==0){for(lie=0;lie<=19;lie++){printw("--");}printw("\n");}for(lie=0;lie<=20;lie++){if(lie==0||lie==20){printw("|");}else if(hasSnakeNode(hang,lie)==1){printw("[]");}else if(hasFood(hang,lie)==1){printw("##");}	else {printw("  ");}}if(hang==19){printw("\n");for(lie=0;lie<=19;lie++){printw("--");}}printw("\n");}printw("\n");printw("by zhou");}void deleNode()
{head = head->next;}int ifSnakeDie()
{struct Snake *p;p=head;if(tail->hang<0||tail->hang==20||tail->lie==0||tail->lie==20){return 1;}while(p->next!= NULL){if(p->hang == tail->hang && p->lie == tail->lie ){return 1;		} p=p->next;}return 0;
}void moveSnake()
{addNode();if(hasFood(tail->hang,tail->lie)){initFood();}else{	deleNode();}if(ifSnakeDie()==1){initSnake();}
}void* refreshjiemian()//duoxiancheng
{while(1){moveSnake();GameMap();//refresh(shuaxin) the maprefresh();//shua xin jie mianusleep(100000);//wei miao//            sleep(1);//refresh every second}}void turn(int direction)
{if(abs(direction)!=abs(dir)){//abs(a)==|a|,if 1!=2,the direction changesdir=direction;//jue duizhi != change dir}
}
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;initNcurse();initSnake();GameMap();pthread_create(&t1,NULL,refreshjiemian,NULL);pthread_create(&t2,NULL,changedir,NULL);while(1);//keep main xiancheng runendwin();getch();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot背诵

1、springboot简介 2、spring注解 Bean&#xff1a; Configuration&#xff1a; Component&#xff1a; Controller&#xff1a; Service&#xff1a; Repository&#xff1a; ComponentScan&#xff1a; Import&#xff1a; Conditional&#xff1a; ConfigurationProperties&…

跨cpu架构部署容器技术点:怎样修改Linux 的内核版本

在使用Docker 进行跨平台部署之后&#xff0c;我们还可以尝试进行跨架构部署。 从X86 架构上移植到 aarch64 上。 要使用这个功能&#xff0c;需要Docker 的版本在19以上&#xff0c;因为这个是19以上版本中提供的一个实验性方案。 除此之外还需要&#xff1a;Linux的内核版本要…

uni-app-使用tkiTree组件实现树形结构选择

前言 在实际开发中我们经常遇见树结构-比如楼层区域-组织架构-部门岗位-系统类型等情况 往往需要把这个树结构当成条件来查询数据&#xff0c;在PC端可以使用Tree&#xff0c;table&#xff0c;Treeselect等组件展示 在uni-app的内置组件中似乎没有提供这样组件来展示&#x…

并查集模板的应用:连通块

一、链接 837. 连通块中点的数量 二、题目 给定一个包含 nn 个点&#xff08;编号为 1∼n1∼n&#xff09;的无向图&#xff0c;初始时图中没有边。 现在要进行 mm 个操作&#xff0c;操作共有三种&#xff1a; C a b&#xff0c;在点 aa 和点 bb 之间连一条边&#xff0c…

Windows server上用nginx部署vue3项目

Windows server上用nginx部署vue3项目 一、Node中node_modules文件夹及package.json文件的作用说明二、VUE3项目打包三、Windows Server上的Nginx部署 一、Node中node_modules文件夹及package.json文件的作用说明 node_modules是安装node后用来存放用包管理工具下载安装的包的…

快速消除视频的原声的技巧分享

网络上下载的视频都会有视频原声或者背景音乐&#xff0c;如果不喜欢并且想更换新的BGM要怎么操作呢&#xff1f;今天小编就来教你如何快速给多个视频更换新的BGM&#xff0c;很简单&#xff0c;只需要将原视频的原声快速消音同时添加新的背景音频就行&#xff0c;一起来看看详…

设计模式行为型——中介者模式

目录 什么是中介者模式 中介者模式的实现 中介者模式角色 中介者模式类图 中介者模式代码实现 中介者模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是中介者模式 中介者模式&#xff08;Mediator Pattern&#xff09;属于行为型模式&#xff0c;是用来降低…

CVE漏洞复现-CVE-2019-5021 镜像漏洞利用

CVE-2019-5021 镜像漏洞利用 随着容器技术的普及&#xff0c;容器镜像也成为软件供应链中非常重要的一个组成的部分。人们像使用 pip 等工具从仓库获取各种编程软件库一样&#xff0c;可以从 Docker Hub 或 第三方仓库拉取镜像&#xff0c;在其基础上进行开发&#xff0c;从而…

adb调试

连不上 adb 如果还遇到5037端口被占用的问题&#xff0c;就找出进程号用taskkill命令杀死该进程即可 1、查找5037端口对应的进程&#xff1a;netstat -ano|findstr 5037 2、杀死该进程&#xff1a;taskkill /F /PID pid 连接unity profiler 打开发包&#xff0c;并安装在手机…

【2023年11月第四版教材】《第2章-信息技术发展》

《第2章-信息技术发展》 章节说明1 计算机软硬件2 计算机网络2.1 网络的作用范围2.2 OSI模型2.3 广域网协议2.4 网络协议2.5 TCP/IP2.6 软件定义网络&#xff08;SDN&#xff09;2.7 第五代移动通信技术 章节说明 大部分为新增内容&#xff0c;预计选择题考4分&#xff0c;案例…

网络音频终端音频编码解码终端

网络对讲终端SV-7011V 网络对讲终端SV-7011V&#xff0c;采用了ARM音频DSP架构&#xff0c;集网络对讲、网络广播、监听等功能于一身&#xff0c;内置麦克风、配置line out、line in、Mic in功能输出接口&#xff0c;适用于学校&#xff0c;机场&#xff0c;广场等场所。 产品…

保姆级教程--抢先体验 Microsoft 365 Copilot,微软全家桶Chat GPT

【ChatGPT】前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击查看学习资料&#xff09; 前段时间微软发的Microsoft 365 Copilot 可以说非常火爆了&#xff0c;那么该…

元素2D转3D 椭圆形旋转实现

椭圆旋转功能展示 transform-style: preserve-3d;&#xff08;主要css代码&#xff09; gif示例&#xff08;背景图可插入透明以此实现边框线的旋转&#xff09; 导致的无法点击遮挡问题可以参考我的另一个文章 穿透属性-----------------------css穿透属性 实时代码展示

决策树的划分依据之:信息增益率

在上面的介绍中&#xff0c;我们有意忽略了"编号"这一列.若把"编号"也作为一个候选划分属性&#xff0c;则根据信息增益公式可计算出它的信息增益为 0.9182&#xff0c;远大于其他候选划分属性。 计算每个属性的信息熵过程中,我们发现,该属性的值为0, 也就…

Redis 双写一致性实践及案例

面试问题&#xff1a; 你只要用缓存&#xff0c;就可能会涉及到redis缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性问题&#xff1f;双写一致性&#xff0c;你先动缓存redis还是数据库mysql哪一个&…

解决word打字卡顿问题的方法

❤ 2023.8.5 ❤ 最近整理论文&#xff0c;本来我是wps死忠粉&#xff0c;奈何wps不支持latex公式。。。 无奈用起了word&#xff0c;但是谁想字数稍微多了一点&#xff0c;word就卡得欲仙欲死&#xff0c;打个字过去2s才显示出来&#xff0c;删除的时候都不知道自己删了几个字…

代码随想录算法训练营之JAVA|第二十一天| 77. 组合

今天是第21天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天。 算法挑战链接 77. 组合https://leetcode.cn/problems/combinations/description/ 第一想法 需要从N个数中选取K个数&#xff0c;那么第一想法肯定是k个for循环&#xff0c;每个for循环选取一个数&#x…

尚品汇总结三:商城首页(面试专用)

目录 首页商品分类实现 1、封装数据接口 2、页面静态化&#xff1a; 什么是页面静态化 为什么要使用静态化 首页商品分类实现 前面做了商品详情&#xff0c;我们现在来做首页分类&#xff0c;我先看看京东的首页分类效果&#xff0c;我们如何实现类似效果&#xff1a; 思路…

MongoDB 使用总结

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

pktgen-dpdk arm编译问题 “Platform must be built with RTE_FORCE_INTRINSICS“

编译报错 /usr/include/rte_atomic_32.h:9:4: error: #error Platform must be built with RTE_FORCE_INTRINSICS解决办法&#xff1a; 我是在 arm架构服务器上编译出现这个&#xff0c;要定义 RTE_FORCE_INTRINSICS 在meson.build中 增加gcc编译参数 add_project_arguments(…