【C语言】Linux 飞翔的小鸟
【C语言】Linux 飞翔的小鸟
零、环境部署
安装Ncurses库
sudo apt-get install libncurses5-dev
壹、编写代码
代码如下:
bird.c
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<signal.h>
#include<curses.h>
#include<sys/time.h>
#include<unistd.h>int window_w = 100;
int window_h = 25;typedef struct pipe{int x;int r;struct pipe *next;
}*pipe_list;char bird_char = '@';
char pipe_char = '+';
char edge_char = '#';
char bird_die_char = '*';
char empty_char = ' ';
int bird_x, bird_y;
pipe_list piping = NULL;
int pipeline_count = 5;
int pipeline_width = 10;
int pipeline_min_height = 5;
int pipeline_gap = 6;int running = 0;int score = 0;void init_curses();
int set_timer(int ms);void show_bird();
void clear_bird();
void move_bird(int x, int y);
void move_bird_up();
void move_bird_down();
void bird_ctrl();
void show_bird_die();void referee(int is_user);
void show_score();
void show_game_over(int empty);pipe_list create_pipe(int n);
void draw_pipe(char ch);
void show_pipe();
void clear_pipe();
void move_pipe();
void oper_pipe();void show_map_edge();void init_map();void check_yx(int *y,int *x);
void handler();int main(void) {int gap_time;while (1) {printf("==========欢迎来到飞翔的小鸟==========\n");printf("1.普通 2.简单 3.困难\n");printf("请选择游戏难度:");char choose = getchar();getchar();if (choose == '2') {printf("游戏难度:简单\n");gap_time = 800;} else if (choose == '3') {printf("游戏难度:困难\n");gap_time = 300;} else {printf("游戏难度:普通\n");gap_time = 500;}int time_down = 2;while (time_down-- > 0) {printf("%d秒后开始游戏,请做好准备!\n", time_down);sleep(1);}// 初始化随机种子srand(time(NULL));// 初始化软中断signal(SIGALRM, handler);set_timer(gap_time);score = 0;running = 1;// 初始化组件init_curses();// 显示小鸟bird_x = 10; // 列bird_y = window_h / 2; // 行// 显示地图init_map();show_map_edge();show_game_over(1);// 显示管道piping = create_pipe(pipeline_count);show_pipe();// 显示小鸟show_bird();// 小鸟控制bird_ctrl();// 结束游戏endwin();printf("游戏结束!\n");printf("你本次游戏得分:%d\n", score);printf("按任意键继续游戏,按Q键退出游戏\n");choose = getchar();getchar();if (choose == 'q' || choose == 'Q') {break;}}return 0;
}void game_run() {if (!running) {return;}// 小鸟move_bird_down();// 管道clear_pipe();move_pipe();oper_pipe();show_pipe();// 地图show_map_edge();// 游戏得分referee(0);show_score();
}void handler() {game_run();
}void referee(const int is_user) {if (!is_user) {score += 1;}// 判断小鸟是否撞到了管子move(bird_y, bird_x);const chtype ch = inch();if ((char) ch == pipe_char) {// 撞到管子,游戏结束running = 0;show_game_over(0);show_bird_die();}
}void show_game_over(const int empty) {const char tips[] = "Game over, please press any key to continue ~ ";const char *p = tips;move(window_h + 2, 2);while (*p != '\0') {if (empty) {addch(empty_char);} else {attron(COLOR_PAIR(4));addch(*p);attroff(COLOR_PAIR(4));}p++;}refresh();
}void show_score() {char score_str[50];const char *p = score_str;sprintf(score_str, "score : %04d", score);score_str[49] = 0;move(window_h + 1, 2);while (*p != '\0') {addch(*p);p++;}refresh();
}void show_bird_die() {for (int i = bird_y - 1; i <= bird_y + 1; i++) {for (int j = bird_x - 1; j <= bird_x + 1; j++) {move(i, j);attron(COLOR_PAIR(5));addch(bird_die_char);attroff(COLOR_PAIR(5));}}show_bird();refresh();
}void show_bird() {move(bird_y, bird_x);attron(COLOR_PAIR(1));addch(bird_char);attroff(COLOR_PAIR(1));refresh();
}void clear_bird() {move(bird_y, bird_x);addch(empty_char);refresh();
}void check_yx(int *y, int *x) {if (*x <= 0) {*x = 1;}if (*y <= 0) {*y = 1;}if (*x >= window_w) {*x = window_w - 1;}if (*y >= window_h) {*y = window_h - 1;}
}void move_bird(const int x, const int y) {clear_bird();bird_x = x;bird_y = y;check_yx(&bird_y, &bird_x);show_bird();
}void move_bird_up() {move_bird(bird_x, bird_y - 1);
}void move_bird_down() {move_bird(bird_x, bird_y + 1);
}void bird_ctrl() {while (1) {const char ch = getchar();if (ch == ' ') {move_bird_up();referee(1);}if (!running) {break;}}
}int set_timer(const int ms) {int s = ms / 1000;int us = (ms - s * 1000) * 1000;struct itimerval timer;timer.it_value.tv_sec = s;timer.it_value.tv_usec = us;timer.it_interval.tv_sec = s;timer.it_interval.tv_usec = us;return setitimer(ITIMER_REAL, &timer, NULL);
}void init_curses() {// 进入curses模式initscr();// 不显示光标curs_set(0);// 不显示输入的字符noecho();// 启用键盘keypad(stdscr, 1);// 启动颜色机制start_color();init_pair(1, COLOR_WHITE, COLOR_BLUE); // 鸟init_pair(2, COLOR_WHITE, COLOR_GREEN); // 柱子init_pair(3, COLOR_WHITE, COLOR_RED); // 墙init_pair(4, COLOR_RED, COLOR_WHITE); // 游戏结束提示init_pair(5, COLOR_YELLOW, COLOR_RED); // 小鸟爆炸特效
}void init_map() {for (int i = 0; i < window_h + 2; i++) {for (int j = 0; j < window_w; j++) {move(i, j);addch(empty_char);}}refresh();
}void show_map_edge() {attron(COLOR_PAIR(3));for (int i = 0; i <= window_h; i++) {move(i, 0);addch(edge_char);move(i, window_w);addch(edge_char);}for (int i = 0; i <= window_w; i++) {move(0, i);addch(edge_char);move(window_h, i);addch(edge_char);}attroff(COLOR_PAIR(3));
}void oper_pipe() {if (piping == NULL) {return;}pipe_list head = piping, tail = piping;while (tail->next != NULL) {tail = tail->next;}// 检查是否已经进入左边,+1 是墙壁if (head->x <= (-1 * pipeline_width) + 1) {const pipe_list del_pipe = head;head = head->next;free(del_pipe);}// 检查右边是否太空了if (tail->x <= window_w - window_w / pipeline_count) {// 右边没得了,添加一个tail->next = create_pipe(1);}piping = head;
}pipe_list create_pipe(const int n) {pipe_list main = NULL;for (int i = 0; i < n; i++) {const pipe_list p = malloc(sizeof(struct pipe));if (p == NULL) {perror("分配内存失败");return main;}p->x = (int) (window_w - window_w / (float) n * (float) i);p->r = random() % (window_h - pipeline_gap - pipeline_min_height) + pipeline_min_height;p->next = NULL;if (main != NULL) {p->next = main;}main = p;}return main;
}void show_pipe() {draw_pipe(pipe_char);
}void draw_pipe(const char ch) {if (ch == pipe_char) {attron(COLOR_PAIR(2));}pipe_list p = piping;while (p != NULL) {for (int i = 0; i < pipeline_width; i++) {// 列// 绘制上半部分for (int j = 0; j < p->r; j++) {// 行int y = j;int x = p->x + i;check_yx(&y, &x);move(y, x); // 行 列addch(ch);}// 绘制下半部分for (int j = p->r + pipeline_gap; j < window_h; j++) {int y = j;int x = p->x + i;check_yx(&y, &x);move(y, x); // 行 列addch(ch);}}p = p->next;}if (ch == pipe_char) {attroff(COLOR_PAIR(2));}refresh();
}void clear_pipe() {draw_pipe(empty_char);
}void move_pipe() {pipe_list p = piping;while (p != NULL) {p->x -= 1;p = p->next;}
}
贰、编译运行
编译
gcc bird.c -o bird -Wall -lncurses
运行
./bird
叁、运行效果

相关文章:
【C语言】Linux 飞翔的小鸟
【C语言】Linux 飞翔的小鸟 零、环境部署 安装Ncurses库 sudo apt-get install libncurses5-dev壹、编写代码 代码如下: bird.c #include<stdio.h> #include<time.h> #include<stdlib.h> #include<signal.h> #include<curses.h>…...
mcasttest-tool组播检测工具
作者:广大 检测组播 mcasttest-tool是oracle组播检测工具,组播是oracle 11.2.0.2开始的新功能。 1、上传mcasttest工具解压并授权 [rootrac1 soft]# cd /u01/soft/ [rootrac1 soft]# tar -xvf mcasttest.tgz[rootrac1 soft]# chown -R grid:oinstall…...
ncnn 库编译的一些问题,使用交叉编译
一开始的问题是编译完程序,但是部分工具没有编译出来。 主要的问题是: 1. ncnn2in8 程序没有编译出来:主要原因应该是cmakelists.txt文件中对于的模块没打开on,或者这个模块没加进去编译: 添加以下 -DNCNN_BUILD_EXAMPLESON -…...
Python基础教程(一)
1.编程基础 1.1标识符 标识符是变量、函数、模块和其他对象的名称。Python中标识符的命名不是随意的,而是要遵守一定的命名规则,比如说: 1、标识符是由字母 (A~Z 和 a~z) 、下划线和数字组成,但第一个字符不 能是数字。 2、标识符不…...
基于C51和OLED12864实现贪吃蛇小游戏
引言 在微电子技术飞速发展的今天,单片机作为智能控制的核心,广泛应用于各种电子设备中。C51系列单片机以其高效、稳定的特性,成为众多电子爱好者和工程师的首选平台。而OLED显示屏以其轻薄、低功耗、响应速度快等优点,在显示设备…...
JVM性能调优全指南:高流量电商系统的最佳实践
1.G1(Garbage-First) 官网: G1 Garbage Collection G1收集器是Java 7中引入的垃圾收集器,用于替代CMS(Concurrent Mark-Sweep)收集器。它主要针对大内存、多核CPU环境下的应用场景,具有以下特点: 分代收集:G1仍然保留了分代的概念,但新生代和老年代不再是物理隔离的,…...
前端常见场景、JS计算精度丢失问题(Decimal.js 介绍)
目录 一. Decimal.js 介绍 二. 常用方法 1. 创建 Decimal 实例 2.加法 add 或 plus 3.减法 sub 或 minus 4.乘法 times 或 mul 5.除法 div 或 dividedBy 6.取模 7.幂运算 8.平方根 9.保留小数位 toFixed方法(四舍五入) 三.项目应用 前端精度丢失问题通常由以下原因…...
Python写UI自动化--playwright(点击操作)
本篇介绍playwright点击操作,click()方法的常用参数 目录 0. selector (必需) 1. modifiers(可选) 2. position(可选) 3. button(可选) 4. click_count(可选) 5. delay 6. timeout(可选) 7. forceTrue(可选) 8. trialTrue(可选) 9. no_wait_after(可选) …...
[C#面对对象] 之抽象方法 虚方法 接口
1.虚方法 我的理解 "法国的“巴黎公社”,俄国的“十月革命”,都是把主要战略方向首先夺取中心城市 " 设计为 一个父类中的虚方法(virtual),这个虚方法已经有实现了(就是通过暴力革命夺取的方法 最终返回 城市)然而秋收暴动(子类)失败…...
docker 发布geoserver服务添加字体
1. 创建容器时可直接挂载到系统字体库 2. 已发布的容器挂载字体目录 关闭docker服务 : systemctl stop docker.socket 修改config.v2.json :位置在 cd /var/lib/docker/containers/容器id 重新启动docker服务:systemctl start docker...
数据赋能(162)——开发:数据整理——技术方法、主要工具
技术方法 从商业角度来看,从前未知的数据分析模式或趋势的发现为企业提供了非常有价值的洞察力。数据整理技术能够为企业对未来的发展具有一定的预见性。数据整理技术可以分成3类:群集、分类和预测。 群集技术: 这是一种将相似的数据项进行…...
安全服务面试
对安全服务是怎么理解的 安全服务对象是人, 渗透测试对象是网站。(我的理解) 安全概念和资讯 安全工具使用 渗透测试 安全基线检查 应急响应 代码审计 安全边界建设 安全规范 1.拿到一个待检测的站,你觉得应该先做什么&…...
昇思25天学习打卡营第23天|LSTM+CRF序列标注
Mindspore框架CRF条件随机场概率图模型实现文本序列命名实体标注|(一)序列标注与条件随机场的关系 Mindspore框架CRF条件随机场概率图模型实现文本序列命名实体标注|(二)CRF模型构建 Mindspore框架CRF条件随机场概率图模型实现文本…...
抖音直播弹幕数据逆向:websocket和JS注入
🔍 思路与步骤详解 🕵️♂️ 思路介绍 首先,我们通过抓包工具进入的直播间,捕获其网络通信数据,重点关注WebSocket连接。发现直播弹幕数据通过WebSocket传输,这种方式比传统的HTTP更适合实时数据的传输。…...
AIGC diffusers文生图模型optimum量化使用案例
参考: https://github.com/huggingface/blog/blob/main/quanto-diffusers.md 安装 pip install optimum-quanto %pip install optimum使用 from optimum.quanto import freeze, qfloat8, quantize from diffusers import PixArtSigmaPipeline import torchpipeline = PixArt…...
PDF怎么转换成Word?这些工具一键搞定!
在日常生活中,我们经常遇到需要将PDF文件转换成Word文档的情况。PDF怎么转换成Word?一些工具的使用十分重要!下文中就为大家推荐几个亲测好用的PDF转换工具。 一、Foxit PDF转换大师(365客户端) 链接:www…...
【TS】TypeScript函数类型:提升函数的类型安全性和可读性
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 TypeScript函数类型:提升函数的类型安全性和可读性1. 引言2. 基本函…...
“八股文”在实际工作中是助力、阻力还是空谈?
前言:在当今快速发展的技术时代,程序员的角色变得日益重要。随着技术的不断进步,招聘流程也在不断演变以适应新的需求。在程序员的招聘过程中,“八股文”作为一种面试现象,已成为不可忽视的一部分。所谓“八股文”&…...
代码随想录算法训练营第22天-leetcode-回溯算法part01:
#回溯算法理论基础 能解决的问题: 组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按一定规则全排列&…...
MySql 触发器、存储器练习
一: 触发器 1、建立两个表:goods(商品表)、orders(订单表) 查看数据库:mysql> show databases; 使用数据库:mysql> use mydb16_trigger; 创建goods表: mysql> create table goods(gid char(8) not null primary key, …...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
