当前位置: 首页 > news >正文

基于ncurse的floppy_bird小游戏

1. 需求分析

将运动分解为鸟的垂直运动和杆的左右运动。

2. 概要设计

2.1 鸟运动部分

在这里插入图片描述

2.2 杆的运动

在这里插入图片描述

3. 代码实现

#include <stdio.h>
#include <ncurses.h>#include <stdlib.h>
#include <time.h>int vx = 0;
int vy = 1;int bird_r;
int bird_c;int rows;
int cols;int bird_init_x = 5;
int bird_init_pole_gap = 6;int last_fly_time = 1;
int up_time = 3;int pole_width = 3;
int pole_bt_gap = 6;
int pole_in_gap = 6;int pass_pole_nums = 0;
int pole_nums;struct _pole_node {int pole_lb_x;int pole_gap_y;
};typedef struct _pole_node pole_node;pole_node pn[100];
int pole_nxt;enum HIT_STATUS {HIT_NORMAL,HIT_GROUND,HIT_POLE,
};enum GAME_STATUS {GAME_NORMAL,GAME_QUIT,
};void reset_vy()
{vy = 1;
}void set_pole_nums( )
{int tot = cols - bird_init_x - 2;tot -= bird_init_pole_gap;pole_nums = tot /( pole_width + pole_bt_gap );}
void gen_next_pole(pole_node *prev, pole_node *cur )
{if ( !prev || !cur )return;cur->pole_lb_x = prev->pole_lb_x + pole_bt_gap + pole_width;int prev_y = prev->pole_gap_y;int ub = prev_y - pole_bt_gap - pole_in_gap + 1;ub = ub < pole_width + 1 ? pole_width + 1: ub;int lb = prev_y + pole_bt_gap + pole_in_gap - 1;lb = lb > rows - 1 - pole_width  - pole_in_gap ? rows - 1 - pole_in_gap - pole_width : lb;cur->pole_gap_y = ub + rand() % (lb - ub + 1);           }void init_pole_bound()
{// pole_fp = 0;
//    pole_bp = pole_nums - 1;pn[0].pole_lb_x = bird_init_x + bird_init_pole_gap + 1;pn[0].pole_gap_y = ( bird_r - bird_init_pole_gap) + (rand()%(2 * bird_init_pole_gap)); int prev_y;for ( int i = 1; i < pole_nums; ++i) {gen_next_pole( pn + i - 1, pn + i );/*pn[i].pole_lb_x = pn[ i - 1].pole_lb_x  + pole_bt_gap + pole_width;prev_y = pn[ i - 1 ].pole_gap_y;int ub = prev_y - pole_bt_gap - pole_in_gap + 1;ub = ub < pole_width + 1 ? pole_width + 1: ub;int lb = prev_y + pole_bt_gap + pole_in_gap - 1;lb = lb > rows - 1 - pole_width  - pole_in_gap ? rows - 1 - pole_in_gap - pole_width : lb;pn[i].pole_gap_y = ub + rand() % (lb - ub + 1);           */ }
}void bird_fly( )
{vy = -1;up_time = last_fly_time;
}int check_hit( )
{if ( bird_r - 1 == rows )return HIT_GROUND;int nx = pn[pole_nxt].pole_lb_x;int ny = pn[pole_nxt].pole_gap_y;if ( bird_c >= nx && bird_c < nx + pole_width) {if ( bird_r < ny || bird_r >= ny + pole_in_gap )return HIT_POLE;}return HIT_NORMAL;
}void pole_move( )
{for ( int i = 0; i < pole_nums; ++i) {pn[i].pole_lb_x--;int pole_rb = pn[i].pole_lb_x + pole_width - 1;if ( pole_rb < 1) {int idx = ( i - 1 + pole_nums ) % pole_nums;gen_next_pole( pn + idx, pn + i);}}if ( pn[pole_nxt].pole_lb_x + pole_width == bird_c ) {pole_nxt = ( pole_nxt + 1 ) % pole_nums;pass_pole_nums++;}}
void bird_move( )
{bird_r += vy;bird_c += vx; if ( up_time) {up_time--;if ( !up_time ) {vy = 1;}}if ( bird_r < 1)bird_r = 1;
}void draw_wall(  )
{box(stdscr, '#', '#');}
void draw_pole() 
{for ( int j = 0; j < pole_nums; ++j ) {for ( int i = 1; i < rows - 1; ++i) {if ( i >= pn[j].pole_gap_y && i < pn[j].pole_gap_y + pole_in_gap)continue;for ( int k = 0; k < pole_width; ++k) {int curx = pn[j].pole_lb_x + k;int cury = i;if ( curx > 0 && curx < cols - 1 && cury > 0 && cury < rows - 1)mvaddch(cury, curx, '*');}}	   }}void draw_bird( )
{mvaddch( bird_r, bird_c, '@');
}
void draw_tips( )
{int mid_r = LINES / 2;int bg_c = COLS - 20;mvprintw(mid_r, bg_c,"scores: %d", pass_pole_nums );mvprintw(mid_r + 1, bg_c, "Q: quit");}
void draw_frame( )
{clear();draw_wall();draw_bird();draw_pole();draw_tips();refresh();
}void get_rows_cols(int *prows, int *pcols)
{if ( !prows || !pcols)return;*prows = LINES; *pcols = COLS - 20;}void init_ncurse_settings( )
{initscr();noecho(  );timeout( 0 );curs_set( 0 );
}int process_input( int ch )
{switch ( ch ){case 'Q':case 'q':return GAME_QUIT;case 'j':case 'J':bird_fly();break;		}return GAME_NORMAL;
}int main( int argc, char *argv[])
{srand( (unsigned)time(NULL));init_ncurse_settings();get_rows_cols( &rows, &cols );set_pole_nums();bird_r = ( rows - 2) / 2;bird_c = bird_init_x;int ch;init_pole_bound();while ( 1 ) {usleep( 300000 );if ( check_hit() )break;ch = getch();int ret = process_input( ch );if ( ret == GAME_QUIT )break;bird_move();pole_move();draw_frame();}endwin();return 0;
}

