Linux--Flappy_bird实现

目录

void handler(int sig): 

mian:

void init_curses()

int set_timer(int ms_t); 

小鸟的操作: 

void show_pipe():

 void create_list()

void clear_pipe()

void move_pipe();

 test_bird.c完整代码:


代码实现:

#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_node* head,*tail;void create_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);//设置定时器--msvoid handler(int sig)
{Pipe_node* cur;Pipe_node* new;/**小鸟下落**/clear_bird();bird_y++;show_bird();/**游戏结束判断**/if((char)inch() == PIPE){set_timer(0);endwin();exit(1);}cur = head->next;if(cur->x == 0){int i,j = 0;for(i = cur->x;i < cur->x + 10;i++){for(j = 0;j<cur->y;j++){move(j,i);addch(BLANK);}for(j = cur->y+5;j<25;j++){move(j,i);addch(BLANK);}refresh();}head->next = cur->next;free(cur);new = (Pipe_node*)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();
}int main()
{bird_y = 15;//行bird_x = 10;//列init_curses();signal(SIGALRM,handler);set_timer(500);//500mssrand(time(0));create_list();show_pipe();show_bird();move_bird();return 0;
}void init_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)
{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 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 show_pipe()
{Pipe_node* cur = head->next;int i;int j;attron(COLOR_PAIR(2));while(cur){for(i = cur->x;i < (cur->x) + 10;i++){for(j = 0;j<cur->y;j++){move(j,i);addch(PIPE);}for(j = (cur->y) + 5;j < 25;j++){move(j,i);addch(PIPE);}}refresh();cur = cur->next;}attroff(COLOR_PAIR(2));
}void create_list()
{Pipe_node* cur;Pipe_node* new;head = (Pipe_node*)malloc(sizeof(Pipe_node));//头结点head->next = NULL;cur = head;//指向头结点int i = 0;for(i = 0;i<5;i++){new = (Pipe_node*)malloc(sizeof(Pipe_node));new->x = (i+1)*20;new->y = rand()%11+5;//管道的长度是5-15行new->next = NULL;cur->next = new;//链接新节点和头结点cur = new;//指向新节点为尾节点}tail = cur;//更新尾节点
}void clear_pipe()
{Pipe_node* next = head->next;int i;int j;while(next){for(i = next->x;i < (next->x) + 10;i++){for(j = 0;j < (next->y);j++){move(j,i);addch(BLANK);}for(j = (next->y) + 5;j<25;j++){move(j,i);addch(BLANK);}}refresh();next = next->next;}}void move_pipe()
{Pipe_node* cur;cur = head->next;while(cur){cur->x--;cur = cur->next;}}

 各模块注释:

函数声明:

void create_list(): 创建管道链表。在游戏开始时调用,生成初始的一些管道。void show_pipe(): 显示管道。遍历管道链表,将管道在屏幕上显示出来。void clear_pipe(): 清除管道。清除屏幕上所有的管道。void move_pipe(): 移动管道。遍历管道链表,将所有的管道向左移动一个单位。void show_bird(): 显示小鸟。在屏幕上显示小鸟的位置。void clear_bird(): 清除小鸟。清除屏幕上小鸟的位置。void move_bird(): 移动小鸟。监听用户输入,当按下空格键时,使小鸟上升一格。void init_curses(): 初始化 curses 库。在程序开始时调用,进入 curses 模式,设置一些终端属性。int set_timer(int ms_t): 设置定时器。用于定时触发 SIGALRM 信号,以便实现游戏中小鸟的下落和管道的移动。

void handler(int sig): 


这是一个信号处理函数,用于处理 SIGALRM 信号。具体功能如下:小鸟下落:首先调用 clear_bird() 清除当前小鸟的位置,然后将小鸟的纵坐标 bird_y 增加 1,表示小鸟向下移动了一格,最后调用 show_bird() 在新位置显示小鸟。游戏结束判断:通过检查小鸟下一个位置的字符,如果该位置的字符是管道 PIPE,则游戏结束。在 curses 库中,可以使用 inch() 函数获取当前光标位置的字符。如果检测到小鸟碰到管道,就会调用 set_timer(0) 停止定时器,然后调用 endwin() 结束 curses 模式,最后调用 exit(1) 退出程序。管道移动和生成新管道:如果当前管道已经移动到屏幕左侧边缘(即 cur->x == 0),则表示需要移除该管道,并生成新的管道。首先,清除屏幕上该管道的位置。然后,将当前头指针 head 指向下一个管道节点,同时释放当前节点的内存。接着,生成新的管道节点 new,其横坐标为尾节点的横坐标加上一定的距离(例如,20),纵坐标为随机生成的值。最后,更新尾指针 tail 指向新的尾节点。管道移动和显示:最后调用 clear_pipe() 清除屏幕上的所有管道,然后调用 move_pipe() 将所有管道向左移动一个单位,最后调用 show_pipe() 显示移动后的管道。这个处理函数实现了游戏中小鸟的下落、游戏结束判断以及管道的移动和生成

mian:


这是 main() 函数,是程序的入口点。它完成了以下操作:初始化小鸟的初始位置 bird_y 和 bird_x,分别设置为第 15 行和第 10 列。调用 init_curses() 函数初始化 curses 库,准备开始游戏。使用 signal(SIGALRM, handler) 设置了一个定时器信号 SIGALRM 的处理函数为 handler,即当定时器到达指定时间时,会调用 handler 函数处理。调用 set_timer(500) 设置定时器,以 500 毫秒为间隔触发 SIGALRM 信号,即每 500 毫秒触发一次,用于控制小鸟的下落和管道的移动。调用 srand(time(0)) 初始化随机数种子,以当前时间为参数,保证每次运行程序时生成的随机数不同。调用 create_list() 函数创建初始的管道链表。调用 show_pipe() 函数在屏幕上显示初始的管道。调用 show_bird() 函数在屏幕上显示初始位置的小鸟。调用 move_bird() 函数监听用户输入,控制小鸟的移动。最后返回 0,表示程序正常运行结束。

void init_curses()


这是 init_curses() 函数,用于初始化 curses 库,具体功能如下:initscr() 函数用于初始化 curses 库,将终端设置为 curses 模式,以便使用 curses 提供的功能。curs_set(0) 函数禁止光标显示,以免干扰游戏界面的显示。noecho() 函数禁止输入字符的显示,这样用户输入的字符不会直接显示在终端上,而是被程序接收并处理。keypad(stdscr, 1) 函数启用功能键,使得 curses 库能够接收并处理终端上的特殊按键(例如方向键、功能键等)。start_color() 函数用于启动 curses 库的颜色机制,使得程序能够使用彩色显示。init_pair(1, COLOR_WHITE, COLOR_RED) 和 init_pair(2, COLOR_WHITE, COLOR_GREEN) 函数分别初始化了两个颜色对,用于设置小鸟和管道的颜色。这里使用了颜色对,将白色作为前景色,红色作为背景色,以及将白色作为前景色,绿色作为背景色,来实现不同的显示效果。这个函数在游戏开始时被调用,对 curses 库进行了必要的初始化,以确保游戏界面的正常显示和用户交互功能的实现。

int set_timer(int ms_t); 

这是 set_timer() 函数,用于设置定时器,具体功能如下:接收一个参数 ms_t,表示定时器的时间间隔,单位为毫秒。将毫秒转换为秒和微秒,以适配 struct itimerval 结构体的成员类型。
将毫秒转换为秒,然后将剩余的毫秒转换为微秒。初始化一个 struct itimerval 类型的变量 timer,用于设置定时器的参数。将 it_value 成员设置为首次启动定时器的时间,即 tv_sec 设置为转换后的秒数,tv_usec 设置为转换后的微秒数。将 it_interval 成员设置为定时器的时间间隔,也就是每次定时器触发后再次触发的时间间隔,同样设置为转换后的秒数和微秒数。使用 setitimer() 函数设置实时定时器 ITIMER_REAL,并将 timer 作为参数传入。
这样设置的定时器将会以实时时间为基准,定时器触发后会产生 SIGALRM 信号。函数返回一个整数值,表示设置定时器的结果,通常为 0 表示成功,-1 表示失败。这个函数被用于在游戏中设置一个定时器,以控制小鸟的下落速度和管道的移动速度

小鸟的操作: 

这是一组函数,用于控制小鸟在游戏界面中的显示和移动,以及处理游戏结束的逻辑。void show_bird(): 这个函数用于显示小鸟在游戏界面中的位置。
首先调用 attron(COLOR_PAIR(1)) 函数,启用颜色对1,以设置小鸟的颜色。
然后调用 move() 函数将光标移动到小鸟的位置(由全局变量 bird_y 和 bird_x 控制),调用 addch() 函数在光标所在位置添加小鸟字符 BIRD,最后调用 refresh() 函数刷新屏幕。
最后调用 attroff(COLOR_PAIR(1)) 函数,关闭颜色对1,恢复原有颜色设置。void clear_bird(): 这个函数用于清除小鸟在游戏界面中的位置。
首先调用 move() 函数将光标移动到小鸟的位置,然后调用 addch() 函数在光标所在位置添加空白字符 BLANK,最后调用 refresh() 函数刷新屏幕。void move_bird(): 这个函数用于控制小鸟的移动。
函数使用一个无限循环来等待用户按键输入,只有在用户按下空格键时才执行移动操作。
当用户按下空格键时,首先调用 clear_bird() 函数清除小鸟当前位置的显示,然后将小鸟的行坐标 bird_y 减1,表示小鸟向上移动一个位置,接着调用 show_bird() 函数重新在新位置显示小鸟。在移动小鸟后,函数会检查小鸟所在位置是否与管道重叠,如果重叠则会调用 set_timer(0) 函数停止定时器,然后调用 endwin() 函数关闭 curses 模式,最后调用 exit(1) 函数退出程序,以表示游戏结束。这组函数控制了小鸟在游戏中的显示和移动,同时处理了游戏结束的逻辑。

void show_pipe():
 


这个函数用于显示管道在游戏界面中的位置。Pipe_node* cur = head->next;: 首先,定义一个指针 cur,指向管道链表中的第一个管道节点,跳过头结点。int i; int j;: 定义循环变量 i 和 j,用于遍历管道的列和行。attron(COLOR_PAIR(2));: 调用 attron() 函数启用颜色对2,以设置管道的颜色。while(cur) { ... }: 使用一个循环遍历管道链表中的所有管道节点。for(i = cur->x; i < (cur->x) + 10; i++) { ... }: 遍历管道所在的列,从管道节点的列坐标开始,到列坐标加上10(管道长度)为止。对于每一列:for(j = 0; j < cur->y; j++) { ... }: 遍历管道上半部分的行,从第0行到管道节点的横坐标减1行为止。对于每一行,在当前列的位置显示管道字符 PIPE。for(j = (cur->y) + 5; j < 25; j++) { ... }: 遍历管道下半部分的行,从管道节点的横坐标加上5行开始,直到第25行为止。对于每一行,在当前列的位置显示管道字符 PIPE。refresh();: 在循环结束后调用 refresh() 函数刷新屏幕,以显示更新后的管道。cur = cur->next;: 将指针 cur 移动到下一个管道节点,以继续遍历。attroff(COLOR_PAIR(2));: 调用 attroff() 函数关闭颜色对2,恢复原有颜色设置。

 void create_list()

这个函数用于创建初始的管道链表。Pipe_node* cur;: 定义指针 cur,用于遍历链表。Pipe_node* new;: 定义指针 new,用于创建新的管道节点。head = (Pipe_node*)malloc(sizeof(Pipe_node));: 分配内存给头结点。head->next = NULL;: 将头结点的指针域指向空,表示链表为空。cur = head;: 将 cur 指针指向头结点,作为链表的起始点。for(i = 0; i < 5; i++) { ... }: 使用循环创建5个初始管道节点。new = (Pipe_node*)malloc(sizeof(Pipe_node));: 分配内存给新的管道节点。new->x = (i + 1) * 20;: 设置新节点的列坐标为 (i + 1) * 20,确保管道节点之间的水平间距。new->y = rand() % 11 + 5;: 随机生成管道节点的横坐标,范围在5到15之间,以确保管道长度在5到15行之间。new->next = NULL;: 将新节点的指针域设为空,因为它是最后一个节点。cur->next = new;: 将新节点连接到当前节点的后面。cur = new;: 将 cur 指针移动到新节点,作为链表的尾节点。tail = cur;: 更新尾节点为链表的最后一个节点。

void clear_pipe()

这个函数用于清除当前屏幕上的所有管道。Pipe_node* next = head->next;: 定义指针 next 指向头结点的下一个节点,即第一个管道节点。int i;: 定义整型变量 i 用于循环迭代列坐标。int j;: 定义整型变量 j 用于循环迭代横坐标。while(next) { ... }: 当 next 指针不为空时,即还有管道节点未清除时,执行循环。for(i = next->x; i < (next->x) + 10; i++) { ... }: 遍历当前管道节点的列坐标范围,即管道的横向范围。for(j = 0; j < (next->y); j++) { ... }: 遍历当前管道节点的上半部分,即管道的上半部分高度范围。move(j, i);: 将光标移动到指定位置。addch(BLANK);: 在当前位置添加一个空白字符,以清除该位置上的管道。for(j = (next->y) + 5; j < 25; j++) { ... }: 遍历当前管道节点的下半部分,即管道的下半部分高度范围。move(j, i);: 将光标移动到指定位置。addch(BLANK);: 在当前位置添加一个空白字符,以清除该位置上的管道。refresh();: 刷新屏幕,使更新生效。next = next->next;: 将 next 指针指向下一个管道节点,以便继续清除下一个管道节点。

void move_pipe();

这个函数用于移动管道,使其向左移动一个单位。Pipe_node* cur;: 声明一个指针 cur,用于遍历管道链表。cur = head->next;: 将 cur 指向管道链表的第一个节点,即头结点的下一个节点,表示从第一个管道开始移动。while(cur) { ... }: 当 cur 指针不为空时,即还有管道节点需要移动时,执行循环。cur->x--;: 将当前管道节点的列坐标减1,实现向左移动一个单位。cur = cur->next;: 将 cur 指针移动到下一个管道节点,以便继续移动下一个管道节点。

 test_bird.c完整代码:

#include<signal.h>
#include<stdio.h>
#include<curses.h>
#include<stdlib.h>
#include<sys/time.h>#define BIRD '@'
#define BLANK ' '
#define PIPE '+'/**小鸟**/
void init_curses();
int set_timer(int ms_time);
void show_bird();
void move_bird();
void clear_bird();/**管道**/
void create_list();
void show_pipe();
void move_pipe();
void clear_pipe();/**管道结构体**/
typedef struct Pipe
{struct Pipe* next;int pipe_x;int pipe_y;
}PipeNode;
PipeNode* head;//头结点
PipeNode* tail;//尾节点/**小鸟坐标**/
int bird_x;//列
int bird_y;//行/**定时回调函数**/
void timer_handler(int sig)
{/**小鸟自动向下移动**/clear_bird();bird_y++;//50ms小鸟自动向下掉show_bird();/**小鸟碰到管道,游戏结束**/if((char)inch() == PIPE){set_timer(0);endwin();exit(1);}/**管道更新**/PipeNode* cur = head->next;PipeNode* newPipeNode;int i,j;if(cur->pipe_x == 0){/**清除管道**/for(i = cur->pipe_x;i < (cur->pipe_x) + 10;i++){/**管道的上半部分**/for(j = 0;j < cur->pipe_y;j++){move(j,i);addch(BLANK);}/**管道的下半部分**/for(j = (cur->pipe_y + 5);j < 25;j++){move(j,i);addch(BLANK);}refresh();}head->next = cur->next;free(cur);/**开辟新管道**/newPipeNode = (PipeNode*)malloc(sizeof(PipeNode));newPipeNode->pipe_x = tail->pipe_x + 20;newPipeNode->pipe_y = rand() % 11 + 5;newPipeNode->next = NULL;tail->next = newPipeNode;//链接新节点tail = newPipeNode;//更新尾节点}/**管道自动向左移动**/clear_pipe();move_pipe();show_pipe();
}int main(int arg,const char* argv[])
{init_curses();bird_x = 15;//列bird_y = 10;//行struct sigaction act;act.sa_handler = timer_handler;act.sa_flags = 0;sigemptyset(&act.sa_mask);sigaction(SIGALRM,&act,NULL);set_timer(500);srand(time(0));//管道的长度随机create_list();show_pipe();//创建管道show_bird();move_bird();return 0;
}void init_curses()
{initscr();curs_set(0);noecho();keypad(stdscr,1);start_color();init_pair(1,COLOR_WHITE,COLOR_RED);init_pair(2,COLOR_WHITE,COLOR_GREEN);endwin();
}int set_timer(int ms_time)
{struct itimerval timer;int tv_sec = ms_time / 1000;int tv_usec = (ms_time % 1000) * 1000;timer.it_value.tv_sec = tv_sec;timer.it_value.tv_usec = tv_usec;timer.it_interval.tv_sec = tv_sec;timer.it_interval.tv_usec = tv_usec;setitimer(ITIMER_REAL,&timer,NULL);
}
void clear_bird()
{move(bird_y,bird_x);addch(BLANK);refresh();
}void show_bird()
{attron(COLOR_PAIR(1));move(bird_y,bird_x);addch(BIRD);refresh();attroff(COLOR_PAIR(1));
}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 create_list()
{PipeNode* cur;PipeNode* newPipeNode;head = (PipeNode*)malloc(sizeof(PipeNode));//开辟一个头节点指向链表head->next = NULL;cur = head;int i = 0;for(i = 0;i < 5;i++){newPipeNode = (PipeNode*)malloc(sizeof(PipeNode));newPipeNode->pipe_x = (i+1) * 20;//(20列*(1-5))newPipeNode->pipe_y = rand() % 11 + 5;//(5-15行)newPipeNode->next = NULL;//开辟五个节点cur->next = newPipeNode;//头结点的下一个节点为链表的头结点cur = newPipeNode;//指向当前新节点}tail = cur;//更新尾节点
}void show_pipe()
{PipeNode* cur = head->next;int i,j;attron(COLOR_PAIR(2));while(cur != NULL){for(i = cur->pipe_x;i < (cur->pipe_x) + 10;i++){/**管道的上半部分**/for(j = 0;j < cur->pipe_y;j++){move(j,i);addch(PIPE);refresh();}/**管道的下半部分**/for(j = (cur->pipe_y + 5);j < 25;j++){move(j,i);addch(PIPE);refresh();}}refresh();cur = cur->next;}attroff(COLOR_PAIR(2));
}void clear_pipe()
{PipeNode* cur = head->next;int i,j;while(cur != NULL){for(i = cur->pipe_x;i < (cur->pipe_x) + 10;i++){/**管道的上半部分**/for(j = 0;j < cur->pipe_y;j++){move(j,i);addch(BLANK);refresh();}/**管道的下半部分**/for(j = (cur->pipe_y + 5);j < 25;j++){move(j,i);addch(BLANK);refresh();}}refresh();cur = cur->next;}
}void move_pipe()
{PipeNode* cur = head->next;while(cur != NULL){cur->pipe_x--;cur = cur->next;}
}

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

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

相关文章

STM32 CubeMX使用介绍(含FreeRTOS生成)

文章目录 前言1. 简介1.1 什么是STM32CubeMX1.2 为什么会有STM32CubeMX的出现1.3 STM32CubeMX常用功能有哪些&#xff1f;1.4 官方资料下载地址 2. 下载和安装STM32CubeMX2.1 下载软件2.2 软件安装 3. 使用方式3.1 说明3.2 不同选择器介绍3.3 构建新的项目3.1 选择单片机的型号…

题目:出列(蓝桥OJ 3223)

问题描述&#xff1a; 解题思路&#xff1a; 先使用暴力找到规律再解。 暴力做法&#xff1a;将数据放到一个动态数组中&#xff0c;下标就表示当前编号&#xff0c;符合题意的就放到覆盖该数组中&#xff0c;依次循环&#xff0c;直到只有一个元素停。 规律&#xff1a;小于该…

爬虫(七)

1.批量爬取知网数据 lxml:是 Python 的一个功能强大且易用的 XML 和 HTML 处理库。它提供了简单又轻巧的 API,使得解析、构建和操作 XML 和 HTML 文档变得非常方便。lxml 库通常用于处理 XML 和 HTML 文档,例如解析网页、处理配置文件等。openpyxl:是 Python 中用于操作 Ex…

uniapp自定义导航栏左中右内容和图标,以及点击事件

uniapp自定义导航栏左中右内容和图标&#xff0c;以及点击事件 效果&#xff1a; 页面&#xff1a; <view class"navigation-bar"><view class"navigation-bar-left" click"navigateBack"><u-icon name"arrow-left"…

【嵌入式开发 Linux 常用命令系列 4.3 -- git add 时单独排除某个目录或者文件】

文章目录 git add 时单独排除某个目录或者文件使用 .gitignore 文件使用命令行排除文件或目录 git add 时单独排除某个目录或者文件 在使用 git add 命令时&#xff0c;如果你想要排除特定的目录或文件&#xff0c;可以使用 .gitignore 文件或使用路径规范来指定不想添加的文件…

新的变速箱滚动轴承和齿轮故障数据

变速箱是传动系统中非常关键的一部分&#xff0c;它由齿轮、传动轴、轴承和壳体等组成。变速箱的主要功用包括&#xff1a;&#xff08;1&#xff09;能够改变传动比&#xff0c;按实际情况调整驱动轮转矩和转速&#xff0c;进而满足复杂的行车要求&#xff1b;&#xff08;2&a…

机器学习金融应用技术指南

1 范围 本文件提供了金融业开展机器学习应用涉及的体系框架、计算资源、数据资源、机器学习引擎、机 器学习服务、安全管理、内控管理等方面的建议。 本文件适用于开展机器学习金融应用的金融机构、技术服务商、第三方安全评估机构等。 2 规范性引用文件 下列文件中的内容通过…

新型储能是什么,储能系统解决方案现状及趋势详细说明

新型储能是指新兴的能够存储电能并在需要时释放的储能技术。其中主要包括光伏储能和商业储能。 光伏储能是指通过光伏电池将太阳能转化为电能&#xff0c;并将其存储起来以供后续使用。光伏储能系统一般由太阳能电池板、储能装置和逆变器组成。光伏储能可以将白天产生的电能存…

Java练习题目3:输入一个学生的5门课成绩及对应的学分,计算该同学的加权平均分(WeightedAverageScore3)

每日小语 我们没有意识到惯用语言的结构有多大的力量。可以说&#xff0c;它通过语义反应机制奴役我们。 ——阿尔弗雷德科日布斯基 思考 输入5门课成绩&#xff0c;学分&#xff0c;加权平均分公式 [&#xff08;课程A成绩*课程A学分&#xff09;&#xff08;课程成绩B*课程…

Learn OpenGL 19 几何着色器

几何着色器 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader)&#xff0c;几何着色器的输入是一个图元&#xff08;如点或三角形&#xff09;的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而&#xff0c;几何着色器最有趣的地方…

