基于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重点知识。 划重点来啦 *点击图片放大展示 深信服云计算认证ÿ…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...