基于Linux的Flappy bird游戏开发
项目介绍
主要是使用C语言实现,开启C项目之旅。
复习巩固C语言、培养做项目的思维。
功能:
按下空格键小鸟上升,不按下落;
显示小鸟需要穿过的管道;
小鸟自动向右飞行;(管道自动左移和创建)
小鸟与管道碰到游戏结束
知识储备:
C语言
数据机构--链表
Ncurses库(工具)
信号机制(工具)
项目逻辑:
如何显示游戏界面?
如何实现空格键控制小鸟上升?
Ncurses库
解决上述问题
其中vim界面就是使用Ncurses库来实现的
此项目一共使用14个函数来实现
注:
安装命令:sudo apt-get install libncurses5-dev
为了能够使用Ncurses库,必须在源程序中将#include<curses.h>包括进来,而且在编译的需要与它链接起来.
在gcc中可以使用参数-lncurses进行编译.
1. initscr(void);
是curses模式的入口。将终端屏幕初始化为curses模式,为当前屏幕和相关的数据结构分配内存。
2. int endwin(void);
是curses模式的出口,退出curses模式,释放curses子系统和相关数据结构占用的内存。
3. int curs_set(int visibility);
设置光标是否可见,visibility:0(不可见),1(可见)
4. int move(int new_y, int new_x);
将光标移动到new_y所指定的行和new_x所指定的列
5. int addch(const chtype char);
在当前光标位置添加字符
6. int refresh(void);
刷新物理屏幕。将获取的内容显示到显示器上。
7. int keypad(WINDOW *window_ptr, bool key_on);
允许使用功能键。exp:keypad(stdscr,1);//允许使用功能按键
8. int getch(void);
读取键盘输入的一个字符
9. chtype inch(void);
获取当前光标位置的字符。
注:curses有自己的字符类型chtype,使用时强制类型转换为char
10. int start_color(void);
启动color机制,初始化当前终端支持的所有颜色
11. int init_pair(short pair_number, short foreground, short background);
配置颜色对
COLOR_BLACK 黑色 COLOR_MAGENTA 品红色
COLOR_RED 红色 COLOR_CYAN 青色
COLOR_GREEN 绿色 COLOR_WHITE 白色
COLOR_YELLOW 黄色 COLOR_BLUE 蓝色
12. int COLOR_PAIR(int pair_number);
设置颜色属性,设置完颜色对,可以通过COLOR_PAIR实现
13. int attron(chtype attribute);
启用属性设置
14. int attroff(chtype attribute);
关闭属性设置
#include <stdio.h>
#include <curses.h>
int main(int argc, const char *argv[])
{char ch;initscr();//进入curses模式curs_set(0);noecho();//禁止字符显示keypad(stdscr,1);//允许使用功能键start_color();//启动颜色机制init_pair(1,COLOR_WHITE, COLOR_RED);init_pair(2,COLOR_GREEN,COLOR_WHITE);ch = getch();if(ch == 'Q'){attron(COLOR_PAIR(1));move(10,10);addch('A');refresh();attroff(COLOR_PAIR(1));}move(10,10);ch = (char)inch();if(ch == 'A'){attron(COLOR_PAIR(2));move(10,11);addch('B');refresh(); attroff(COLOR_PAIR(2));}while(1);endwin();//退出curses模式return 0;
}
然后,在屏幕上10行10列显示C,接着按Q显示AB和D
#include <stdio.h>
#include <curses.h>
int main(int argc, const char *argv[])
{char ch;initscr();//进入curses模式curs_set(0);noecho();//禁止字符显示keypad(stdscr,1);//允许使用功能键start_color();//启动颜色机制init_pair(1,COLOR_WHITE, COLOR_RED);init_pair(2,COLOR_GREEN,COLOR_WHITE);move(5,5);addch('C');refresh();ch = getch();if(ch == 'Q'){attron(COLOR_PAIR(1));move(10,10);addch('A');refresh();attroff(COLOR_PAIR(1));}move(10,10);ch = (char)inch();if(ch == 'A'){attron(COLOR_PAIR(2));move(10,11);addch('B');refresh(); attroff(COLOR_PAIR(2));}move(15,15);addch('D');refresh();while(1);endwin();//退出curses模式return 0;
}
信号机制
getch()阻塞获取键盘按键输入,怎么操作才能不影响小鸟下落和管道移动?
使用信号机制,将小鸟下落和管道移动放到信号处理函数中。
下图为信号的检测和处理流程图
信号设置的函数
#include <unistd.h>
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
成功时返回原先的信号处理函数,失败时返回SIG_ERR
Ø signum:指明了所要处理的信号类型Ø handler:描述了与信号关联的动作SIG_DFL代表缺省方式; SIG_IGN 代表忽略信号;
示例:
// 头文件省略
void handler (int signo) {
printf(“HELLO!\n”);
}
int main() {
signal(SIGINT, handler);
while ( 1 ) ;
sleep(5);
return 0;
}
在5秒内若按下Ctrl+C,会打印HELLO,接着退出程序
设置定时器
struct itimerval {
struct timeval it_interval; /* 计时器重新启动的间歇值 */
struct timeval it_value; /* 计时器安装后首次启动的初
}; 始值,之后就没有用 */struct timeval {
long tv_sec; /* 秒 */
long tv_usec; /* 微妙*/
};
int setitimer(int which, const struct itimerval *value,
struct itimerval *ovalue)参数:
which:间歇计时器类型,
ITIMER_REAL //数值为0,发送的信号是SIGALRM。
struct itimerval *value:将value指向的结构体设为计时器的当前值,
struct itimerval *ovalue:保存计时器原有值。一般设置为NULL。返回值: 成功返回0。失败返回-1。
每一秒都显示一次B,按一次Q显示一次A ,并且A和B移动一下
#include <stdio.h>
#include <curses.h>
#include <signal.h>
#include <sys/time.h>int x=10,y=10;
int a=5,b=10;
void handler(int sig)
{move(a,b);addch('B');refresh();b++;}
int main(int argc, const char *argv[])
{char ch;initscr();//进入curses模式curs_set(0);noecho();//禁止字符显示keypad(stdscr,1);//允许使用功能键start_color();//启动颜色机制init_pair(1,COLOR_WHITE, COLOR_RED);init_pair(2,COLOR_GREEN,COLOR_WHITE);signal(SIGALRM, handler);/*设置定时时间*/struct itimerval timer;timer.it_value.tv_sec = 3;//首次启动定时时间timer.it_value.tv_usec = 0;timer.it_interval.tv_sec = 1;//之后每次的定时时间timer.it_interval.tv_usec = 0;/*启动定时*/setitimer(ITIMER_REAL, &timer, NULL);while(1){ch = getch();if(ch == 'Q'){attron(COLOR_PAIR(1));move(x,y);addch('A');refresh();y++;attroff(COLOR_PAIR(1));}}while(1);endwin();//退出curses模式return 0;
}
项目编程
小鸟飞起来
1、curses库初始化
void init_curses()//curses库初始化
{initscr();//进入curses模式curs_set(0);//禁止光标显示noecho();//禁止输入字符显示keypad(stdscr,1);//启动功能按键start_color();//启动颜色机制init_pair(1,COLOR_WHITE, COLOR_RED);//小鸟颜色设置init_pair(2,COLOR_WHITE, COLOR_GREEN);//管道颜色设置
}
2、设置定时时间
int set_timer(int ms_t)//设置定时器--ms
{struct itimerval timer;long t_sec,t_usec;int ret;t_sec = ms_t / 1000; //st_usec = (ms_t % 1000) * 1000;//ustimer.it_value.tv_sec = t_sec;timer.it_value.tv_usec = t_usec;//首次启动定时值timer.it_interval.tv_sec = t_sec;timer.it_interval.tv_usec = t_usec;//定时时间间隔ret = setitimer(ITIMER_REAL, &timer, NULL);return ret;}
3、小鸟功能
void show_bird()//显示小鸟
{attron(COLOR_PAIR(1));move(bird_y,bird_x);addch(BIRD);refresh();attroff(COLOR_PAIR(1));
}
void clear_bird()//清除小鸟
{move(bird_y,bird_x);addch(BLANK);refresh();
}
void move_bird()//移动小鸟
{char key;while(1){key = getch();if(key == ' '){clear_bird();bird_y--;show_bird();}}
}
小鸟自动下落,使用信号处理函数
管道动起来
/*定义关于管道的结构体*/
typedef struct Pipe{
int x;//列坐标
int y;//横坐标
struct Pipe *next;
}Pipe_node, *Pipe_list;Pipe_list head, tail;
1.创建链表
void creat_list()//创建链表
{int i;Pipe_list p, new;head = (Pipe_list)malloc(sizeof(Pipe_node));head->next = NULL;p = head;for(i = 0; i < 5; i++){new = (Pipe_list)malloc(sizeof(Pipe_node));new->x = (i + 1) * 20;//实现每隔20列创建一个管道节点new->y = rand() % 11 + 5; // 管道长度限制在(5-15行)之间,注意要添加随机种子srand(time(0))new->next = NULL;p->next = new;p = new;}tail = p;
}
2.显示管道
void show_pipe()//显示管道
{Pipe_list p;int i,j;p = head->next;attron(COLOR_PAIR(2));while(p){for(i = p->x; i < p->x+10; i++){/*上半部分管道*/for(j=0; j<p->y; j++){move(j,i);addch(PIPE);}/*下半部分管道创建*/for(j = p->y+5; j < 25; j++){move(j,i);addch(PIPE);}}refresh();p = p->next;}attroff(COLOR_PAIR(2));
}
3.清除管道
只需将2的PIPE代替为BLANK
void clear_pipe()//清除管道
{Pipe_list p;int i,j;p = head->next;while(p){for(i = p->x; i < p->x+10; i++){/*上半部分管道*/for(j=0; j<p->y; j++){move(j,i);addch(BLANK);}/*下半部分管道创建*/for(j = p->y+5; j < 25; j++){move(j,i);addch(BLANK);}}refresh();p = p->next;}}
4.移动管道
void move_pipe()//移动管道
{Pipe_list p;p = head->next;while(p){p->x--;p = p->next;}}
都放到信号处理函数中实现
void handler(int sig)
{Pipe_list p, new;int i,j;/*小鸟下落*/clear_bird();bird_y++;show_bird();/*管道移动*/clear_pipe();move_pipe();show_pipe();
}
目前有两个BUG:1、小鸟碰到管道没有结束游戏,2、最下方不停的有+生成;3、只创建了5组管道
1.判断游戏结束:小鸟与管道碰到
2.循环创建管道
3.为管道和小鸟添加色彩
1、小鸟上升,碰到管道结束游戏
2、小鸟下降,碰到管道结束游戏
此时,实现功能1.判断游戏结束:小鸟与管道碰到
3、循环创建管道
判断第一组管道是否移动到第0列,如果是就清空第一组管道,同时释放第一组管道的节点空间;
紧接着创建一个新的节点,并把此节点添加到链表中
3.为管道和小鸟添加色彩
void init_curses()//curses库初始化
{initscr();//进入curses模式curs_set(0);//禁止光标显示noecho();//禁止输入字符显示keypad(stdscr,1);//启动功能按键start_color();//启动颜色机制init_pair(1,COLOR_WHITE, COLOR_RED);//小鸟颜色设置init_pair(2,COLOR_WHITE, COLOR_GREEN);//管道颜色设置
}
void show_bird()//显示小鸟
{attron(COLOR_PAIR(1));move(bird_y,bird_x);addch(BIRD);refresh();attroff(COLOR_PAIR(1));
}
void show_pipe()//显示管道
{Pipe_list p;int i,j;p = head->next;attron(COLOR_PAIR(2));while(p){for(i = p->x; i < p->x+10; i++){/*上半部分管道*/for(j=0; j<p->y; j++){move(j,i);addch(PIPE);}/*下半部分管道创建*/for(j = p->y+5; j < 25; j++){move(j,i);addch(PIPE);}}refresh();p = p->next;}attroff(COLOR_PAIR(2));
}
代码总结
#include <stdio.h>
#include <curses.h>
#include <signal.h>
#include <sys/time.h>
#include <stdlib.h>
#define BIRD '@'
#define BLANK ' '
#define PIPE '+'
/*定义关于管道的结构体*/
typedef struct Pipe{int x;//列坐标int y;//横坐标struct Pipe *next;
}Pipe_node, *Pipe_list;Pipe_list head, tail;void creat_list();//创建链表
void show_pipe();//显示管道
void clear_pipe();//清除管道
void move_pipe();//移动管道int bird_y, bird_x;//小鸟坐标void show_bird();//显示小鸟
void clear_bird();//清除小鸟
void move_bird();//移动小鸟void init_curses();//curses库初始化
int set_timer(int ms_t);//设置定时器--ms
void handler(int sig);//信号处理函数int main(int argc, const char *argv[])
{bird_y = 15;//行bird_x = 10;//列init_curses();signal(SIGALRM, handler);set_timer(500);//500mssrand(time(0));//随机种子creat_list();show_pipe();show_bird();move_bird();return 0;
}
void init_curses()//curses库初始化
{initscr();//进入curses模式curs_set(0);//禁止光标显示noecho();//禁止输入字符显示keypad(stdscr,1);//启动功能按键start_color();//启动颜色机制init_pair(1,COLOR_WHITE, COLOR_RED);//小鸟颜色设置init_pair(2,COLOR_WHITE, COLOR_GREEN);//管道颜色设置
}
int set_timer(int ms_t)//设置定时器--ms
{struct itimerval timer;long t_sec,t_usec;int ret;t_sec = ms_t / 1000; //st_usec = (ms_t % 1000) * 1000;//ustimer.it_value.tv_sec = t_sec;timer.it_value.tv_usec = t_usec;//首次启动定时值timer.it_interval.tv_sec = t_sec;timer.it_interval.tv_usec = t_usec;//定时时间间隔ret = setitimer(ITIMER_REAL, &timer, NULL);return ret;}
void handler(int sig)
{Pipe_list p, new;int i,j;/*小鸟下落*/clear_bird();bird_y++;show_bird();/*游戏结束判断*/if((char)inch() == PIPE){set_timer(0);endwin();exit(1);}p = head->next;if(p->x == 0){head->next = p->next;for(i = p->x; i < p->x+10; i++){/*上半部分管道*/for(j=0; j<p->y; j++){move(j,i);addch(BLANK);}/*下半部分管道创建*/for(j = p->y+5; j < 25; j++){move(j,i);addch(BLANK);}refresh();}free(p);new = (Pipe_list)malloc(sizeof(Pipe_node));new->x = tail->x + 20;new->y = rand() % 11 + 5;new->next = NULL;tail->next = new;tail = new;}/*管道移动*/clear_pipe();move_pipe();show_pipe();
}
void show_bird()//显示小鸟
{attron(COLOR_PAIR(1));move(bird_y,bird_x);addch(BIRD);refresh();attroff(COLOR_PAIR(1));
}
void clear_bird()//清除小鸟
{move(bird_y,bird_x);addch(BLANK);refresh();
}
void move_bird()//移动小鸟
{char key;while(1){key = getch();if(key == ' '){clear_bird();bird_y--;show_bird();/*游戏结束判断*/if((char)inch() == PIPE){set_timer(0);endwin();exit(1);}}}
}
void creat_list()//创建链表
{int i;Pipe_list p, new;head = (Pipe_list)malloc(sizeof(Pipe_node));head->next = NULL;p = head;for(i = 0; i < 5; i++){new = (Pipe_list)malloc(sizeof(Pipe_node));new->x = (i + 1) * 20;new->y = rand() % 11 + 5; // (5-15行)new->next = NULL;p->next = new;p = new;}tail = p;
}
void show_pipe()//显示管道
{Pipe_list p;int i,j;p = head->next;attron(COLOR_PAIR(2));while(p){for(i = p->x; i < p->x+10; i++){/*上半部分管道*/for(j=0; j<p->y; j++){move(j,i);addch(PIPE);}/*下半部分管道创建*/for(j = p->y+5; j < 25; j++){move(j,i);addch(PIPE);}}refresh();p = p->next;}attroff(COLOR_PAIR(2));
}
void clear_pipe()//清除管道
{Pipe_list p;int i,j;p = head->next;while(p){for(i = p->x; i < p->x+10; i++){/*上半部分管道*/for(j=0; j<p->y; j++){move(j,i);addch(BLANK);}/*下半部分管道创建*/for(j = p->y+5; j < 25; j++){move(j,i);addch(BLANK);}}refresh();p = p->next;}}
void move_pipe()//移动管道
{Pipe_list p;p = head->next;while(p){p->x--;p = p->next;}}
指定的信号处理函数代表捕捉方式
相关文章:
基于Linux的Flappy bird游戏开发
项目介绍 主要是使用C语言实现,开启C项目之旅。 复习巩固C语言、培养做项目的思维。 功能: 按下空格键小鸟上升,不按下落; 显示小鸟需要穿过的管道; 小鸟自动向右飞行;(管道自动左移和创建&a…...
排序算法6---快速排序(非递归)(C)
回顾递归的快速排序,都是先找到key中间值,然后递归左区间,右区间。 那么是否可以实现非递归的快排呢?答案是对的,这里需要借助数据结构的栈。将右区间左区间压栈(后进先出),然后取出…...
【Verilog】期末复习——设计带异步清零且高电平有效的4位循环移位寄存器
系列文章 数值(整数,实数,字符串)与数据类型(wire、reg、mem、parameter) 运算符 数据流建模 行为级建模 结构化建模 组合电路的设计和时序电路的设计 有限状态机的定义和分类 期末复习——数字逻辑电路分…...
银行网络安全实战对抗体系建设实践
文章目录 前言一、传统攻防演练面临的瓶颈与挑战(一)银行成熟的网络安全防护体系1、缺少金融特色的演练场景设计2、资产测绘手段与防护体系不适配3、效果评价体系缺少演练过程维度相关指标 二、实战对抗体系建设的创新实践(一)建立…...
SwiftUI之深入解析Alignment Guides的超实用实战教程
一、Alignment Guide 简介 Alignment guides 是一个强大的布局工具,但通常未被充分利用。在很多情况下,它们可以帮助我们避免更复杂的选项,比如锚点偏好。如下所示,对对齐的更改也可以自动(并且容易地)动画…...
java获取视频文件的编解码器
java获取视频文件的编解码器 引入jar包: <dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.9</version></dependency>测试类 package com.jd.brand.approve.…...
动态规划Day06(完全背包)
完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…...
selenium之框架之窗口
...
华为OD机试 - 最小矩阵宽度(Java JS Python C)
题目描述 给定一个矩阵,包含 N * M 个整数,和一个包含 K 个整数的数组。 现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数。 输入描述 第一行输入两个正整数 N,M,表示矩阵大小。 接下来 N 行 M 列表示矩阵内容。 下一行包含一个正整数 K…...
嵌入式linux_C应用学习之API函数
1.文件IO 1.1 open打开文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);pathname:字符串类型,用于标…...
【ubuntu】docker中如何ping其他ip或外网
docker中如何ping其他ip或外网 示例图: 运行下面命令: docker run -it --namehei busybox看情况需要加权限 sudo,即: sudo docker run -it --namehei busyboxping 外网 ping -c 4 www.baidu.comping 内网 ping -c 4 192.168.…...
【Vue3+Ts项目】硅谷甄选 — 品牌管理+平台属性管理+SPU管理+SKU管理
一、品牌管理模块 1.1 静态模块搭建 使用到element-plus的card、button、table、pagination等组件:src/views/product/trademark/index.vue <template><el-card><!-- 卡片顶部添加品牌按钮 --><el-button type"primary" size&quo…...
计算机图形学流体模拟 blender 渲染脚本
做流体模拟的时候,想要复现别人的成果,但是别人的代码都是每帧输出 ply 格式的文件,渲染部分需要自己完成 看了一下,似乎用 blender 是最简单的,于是记录一下过程中用到的代码 Blender 版本 4.0 批量导入 ply 假设…...
二分图带权最大匹配-KM算法详解
文章目录 零、前言一、红娘再牵线二、二分图带权最大完备匹配2.1二分图带权最大匹配2.2概念2.3KM算法2.3.1交错树2.3.2顶标2.3.3相等子图2.3.4算法原理2.3.5算法实现 三、OJ练习3.1奔小康赚大钱3.2Ants 零、前言 关于二分图:二分图及染色法判定-CSDN博客 关于二分…...
Redis命令 - Sets命令组常用命令
Set集合,无序,一堆不重复值的组合。利用redis提供的set数据结构,可以存储一些集合性的数据。 使用场景:例如,实现如共同关注、共同喜好、二度好友等 1、SADD key member [member …] 向集合中添加一个或者多个成员 …...
DA14531-外设驱动篇-I2C通信应用
文章目录 1.I2C通信应用相关文件2.宏定义列表3.主要函数接口4.应用代码实例1.I2C通信应用相关文件 1)i2c.c和i2c.h(SDK文件) 2)app_I2cProtocol.c和app_I2cProtocol.h(用户应用文件) 2.宏定义列表 宏定义注解I2C_ADDRESSING_7B7-bit 地址I2C_ADDRESSING_10B10-bit 地址…...
Git仓库管理笔记
问题: hint: the same ref. If you want to integrate the remote changes, use Done 解决: 解决方法: 1、先使用pull命令: git pull --rebase origin master 2、再使用push命令: git push -u origin master...
[嵌入式软件][入门篇] 搭建在线仿真平台(STM32)
文章目录 一、注册平台二、创建首个项目三、硬件介绍 一、注册平台 进入官方,进行注册: 在线仿真地址 二、创建首个项目 ① 新建项目 ② 搭建一个电路 ③ 用STM32F103搭建一个简单电路 ④ 进入编码界面 三、硬件介绍 红框是必看文档ÿ…...
设置5台SSH互免的虚拟机服务器配置
搭建一套集群虚拟机,往往都需要互免设置,过程很简单,避免以后再搭建还得网上搜索,我直接将这一个步骤写成笔记,记录下来,方便后续查阅。 步骤如下—— 1、准备五台机器 服务器名字服务器IPhadoop1192.16…...
深信服技术认证“SCCA-C”划重点:交付和运维体系
为帮助大家更加系统化地学习云计算知识,高效通过云计算工程师认证,深信服特推出“SCCA-C认证备考秘笈”,共十期内容。“考试重点”内容框架,帮助大家快速get重点知识。 划重点来啦 *点击图片放大展示 深信服云计算认证ÿ…...
xlua源码分析(五) struct类型优化
xlua源码分析(五) struct类型优化 上一节我们分析了xlua是如何实现lua层访问C#值类型的,其中我们重点提到了xlua默认实现方式下,struct访问的效率问题。实际上,xlua还提供了两种优化的方式,可以大大提高str…...
iptables TEE模块测试小记
概述 因为公司项目需求,需要对服务器特定端口进行流量镜像,各种百度之后,发现TEE的模块,后来一番折腾,发现被转发的机器死活收不到数据,最后tcpdump一通了解到根源,博文记录,用以备…...
facebook广告怎么设置受众人群
在设置Facebook广告受众人群时,你可以遵循以下步骤: 打开广告创建工具,点击页面右上角的箭头并选择“创建广告”。选择广告目标,根据想要实现的目标创建广告。例如,想要让更多用户谈论你的主页和帖子,或者…...
MySQL夯实之路-MVCC机制深入浅出
多版本并发控制(MVCC,multiversion concurrency control) MVCC用更加灵活的方式处理并发,实现了读不加锁,读写不冲突。保证了事务的隔离性(可重复读),避免了不可重复读问题。 数据…...
Java线上问题堆栈排查分析
最近线上出现类似内存溢出问题,需要排查具体原因,记录过程,方便备查。 一、数据抓取 在启动参数中添加参数,可参照以下设置。 参数的作用是在程序发生内存溢出 OutOfMemory 时打印日志,dump下来,方便用工…...
C语言代码 计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!
计算1!2!3!4!5!6!7!8!9!10! 代码示例: #include <stdio.h> int main() {int i 0;int n 0;int ret 1;int sum 0;for (n 1; n < 10; n){ret 1;for (i 1; i < n; i){ret ret * i;}sum sum ret;}printf("%d\n", sum);return 0; } 运…...
【RTOS】快速体验FreeRTOS所有常用API(4)队列
目录 四、队列2.1 概念2.2 创建队列2.3 写队列2.4 读队列2.5 队列集(可跳过) 四、队列 该部分在上份代码基础上修改得来,代码下载链接: https://wwzr.lanzout.com/iBNAS1l75bvc 密码:7xy2 该代码尽量做到最简,不添加多…...
【开题报告】基于SpringBoot的美食制作学习网站的设计设计与实现
1.选题背景 随着人们生活水平的提高,对美食的追求也越来越高。越来越多的人希望能够在家里制作出各种美味的菜肴。然而,对于许多人来说,缺乏专业的指导和实践经验是一个挑战。另外,互联网的普及与发展,为人们提供了更…...
Rosalind Java|Speeding Up Motif Finding
Rosalind编程问题之计算错误矩阵(failure array)输出前后缀检索匹配。 Speeding Up Motif Finding Problem: A prefix of a length n string s is a substring s[1:j]; a suffix of s is a substring s[k:n]. The failure array of s is a…...
微信公众号微网站制作/服务网站推广方案
题意:一个寝室有k个人(包过a, b),a要玩游戏,b阻止a玩游戏(最多阻止m次),问剩余阻止的期望 a做坏事的条件:在寝室连续呆了T分钟,或者被阻止后T分钟 a不做坏事的条件:离开寝室或者被阻止 已知门开…...
网站快照优化公司/seo快速排名软件案例
一、背景及现状1. 第一阶段在 2019 年之前,汽车之家的大部分实时业务都是运行在 Storm 之上的。Storm 作为早期主流的实时计算引擎,凭借简单的 Spout 和 Bolt 编程模型以及集群本身的稳定性,俘获了大批用户,我们在 2016 年搭建了 …...
汉中网站建设报价/头条今日头条新闻
NameValueCollectionValueProvider采用一个NameValueCollection作为数据源,DictionnaryValueProvider的数据源类型自然就是一个Dictionnary。NameValueCollection和Dictionnary都是一个键值对的集合,它们之间的不同之处在NameValueCollection运行元素具有…...
心悦做宠物的网站/seo有些什么关键词
14.1 组件开发基础 CDD 基础 CDD(Component-Driven Development) 自上而下从组件级别开始,到页面级别结束 先从相对完的的设计中抽象出来组件,先隔离开发组件然后再开发页面 CDD的好处 组件在最大程度被重用并行开发 对单个…...
淄博网站制作定制技术/网站整合营销推广
ls -F一种非常有用的ls格式 tz/y/yupeng > ls -F#q# News/ doc/ images/ mbox postponedMail/ dead.letter html mail/ myftp/ 这种命令格式可以很明显的显示出那些是目录那些是文件。 tz/y/yupeng &…...
做网站互联网公司排名/五种关键词优化工具
盒子分别是由margin ,padding,boder以及content 组成盒子分两种:ie的盒子,W3C的盒子例:盒子的 margin 为 20px,border 为 2px,padding 为 10px,content 的宽为 200px、高为 50px。W3C标准的盒子所占空间 w…...