引入线程的贪吃蛇风骚走位

1.在main函数中分别引入线程t1 和线程 t2

    一个线程用来刷新界面,一个线程用来改变方向

2.刷新界面函数,无限次刷新

3. 也是无限循环while(1) 定义key 从键盘获取输入方向,赋值给dir;

4.在初始化函数中确定蛇向有行走为方向

5.从改变方向的函数changeDir()函数中获取dir的方向,在增加节点函数addNode()中,用switch函数实现蛇方向的改变

代码演示:

#include <curses.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>#define UP   1
#define DOWN 2
#define LEFT 3
#define RIGHT   4void 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;int hasSnakeNode(int i,int j){       // da yin she shen tistruct Snake *p;p = head;  //ding tou 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 <=18){for(lie = 0;lie<=20;lie++){if(lie == 0 || lie == 20){printw("|");}else if(hasSnakeNode(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 zouwhile(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}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 kongtail = head;                       // wei ba bian cheng touaddNode();                         // zeng jia jie dianaddNode();addNode();
}void moveSnake()
{struct Snake *p;
struct Snake *new;addNode();deleteNode();if(tail -> hang == 0|| tail ->lie == 0|| tail->hang == 20 ||tail->lie ==20){initSnakebody();}
}void *refreshjiemian()
{while(1){moveSnake();gamePic();refresh();usleep(100000);}
}void *changeDir()
{while(1){key = getch();switch(key){case KEY_DOWN:dir = DOWN;break;case KEY_UP:dir = UP;break;case KEY_LEFT:dir = LEFT;break;case KEY_RIGHT:dir = 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;
}

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

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

相关文章

ESLint 、 e2e test 学习

Lint和Format的区别&#xff1a; Lint只会告诉你代码中的错误或者不符合规范的地方&#xff0c;而Format是用来对格式作调整的 HTML/tpl&#xff1a;HTMLLint CSS/SCSS&#xff1a;Stylelint JS/JSX&#xff1a;Eslint JSLint&#xff1a;古老&#xff0c;不能配置和扩展JSHin…

CentOS安装CRI--containerd

前言 CRI&#xff0c;Container Runtimes&#xff0c;通常直译成容器进行时因为kubernetes&#xff0c;从1.24开始&#xff0c;移除了Dockershim&#xff0c;需要额外安装CRI&#xff0c;保障Pod能顺利运行。网上有很多容器进行时的工具&#xff0c;本文采用containerd工具。 …

Vue 使用Canvas画布手写电子版签名 保存 上传服务端

电子版签名效果 定义画布 <canvas width"500"height"250"ref"cn"mousedown"cnMouseDown"mousemove"cnMouseMove"mouseup"cnMouseUp"style"width:500px;height: 250px;background-color:snow;padding: 10p…

ros2 node 之间的通信方式之 —— Topic通信案例

文章目录 ros2 node 之间的通信方式之 Topic通信Topic 通信案例1、创建工作空间2、创建功能包3、编写发布者和订阅者代码3.1 topic_helloworld_pub.cpp3.2 topic_helloworld_sub.cpp 4、编写CMakeLists.txt5、编译工作空间下的功能包6、运行结果 ros2 node 之间的通信方式之 To…

attempt to compare nil with number -- 黑马点评出现问题

问题情况 : 主要问题 : 调用lua执行redis时&#xff0c;有一个值会接受nil&#xff08;因为redis中没有该数据&#xff09;或者数值&#xff0c;当该值为nil时执行报错&#xff0c;因为会用到将该值与其他数字比较&#xff0c;故报错attempt to compare nil with number 当然…

opencv图像处理

1、图像滤波处理 通过滤波来提取图像特征&#xff0c;消除噪声。 常用滤波方式有&#xff1a;均值滤波、高斯滤波、中值滤波、双边滤波。 高斯滤波&#xff1a; blur_gray cv2.GaussianBlur(orgGray, (kernel_size, kernel_size), 0) orgGray&#xff1a;灰度图像&#xf…

Amazon云计算AWS之[2]弹性计算云EC2

文章目录 说明EC2基本架构Amazon机器映象&#xff08;AMI&#xff09;实例&#xff08;Instance&#xff09;弹性块存储&#xff08;EBS&#xff09; EC2关键技术地理区域和可用区域EC2通信机制弹性负载均衡监控服务自动缩放服务管理控制台 EC2安全及容错机制EC2弹性IP地址 说明…

STM32 HAL库F103系列之IIC实验

IIC总线协议 IIC总线协议介绍 IIC&#xff1a;Inter Integrated Circuit&#xff0c;集成电路总线&#xff0c;是一种同步 串行 半双工通信总线。 总线就是传输数据通道 协议就是传输数据的规则 IIC总线结构图 ① 由时钟线SCL和数据线SDA组成&#xff0c;并且都接上拉电阻…

线性代数基础3 行列式

行列式 行列式其实在机器学习中用的并不多&#xff0c;一个矩阵必须是方阵&#xff0c;才能计算它的行列式 行列式是把矩阵变成一个标量 import numpy as np A np.array([[1,3],[2,5]]) display(A) print(矩阵A的行列式是&#xff1a;\n,np.linalg.det(A))array([[1, 3],[2, …

【C++打怪之路Lv3】-- 类和对象(上)

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

C++链表操作入门

数据结构基础&#xff1a;链表操作入门 数据结构基础&#xff1a;链表操作入门链表的基本概念链表的基本操作输出链表插入节点删除节点查找值 完整的链表操作示例结语 数据结构基础&#xff1a;链表操作入门 在计算机科学中&#xff0c;数据结构是组织和存储数据的方式&#x…

论文解读:(CAVPT)Dual Modality Prompt Tuning for Vision-Language Pre-Trained Model

v1文章名字&#xff1a;Dual Modality Prompt Tuning for Vision-Language Pre-Trained Model v2文章名字&#xff1a;Class-Aware Visual Prompt Tuning for Vision-Language Pre-Trained Model 文章汇总 对该文的改进&#xff1a;论文解读&#xff1a;(VPT)Visual Prompt …

ClickHouse 数据类型、表引擎与TTL

文章目录 数据类型注意事项 表引擎1.TinyLog 引擎2.MergeTree 引擎3.ReplacingMergeTree 引擎4.AggregatingMergeTree 引擎5.SummingMergeTree 引擎6.CollapsingMergeTree 引擎7.Distributed 引擎 TTL列级 TTL表级TTL 数据类型 ClickHouse 数据类型Java 数据类型数据范围UInt8…

在控制台实现贪吃蛇

在控制台实现贪吃蛇 前备知识Win32APICOORD这个结构体的声明如下&#xff1a;GetStdHandle 函数GetConsoleCursorInfo 函数SetConsoleCursorInfo 函数 SetConsoleCursorPosition 函数getAsyncKeyState 函数 控制台窗口的大小以及字符打印介绍控制台中的坐标宽字符及本地化介绍s…

使用 Gradio 的“热重载”模式快速开发 AI 应用

在这篇文章中&#xff0c;我将展示如何利用 Gradio 的热重载模式快速构建一个功能齐全的 AI 应用。但在进入正题之前&#xff0c;让我们先了解一下什么是重载模式以及 Gradio 为什么要采用自定义的自动重载逻辑。如果你已熟悉 Gradio 并急于开始构建&#xff0c;请直接跳转到第…

UE4 拍摄、保存并浏览相册

效果&#xff1a; 1.新建CameraActor类 2.修改截图保存路径 3.编写BP_Camera蓝图 注意路径 Save Image函数要在执行拍照和BeginPlay事件执行一次 按钮执行拍摄事件 3.编写UMG蓝图 技巧&#xff1a;让Index加1、减1循环赋值 4.把BP_Camera挂在玩家上

SVN--基本原理与使用(超详细)

目录 一、SVN概述二、SVN服务端软件安装三、SVN服务端配置四、SVN客户端软件安装与使用五、SVN三大指令六、SVN图标集与忽略功能6.1 图标集6.2 忽略功能 七、SVN版本回退八、SVN版本冲突九、SVN配置多仓库与权限控制9.1 配置多仓库9.2 权限控制 十、服务配置与管理十一、模拟真…

新建云仓库

1.GitHub新建云仓库&#xff1a; LICENSE:开源许可证&#xff1b;README.md:仓库说明文件&#xff1b;开源项目&#xff1b;cocoaPodsName.podspec: CocoaPods项目的属性描述文件。 2.Coding新建云仓库&#xff1a; 备注&#xff1a; Coding新建项目&#xff1a;

每日一题(力扣45):跳跃游戏2--贪心

由于题目已经告诉了我们一定可以跳到&#xff0c;所以我们只需去考虑前进最快的方法。即 判断当前下一步能跳的各个位置中&#xff0c;哪个能带你去去向最远的地方&#xff08;why&#xff1f; 因为其他位置所能提供的最大范围都没最远那个大&#xff0c;所以最远的那个已经可以…

The Log-Structured Merge-Tree (LSM-Tree) 论文阅读笔记

原论文&#xff1a;The Log-Structured Merge-Tree (LSM-Tree) LSM-Tree的简介和关键技术要点 LSM-Tree&#xff08;Log-Structured Merge-Tree&#xff09;是一种为高吞吐量读写操作优化的数据结构&#xff0c;特别适用于写入密集型的应用场景。它由Patrick O’Neil等人开发…