动态路由协议——OSPF

目录 一.OSPF来源 二.OSPF术语 1.area id——区域的划分 2.cost——路径开销值 3.route id 4.LSDB表 5.邻居表 6.OSPF路由表 三.OSPF工作过程 1.交互hello报文建立邻居关系 2.选举主从 3.交互LSDB摘要信息 4.LSR,LSU,LSACK同步LSDB表项 5.各自计算路由 四.OSPF交…

maven手动上传的第三方包 打包项目报错 Could not find xxx in central 解决办法

背景: 在Maven私服手动上传了第三方的jar包, 只有jar包, 没有pom文件, 项目在ide中可以正常编译启动,但打包报错无法找到jar包 解决办法: 上传jar包的时候, 点击生成pom. 则打包的时候不会报错

pyrealsense2获取保存点云

一、第一种实现代码 Python import sys import cv2 import pyrealsense2 as rs import numpy as np import keyboard import open3d as o3d import osif __name__ "__main__":output_folder output_data/os.makedirs(output_folder, exist_okTrue)pipeline rs.p…

三级数据库技术知识点(详解!!!)

1、从功能角度数据库应用系统可以划分为表示层、业务逻辑层、数据访问层、数据持久层四个层次&#xff0c;其中负责向表示层直接传送数据的是业务逻辑层。 【解析】表示层负责所有与用户交互的功能;业务逻辑层负责根据业务逻辑需要将表示层获取的数据进行组织后&#xff0c;传…