4. 效果图

在这里插入图片描述

相关文章:

基于ncurse的floppy_bird小游戏

1. 需求分析 将运动分解为鸟的垂直运动和杆的左右运动。 2. 概要设计 2.1 鸟运动部分 2.2 杆的运动 3. 代码实现 #include <stdio.h> #include <ncurses.h>#include <stdlib.h> #include <time.h>int vx 0; int vy 1;int bird_r; int bird_c;int…...

创建第一个 Spring 项目(IDEA社区版)

文章目录 创建 Spring 项目创建一个普通的 Maven 项目添加 Spring 依赖IDEA更换国内源 运行第一个 Spring 项目新建启动类存储 Bean 对象将Bean注册到Spring 获取并使用 Bean 对象 创建 Spring 项目 创建一个普通的 Maven 项目 首先创建一个普通的 Maven 项目 添加 Spring 依…...

VUE3动漫影视视频网站模板源码

文章目录 1.视频设计来源1.1 主界面1.2 动漫、电视剧、电影视频界面1.3 播放视频界面1.4 娱乐前线新闻界面1.5 关于我们界面 2.效果和源码2.1 动态效果2.2 源码结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…...

Node.js-express

1.了解Ajax 1.1 什么是ajax Ajax的全称是Asynchronous Javascript And XML&#xff08;异步Js和XML&#xff09;. 通俗的理解&#xff1a;在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式&#xff0c;就是Ajax 1.2 为什么要学习Ajax 之前所学的技术&#xff0c…...

心理学笔记——我们如何思考-思想、语言和手语

我们如何思考-思想、语言和手语 研究语言的理论&#xff1a;计算理论、认知神经学、进化论 当我们讨论语言时&#xff0c;指的是英语、中文、日语这样的语言系统 所有语言都共享一些深层且复杂的共性&#xff0c;最直观的就是每一种语言都能够有效地表达抽象概念——思想、物…...

Matlab处理excel数据

我们新建个excel文档&#xff0c;用Matlab读取里面的内容&#xff0c;计算和判断里面的计算结果是否正确&#xff0c;并打印到另一个文档当中。 新建文档 新建输入文档&#xff0c;文件名TestExcel 编写脚本 [num,txt] xlsread(TestExcel.xlsx); SNcode num(:,1);%从序号中…...

某大厂关于Linux系统相关面试题

一、Linux系统和Shell 1、写一个sed命令&#xff0c;修改/tmp/input.txt文件的内容&#xff0c;要求&#xff1a;(1) 删除所有空行&#xff1b;(2) 在非空行前面加一个"AAA"&#xff0c;在行尾加一个"BBB"&#xff0c;即将内容为11111的一行改为&#xff1…...

