基于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 源码结构 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/deta…...
Node.js-express
1.了解Ajax 1.1 什么是ajax Ajax的全称是Asynchronous Javascript And XML(异步Js和XML). 通俗的理解:在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式,就是Ajax 1.2 为什么要学习Ajax 之前所学的技术,…...
心理学笔记——我们如何思考-思想、语言和手语
我们如何思考-思想、语言和手语 研究语言的理论:计算理论、认知神经学、进化论 当我们讨论语言时,指的是英语、中文、日语这样的语言系统 所有语言都共享一些深层且复杂的共性,最直观的就是每一种语言都能够有效地表达抽象概念——思想、物…...
Matlab处理excel数据
我们新建个excel文档,用Matlab读取里面的内容,计算和判断里面的计算结果是否正确,并打印到另一个文档当中。 新建文档 新建输入文档,文件名TestExcel 编写脚本 [num,txt] xlsread(TestExcel.xlsx); SNcode num(:,1);%从序号中…...
某大厂关于Linux系统相关面试题
一、Linux系统和Shell 1、写一个sed命令,修改/tmp/input.txt文件的内容,要求:(1) 删除所有空行;(2) 在非空行前面加一个"AAA",在行尾加一个"BBB",即将内容为11111的一行改为࿱…...
Markdown(2篇文章学会Markdown
目录 1.文章链接:2.markdown可以用来解决什么问题:小结: 1.文章链接: Markdown(2篇文章学会Markdown第一篇 Markdown(2篇文章学会Markdown第二篇 2.markdown可以用来解决什么问题: 格式化文…...
多路IO复用服务器——select模型和poll模型
文章目录 一、多路IO复用服务器是什么?二、使用原理三、种类四、select模型五、select模型优缺点六、poll模型总结 一、多路IO复用服务器是什么? 服务器要与客户端完成tcp连接,并保持连接维护可用sock。 每个都需要准备一个进程管一个sock&a…...
【书生·浦语大模型实战营】学习笔记目录
【书生浦语大模型实战营01】《书生浦语大模型全链路开源体系》【书生浦语大模型实战营02】《轻松玩转书生浦语大模型趣味Demo》学习笔记【书生浦语大模型实战营03】《基于 InternLM 和 LangChain 搭建你的知识库》学习笔记【书生浦语大模型实战营04】《(4)XTuner 大模型单卡低成…...
APT32F1023X 发送RF433处理
1.硬件电路--CMT2110A 需要注意:发射端MCU写数据的频率要匹配,如果MCU发送中时间最小脉宽是1MS,那么它的发送需要设置为1kbps。 通过华普微USB调试工具PC软件RFPDK_V1.55查看设置是否正确。 2.RF433发送 用到的发送和接收代码来自“无线433发…...
如何做一个合格的产品经理
如何做一个合格的产品经理 如何做一个合格的产品经理 一、了解市场需求 产品经理的核心工作之一是了解市场需求。为了确保产品的成功,你需要密切关注市场动态,了解用户需求,分析竞争对手,并预测未来趋势。通过市场调查、用户访…...
Git 入门精讲
我们为什么要学习git? 就当下的发展而言,只要你从事开发就一定会接触git。作为最强大的分布式版本控制器,git 与 svn 有着本质上的区别。 Git是一种分布式版本控制系统,每个开发者都可以在本地维护完整的代码库,可以离…...
论文笔记(四十二)Diff-DOPE: Differentiable Deep Object Pose Estimation
Diff-DOPE: Differentiable Deep Object Pose Estimation 文章概括摘要I. 介绍II. 相关工作III. DIFF-DOPEIV. 实验结果A. 实施细节和性能B. 准确性C. 机器人-摄像机校准 V. 结论VI. 致谢 文章概括 作者:Jonathan Tremblay, Bowen Wen, Valts Blukis, Balakumar Su…...
设计模式:简单工厂模式
工厂设计模式属于创建型模式,它提供了一种创建对象的最佳方式。工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。工厂模式属于创建型模式,它在创建对象时提供了一种封装机制,将实际创建对象的代码与使用代码分离。 …...
老龄化对投资意味着什么?
1月15日,国务院办公厅印发《关于发展银发经济增进老年人福祉的意见》从4个方面提出26项举措,为我国首个以“银发经济”命名的政策文件。 近期,国信证券分析师王开发布题为《银发经济再思考:老龄化对投资的影响》的报告࿰…...
从公有云对象存储迁移到回私有化 MinIO需要了解的所有信息
我们上一篇文章《如何从 AWS S3 遣返到 MinIO》的反响非常出色 - 我们已经接到了数十个企业的电话,要求我们提供遣返建议。我们已将这些回复汇总到这篇新文章中,其中我们更深入地研究了与遣返相关的成本和节省,以便您更轻松地进行自己的分析。…...
C#颜色拾取器
1,目的: 获取屏幕上任意位置像素的色值。 2,知识点: 热键的注册与注销。 /// <summary>/// 热键注册/// </summary>/// <param name"hWnd">要定义热键的窗口的句柄 </param>/// <param name"id…...
最长公共子串的问题(正常方法和矩阵法,动态规划)
题目: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…...
Linux实验记录:使用LVM(逻辑卷管理器)
前言: 本文是一篇关于Linux系统初学者的实验记录。 参考书籍:《Linux就该这么学》 实验环境: VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: 硬盘分好区或者部署为RAID磁盘阵列…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