阅读MySQL知识4

一、MySQL数据库主从同步延迟产生的原因 MySQL的主从复制都是单线程的操作&#xff0c;主库对所有DDL和DML产生的日志写进binlog&#xff0c;由于binlog是顺序写&#xff0c;所以效率很高。 Slave的SQL Thread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作…

SpringBoot如何替换启动图标

SpringBoot项目在启动时会出现一个默认的启动图案 . ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) ) |____| .__|_| |_|_| |_\__, | / / / /|_||___//_/_/_/::…

软件架构和基于架构的软件开发方法知识总结

一、软件架构定义 软件架构为软件系统提供了一个结构、行为和属性的高级抽象 软件架构是一种表达&#xff0c;使软件工程师能够&#xff1a; &#xff08;1&#xff09;分析设计在满足所规定的需求方面的有效性 &#xff08;2&#xff09;在设计变更相对容易的阶段&#xff0c;…

题目:异或森林(蓝桥OJ 3400)

问题描述&#xff1a; 解题思路&#xff1a; 一个数也可以看作是一段区间&#xff0c;当该区间的异或和为完全平方数时则符合题意。 我们需要注意枚举的完全平方的上限。 异或前缀和减小时间复杂度。 题解&#xff1a; #include <bits/stdc.h> using namespace std; usi…

vi\vim编辑器详解

vi\vim编辑器介绍 vi\vim是visual interface的简称, 是Linux中最经典的文本编辑器 同图形化界面中的 文本编辑器一样&#xff0c;vi是命令行下对文本文件进行编辑的绝佳选择。 vim 是 vi 的加强版本&#xff0c;兼容 vi 的所有指令&#xff0c;不仅能编辑文本&#xff0c;而…

鸿蒙一次开发,多端部署(九)应用市场首页

本小节将以应用市场首页为例&#xff0c;介绍如何使用自适应布局能力和响应式布局能力适配不同尺寸窗口。 页面设计 一个典型的应用市场首页的UX设计如下所示。 观察应用市场首页的页面设计&#xff0c;不同断点下的页面设计有较多相似的地方。 据此&#xff0c;我们可以将页…