基于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. 效果图

在这里插入图片描述

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

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

相关文章

【计网·湖科大·思科】实验五 IPV4地址-分类地址和构建超网

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

【网络】传输层TCP协议 | 三次握手 | 四次挥手

目录 一、概述 2.1 运输层的作用引出 2.2 传输控制协议TCP 简介 2.3 TCP最主要的特点 2.4 TCP连接 二、TCP报文段的首部格式 三、TCP的运输连接管理 3.1 TCP的连接建立(三次握手) 3.2 为什么是三次握手&#xff1f; 3.3 为何两次握手不可以呢&#xff1f; 3.4 TCP的…

STM32-电动车报警器

STM32-电动车报警器 1.振动传感器点亮LED灯 需求:当振动传感器接收到振动信号时&#xff0c;使用中断方式点亮LED1 //重写中断服务函数&#xff0c;如果检测到EXTI中断请求&#xff0c;则进入此函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {//一根中断线上接有多个…

leetcode刷题(剑指offer) 50.Pow(x, n)

50.Pow(x, n) 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出&#x…

江科大stm32学习笔记5——蜂鸣器

目录 一、接线 二、代码部分 三、查看库函数的方法 一、接线 蜂鸣器选择有源高电平触发蜂鸣器。 GND——GND VCC——正极 I/O——B12 注意&#xff1a;32上的PA15、PB3、和PB4是默认调试端口&#xff0c;如果使用需要进行额外配置&#xff0c;一般避开这三个端口。 二、…

2024 年, Web 前端开发趋势

希腊哲学家赫拉克利特认为&#xff0c;变化是生命中唯一不变的东西。这句话适用于我们的个人生活、行业和职业领域。 尤其是前端开发领域&#xff0c;新技术、开发趋势、库和框架不断涌现&#xff0c;变化并不陌生。最近发生的一些事件正在改变开发人员构建网站和 Web 应用的方…

图像复原的天花板在哪里?SUPIR:开创性结合文本引导先验和模型规模扩大

SUPIR&#xff08;Scaling-UP Image Restoration&#xff09;&#xff0c;这是一种开创性的图像复原方法&#xff0c;利用生成先验和模型扩大规模的力量。通过利用多模态技术和先进的生成先验&#xff0c;SUPIR在智能和逼真的图像复原方面取得了重大进展。作为SUPIR中的关键催化…

项目解决方案:市小区高清视频监控平台联网整合设计方案(上)

目 录 一、项目需求 1.1业务需求 1.2技术需求 1.3 环境要求 1.3.1 硬件要求 1.3.2 技术服务要求 二、系统设计方案 2.1 视频监控平台基础功能设计 2.2 视频资源及联网设备编码与管理设计 2.2.1 全省现有联网视频资源属性 2.2.2 视频资源编码具体格…

鸿蒙OS之Rust开发

背景 Rust是一门静态强类型语言&#xff0c;具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。 OpenHarmony为了集成C/C 代码和提升编译速度&#xff0c;使用了GN Ninja的编译构建系统。GN的构…

认识产品经理 一个合格的产品经理 产品经理分类

目录 一.合格的产品经理 什么是产品 什么是产品经理 合格的产品经理 什么是产品&#xff1f;区别是&#xff1f; 什么是产品经理 合格的产品经理需要关注哪些核心问题&#xff1f; 二.产品经理分类 为什么会有不同类型 都有那些类型 根据不同类型的职责特点规划个人…

LAN安全及概念

实验大纲 一、终端安全 1.当前比较流行的网络攻击 2.常见的网络安全设备 3.终端受到攻击的主要途径 4.传统的基于主机的安全防护手段 二、访问控制 1.本地口令验证 2.AAA组成 3.身份验证 4.记账 5. 802.1X 三、第2层安全威胁 交换机攻击分类 四、MAC地址表 MAC地…

CC核心内容

目录 标准流: 盒子模型: 1.标准盒子模型 2.怪异盒子模型 浮动: 定位: 标准流、盒子模型、浮动、定位 Div是一个块级元素&#xff0c;span是内行元素 div元素通常用于创建一个独立的区块&#xff0c;它会单独占据一行或多行的空间 span元素通常用于包裹文本或内行元素&…