偷拍哪个网站做的好/优化大师电脑版官方
为了敲键盘及时响应,需要用到ncurse
测试代码: ncurse1.c
/* ncurse1.c */
#include <curses.h> //ncurse的头文件。int main()
{char c;int i = 0;//ncurse界面的初始化函数。initscr(); for(i=0;i<=2;i++){c = getch();printw("\n");//ncurse下的打印函数。printw("Input: %c\n",c); }//等待用户的输入,没有该函数程序会直接退出,看不到printw()的结果。getch(); //调用程序退出函数,恢复shell终端的显示,没有该函数终端可能会乱码。 endwin(); return 0;
}
//输入指令测试 gcc ncurse1.c -lcurses
游戏的规划实现步骤
- Ncurse 函数初始化
- 边框图像设置 (for循环)
- 贪吃蛇身子节点 (结构体:行,列,下一个节点)
- 第一个节点 (静态设置)
- 设的整的身子 (静态设置)
- 改进 4,5蛇身子的问题, (采用结构体指针指向下一个,尾插法的方式)
- 蛇身子向右移动 move(0,0)光标界面不乱,通过按键key来向右行驶, 尾部加节点,注意必须要释放头节点来达到平衡。
- 贪吃蛇撞壁
- 主动向右行驶,不需要按键key ,边框图像然后refresh()刷新界面。
- 方向键控制蛇变化 , key按键与dir配合,如果key向下,dir就变化,并switch选择增加往那个方向加节点。
- 主函数采用linux两个线程,(按键与自动)同时移动,并且都不退出。
- 贪吃蛇随机位置的设定。
- 咬死自己。
代码:
#include <curses.h>
#include <stdlib.h>#define UP 1
#define DOWN -1
#define LEFT 2
#define RIGHT -2struct Snake
{int row;int line;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.row = x;food.line = y;
}void initNcurse()//初始化curses图形库
{initscr();keypad(stdscr,1);//使用keypad可以在stdscr中接受键盘的功能键noecho();//对于输出的功能键的值不做出回应,以免界面溢出
}int hasSnakeNode(int i,int j)//传参:行号,列号
{struct Snake* p;p = head;while(p != NULL){if(p->row==i && p->line==j){return 1;//gamePic中打印一个节点"[]"}p=p->next;}return 0;
}int hasFood(int i,int j)//打印食物
{if(food.row==i && food.line==j){return 1;}return 0;
}void gamePic()//打印图形界面
{int row;int line;move(0,0);for(row=0;row<20;row++){//第0行为20个"--"if(row==0){for(line=0;line<20;line++){printw("--");}printw("\n");}//第0-19行为左右两边一个"|",中间21个" "(空格)为了对齐第一行if(row>=0 && row<=19){//一共打印20行for(line=0;line<=20;line++){if(line==0 || line==20){printw("|");//打印两边}else if(hasSnakeNode(row,line)){printw("[]");//打印蛇的身体}else if(hasFood(row,line)){printw("##");//打印食物}else{printw(" ");//打印中间}}printw("\n");}//打印第19行,与第一行一样if(row==19){for(line=0;line<20;line++){printw("--");}printw("\n");printw("by Andy,key = %d\n",key);//打印作者名字以及方向键的值}}
}void addNode()//加节点
{struct Snake* new = (struct Snake*)malloc(sizeof(struct Snake));//开辟新节点空间new->next = NULL;switch(dir){//根据用户按的功能键的方向来决定如何添加一个节点case UP://列不变,行减一的位置添加new->row = tail->row - 1;new->line = tail->line;break;case DOWN:new->row = tail->row + 1;new->line = tail->line;break;case LEFT:new->row = tail->row;new->line = tail->line - 1;break;case RIGHT:new->row = tail->row;new->line = tail->line + 1;break;}tail->next = new;tail = new;//新节点变成尾部
}void deleteNode()//删除节点
{struct Snake* p;p = head;head = head->next;free(p);
}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->row = 1;//第一行head->line = 1;//第一列head->next = NULL;//防止野指针tail = head;//头插法addNode();//加4个节点addNode();addNode();addNode();
}int ifSnakeDie()//蛇死亡的条件
{struct Snake* p;p = head;if(tail->row < 0 || tail->line == 0 || tail->row == 20 || tail->line == 20){//四个边界return 1;}while(p->next != NULL){if(p->row == tail->row && p->line == tail->line){//头咬到尾巴return 1;}p = p->next;}return 0;
}void moveSnake()//蛇的移动
{addNode();if(hasFood(tail->row,tail->line)){initFood();}else{deleteNode();}if(ifSnakeDie()){initSnake();}
}void* refreshBox()//刷新界面
{while(1){moveSnake();//蛇移动gamePic();//重新打印界面refresh();//刷新覆盖原界面usleep(100000);//0.1s}
}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()
{initNcurse();//第一步:搭建curses环境initSnake();//第三步:打印蛇的身体gamePic();//第二步:打印图形界面pthread_t th1;//线程1pthread_t th2;//线程2pthread_create(&th1,NULL,refreshBox,NULL);//运行线程1:不断刷新界面pthread_create(&th2,NULL,changeDir,NULL);//运行线程2:不断改变方向while(1);//让线程一直进行getch();//让程序一直重复输入功能键还能执行endwin();//curses函数return 0;
}
还需要不断改进。。。。。。
相关文章:

C语言 基于Ncurse库的贪吃蛇游戏项目
为了敲键盘及时响应,需要用到ncurse 测试代码: ncurse1.c /* ncurse1.c */ #include <curses.h> //ncurse的头文件。int main() {char c;int i 0;//ncurse界面的初始化函数。initscr(); for(i0;i<2;i){c getch();printw("\n");//…...

【Java基础】Java语言特性
认识Java java语言的执行过程 编写纯文本文件 .java 经过javac编译器(java complier)编译 .class .class是二进制的字节码 在源文件中定义几个类,就会生成几个 由JVM运行 .class JVM把字节码编译成可以在处理器上运行的高性能的本地代码(native code),…...

python进阶--Numyp库(一)
一、Numpy库介绍 NumPy(Numerical Python)是Python的⼀种开源的数值计算扩展。提供多维数组对象,各种派⽣对象(如掩码数组和矩阵),这种⼯具可⽤来存储和处理⼤型矩阵,⽐Python⾃身的嵌套列表&am…...

CV学习笔记-Inception
CV学习笔记-Inception 目录 文章目录CV学习笔记-Inception目录1. 常见的卷积神经网络2. Inception(1) Inception提出背景(2) Inception module 核心思想3. Inception的历史版本(1) InceptionV1-GoogleNet(2) InceptionV2(3) InceptionV3(4) Inception V44. Inception模型的特点…...

注意力机制笔记——结合沐神和B站老弓up主
B站【大白话浅谈【注意力机制】】 聚类 是针对 样本, 注意力机制是针对样本相关性,来进行计算的 自注意力机制 指的是 query ,key,value都是同一个部分。 可以学到 类似的 短语 ,和 语义特征。如its 指代的对象。 评论区大佬 根据这篇论文《Effective Approaches to…...

建议收藏,轻松搞懂区块链
未来已来,只是不均衡地分布在当下 大家好,我是菜农,欢迎来到我的频道。 本文共 5844字,预计阅读 30 分钟 区块链是近些年来最热门的前沿技术,被认为是未来十几年对金融、物联网、医疗等诸多领域产生最大影响的"…...

php设计一个新春祝福墙
记得十几年前的时候,每到春节,各大网站都会建一个祝福墙,上面挂满网友的新年寄语。这些年随着移动互联网的高速发展,web的新春祝福墙越来越少了。今天,咱们就来考考古,用快速原型法进行设计。原型设计采用M…...

KubeSphere 社区双周报 | OpenFunction 集成 WasmEdge | 2023.02.03-02.16
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2023.02.03-2023.…...

数字IC/FPGA 秋招知识点不全面整理
1. 引言 这篇文章的由来 秋招的时候,刚开始复习一些知识点的时候没有什么思路,只是盲目的看相关的书籍和资料,结果是留在脑子中的知识很有限,而且不够系统,在我需要它的时候,并不能很快的回忆起来。 于是就想着把一些典型的知识整理成一个文档,在进行刷题的时候可以比…...

你知道java8是如何排序Map嘛?
在Java中,有多种方法可以对Map进行排序,但是我们将重点介绍Java 8 Stream,这是实现目标的一种非常优雅的方法。 学习一下HashMap的merge()函数 在学习Map排序之前,有必要讲一下HashMap的merge()函数,该函数应用场景就…...

【李忍考研传】一、李忍
“老师,我来回答!” “非常好,我记得你是叫……呃……是李念同学吗?” “不,老师,我叫李忍。” “好,你来回答一下这个问题。” “这题用海明码校验的知识,能检错一位纠错一位&a…...

测牛学堂:软件测试python深入之类和对象的属性和方法总结
类对象和实例对象 类对象就是我们定义的类。 在代码执行的时候,解释器会自动创建类对象。 类对象的作用: 1 使用类对象创建实例对象 2 存储类的一些特性,就是类里面定义的属性 创建对象的过程也称为实例化的对象。所以,类创建的对…...

css实例--新闻页面
实现效果 实现代码 html代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" co…...

SpringCloudGateway 动态转发后端服务
API网关的核心功能是统一流量入口,实现路由转发,SpringCloudGateway是API网关开发的技术之一,此外比较流行的还有Kong和ApiSix,这2个都是基于OpenResty技术栈。 简单的路由转发可以通过SpringCloudGateway的配置文件实现…...

使用canvas写一个flappy bird小游戏
简介 canvas 是HTML5 提供的一种新标签,它可以支持 JavaScript 在上面绘画,控制每一个像素,它经常被用来制作小游戏,接下来我将用它来模仿制作一款叫flappy bird的小游戏。flappy bird(中文名:笨鸟先飞&am…...

KVM-2、虚拟化基础
1. 虚拟化概念 什么是虚拟化 **虚拟化是使用所谓虚拟机管理程序从一台物理机上创建若干个虚拟机的过程。**虚拟机的行为和运转方式与物理机一样,但它们会使用物理机的计算资源,如 CPU 、内存和存储。虚拟机管理程序会根据需要将这些计算资源分配给每个虚拟机。 虚拟化有哪…...

设计模式之观察者模式与访问者模式详解和应用
目录1.访问者模式详解1.1 访问者模式的定义1.1.1 访问者模式在生活中的体现1.1.2 访问者模式的适用场景1.2 访问者模式的通用实现1.3 访问者模式的使用案例之KPI考核1.3.1 类图设计1.3.2 代码实现1.4 访问者模式扩展---分派1.4.1 java中静态分派示例代码1.4.2 java中动态分派1.…...

spring注解方式整合Dubbo源码解析
系列文章目录 前言 本节我们的Dubbo源码版本基于2.6.x 在前一章我们的整合案例中,我们有几个比较关键的步骤: 在启动类上标注了EnableDubbo注解在provider类上面标注了Service注解来提供dubbo服务在消费的时候通过Reference注解引入dubbo服务在配置文件…...

大数值金额大写转换(C语言)
关于大数值金额大写转换,在财务管理的应用方面没什么意义。一般来说,千亿级,万亿级的数值就够了。因为在国家级层面是以亿为单位的,也就表达为千万亿,万万亿。在企业层面数值金额转换设置到千亿、万亿就行了。大的集团…...

迷宫问题图解 : 基于骨架提取、四邻域
目录 1. 迷宫的连通域 2. How to remove branch ? 3. 基于4邻域的 remove 分支 3.1 找到分支的端点 3.2 4邻域的 remove 分支 3.3 循环移除分支 3.4 code 4. 迷宫路线 4.1 预处理 4.2 提取骨架 4.3 分支的端点 4.4 去除分支的端点 4.5 循环去除分支 4…...

设计模式 - 如何在库和主程序之间互相调用数据和函数
背景:在项目开发过程中,难免碰到这种情况,当我们想要通过我们开发的库,调用主程序中的一些变量或者函数的时候,就会导致一些问题,因为在项目构建过程中,库都是不依赖于主程序编译的,…...

Redis面试题:1~2亿条数据需要缓存,请问如何设计这个存储案例
目录 前言 一、哈希取余分区 优点 缺点 二、一致性哈希算法分区 背景 步骤 ① 算法构建一致性哈希环 ② 服务器IP节点映射 ③ key落到服务器的落键规则 优点 ① 容错性 ② 扩展性 缺点 三、哈希槽分区 前言 单机单台100%不可能,肯定是分布式存储&am…...

程序员必备的软技能-《如何阅读一本书》
阅读很重要,我们真的会阅读吗? 这本书的初版是 1940年,时隔 80年,其内容仍然不过时。第一次读这本书时,给我最大的影响就是主题阅读,每次学习一个新理论、技术,都入手多本关于这项理论、技术的书…...

Java数据结构-栈、队列常用类(Stack、ArrayDeque、LinkedLList)
数据结构的三要素包括:逻辑结构、存储结构、数据的运算。逻辑结构描述的是数据之间的逻辑关系,分为线性结构(线性表(数组、链表)、栈、队列)和非线性结构(图、树、集合)。物理结构也…...

拯救了大批爬虫程序员,因为一个简单的神器
相信大家应该都写过爬虫,简单的爬虫只需要使用 requests 即可。遇到复杂的爬虫,就需要在程序里面加上请求头和参数信息。类似这种:我们一般的步骤是,先到浏览器的网络请求中找到我们需要的请求,然后将请求头和参数信息…...

2023年美赛C题Wordle预测问题三、四建模及Python代码详细讲解
更新时间:2023-2-19 16:30 相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详细讲解 (3)2023年美赛C题Wordle预测问题三、四建模…...

相关性-回忆录(持续更新)
1.TODO方向 (1)数据增强:finetuning阶段需要大量人工标注样本,消耗时间和成本。用户点击数据作为弱监督学习,可以尝试图网络构建节点和边(query聚合); 使用展现未点击生成对抗网络进…...

(必备技能)使用Python实现屏幕截图
(必备技能)使用Python实现屏幕截图 文章目录 (必备技能)使用Python实现屏幕截图 一、序言二、环境配置 1、下载pyautogui包2、下载opencv-python包3、下载PyQt5包4、下载pypiwin32包 三、屏幕截屏源码与解析 1、使用pyautogui方法实现截屏2、使用PyQt方法实现截屏 a.获取窗口…...

「数据仓库」怎么选择现代数据仓库?
构建自己的数据仓库时要考虑的基本因素我们用过很多数据仓库。当我们的客户问我们,对于他们成长中的公司来说,最好的数据仓库是什么时,我们会根据他们的具体需求来考虑答案。通常,他们需要几乎实时的数据,价格低廉&…...