Markdown(2篇文章学会Markdown

目录 1.文章链接&#xff1a;2.markdown可以用来解决什么问题&#xff1a;小结&#xff1a; 1.文章链接&#xff1a; Markdown&#xff08;2篇文章学会Markdown第一篇 Markdown&#xff08;2篇文章学会Markdown第二篇 2.markdown可以用来解决什么问题&#xff1a; 格式化文…...

多路IO复用服务器——select模型和poll模型

文章目录 一、多路IO复用服务器是什么&#xff1f;二、使用原理三、种类四、select模型五、select模型优缺点六、poll模型总结 一、多路IO复用服务器是什么&#xff1f; 服务器要与客户端完成tcp连接&#xff0c;并保持连接维护可用sock。 每个都需要准备一个进程管一个sock&a…...

【书生·浦语大模型实战营】学习笔记目录

【书生浦语大模型实战营01】《书生浦语大模型全链路开源体系》【书生浦语大模型实战营02】《轻松玩转书生浦语大模型趣味Demo》学习笔记【书生浦语大模型实战营03】《基于 InternLM 和 LangChain 搭建你的知识库》学习笔记【书生浦语大模型实战营04】《(4)XTuner 大模型单卡低成…...

APT32F1023X 发送RF433处理

1.硬件电路--CMT2110A 需要注意&#xff1a;发射端MCU写数据的频率要匹配&#xff0c;如果MCU发送中时间最小脉宽是1MS&#xff0c;那么它的发送需要设置为1kbps。 通过华普微USB调试工具PC软件RFPDK_V1.55查看设置是否正确。 2.RF433发送 用到的发送和接收代码来自“无线433发…...

如何做一个合格的产品经理

如何做一个合格的产品经理 如何做一个合格的产品经理 一、了解市场需求 产品经理的核心工作之一是了解市场需求。为了确保产品的成功&#xff0c;你需要密切关注市场动态&#xff0c;了解用户需求&#xff0c;分析竞争对手&#xff0c;并预测未来趋势。通过市场调查、用户访…...

Git 入门精讲

我们为什么要学习git&#xff1f; 就当下的发展而言&#xff0c;只要你从事开发就一定会接触git。作为最强大的分布式版本控制器&#xff0c;git 与 svn 有着本质上的区别。 Git是一种分布式版本控制系统&#xff0c;每个开发者都可以在本地维护完整的代码库&#xff0c;可以离…...

论文笔记(四十二)Diff-DOPE: Differentiable Deep Object Pose Estimation

Diff-DOPE: Differentiable Deep Object Pose Estimation 文章概括摘要I. 介绍II. 相关工作III. DIFF-DOPEIV. 实验结果A. 实施细节和性能B. 准确性C. 机器人-摄像机校准 V. 结论VI. 致谢 文章概括 作者&#xff1a;Jonathan Tremblay, Bowen Wen, Valts Blukis, Balakumar Su…...

设计模式:简单工厂模式

工厂设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。工厂模式属于创建型模式&#xff0c;它在创建对象时提供了一种封装机制&#xff0c;将实际创建对象的代码与使用代码分离。 …...

老龄化对投资意味着什么?

1月15日&#xff0c;国务院办公厅印发《关于发展银发经济增进老年人福祉的意见》从4个方面提出26项举措&#xff0c;为我国首个以“银发经济”命名的政策文件。 近期&#xff0c;国信证券分析师王开发布题为《银发经济再思考&#xff1a;老龄化对投资的影响》的报告&#xff0…...

从公有云对象存储迁移到回私有化 MinIO需要了解的所有信息

我们上一篇文章《如何从 AWS S3 遣返到 MinIO》的反响非常出色 - 我们已经接到了数十个企业的电话&#xff0c;要求我们提供遣返建议。我们已将这些回复汇总到这篇新文章中&#xff0c;其中我们更深入地研究了与遣返相关的成本和节省&#xff0c;以便您更轻松地进行自己的分析。…...

C#颜色拾取器

1&#xff0c;目的&#xff1a; 获取屏幕上任意位置像素的色值。 2&#xff0c;知识点: 热键的注册与注销。 /// <summary>/// 热键注册/// </summary>/// <param name"hWnd">要定义热键的窗口的句柄 </param>/// <param name"id…...

最长公共子串的问题(正常方法和矩阵法,动态规划)

题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…...

Linux实验记录:使用LVM(逻辑卷管理器)

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; 硬盘分好区或者部署为RAID磁盘阵列…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...