基于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.rhkb.cn/news/247795.html

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

相关文章

2023年算法CDO-CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法CDO-CNN-BiLSTM-ATTENTION回归预测&#xff08;matlab&#xff09; CDO-CNN-BiLSTM-Attention切诺贝利灾难优化器优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 切诺贝利灾难优化器Chernobyl Disaster Optimizer (CDO)是H. Shehadeh于202…

力扣题集(第一弹)

一日练,一日功;一日不练十日空。 学编程离不开刷题&#xff0c;接下来让我们来看几个力扣上的题目。 1. 242. 有效的字母异位词 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数…

详解OpenHarmony各部分文件在XR806上的编译顺序

大家好&#xff0c;今天我们来谈一谈编程时一个很有趣的话题——编译顺序。我知道&#xff0c;一提到编译可能大家会感到有点儿头疼&#xff0c;但请放心&#xff0c;我不会让大家头疼的。我们要明白&#xff0c;在开始写代码之前&#xff0c;了解整个程序的编译路径是十分有必…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉语言导航

专属领域论文订阅 VX 关注{晓理紫}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 为了答谢各位网友的支持&#xff0c;从今日起免费…

【国产MCU】-认识CH32V307及开发环境搭建

认识CH32V307及开发环境搭建 文章目录 认识CH32V307及开发环境搭建1、CH32V307介绍2、开发环境搭建3、程序固件下载1、CH32V307介绍 CH32V307是沁恒推出的一款基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度…

Unity3d实现简单的战斗

使用u3d实现一个简单的战斗demo&#xff0c;记下学到的知识点&#xff0c;以备后查。 1.判断鼠标是否点中制定物体 if (Input.GetMouseButton(0)) {Ray ray Camera.main.ScreenPointToRay(Input.mousePosition);if (Physics.Raycast(ray, out RaycastHit hit)){//坐标转换Ve…

Docker 安装篇(Ubuntu)

图省事一般采用第一种 一、 直接采用apt安装 apt install docker.io查看 /usr/lib/systemd/system/docker.service ubuntu默认守护进程用的&#xff1a;fd:// ps -ef | grep docker root 775237 1 0 11:14 ? 00:01:07 /usr/bin/dockerd -H fd:// --cont…

Python qt.qpa.xcb: could not connect to display解决办法

遇到问题&#xff1a;qt.qpa.xcb: could not connect to display 解决办法&#xff0c;在命令行输入&#xff1a; export DISPLAY:0 然后重新跑python程序&#xff0c;解决&#xff01; 参考博客&#xff1a;qt.qpa.xcb: could not connect to displayqt.qpa.plugin: Could …

Mysql-事务(隔离级别,事务底层原理,MVCC)

什么是事务&#xff1f;有哪些特性&#xff1f; 事务&#xff1a;事务指的是逻辑上的一组操作&#xff0c;组成这组操作的各个单元要么全都成功&#xff0c;要么全都失败。 事务特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a; 原子性是指事务是一个不…

window下如何安装ffmpeg(跨平台多媒体处理工具)

ffmpeg是什么? FFmpeg是一个开源的跨平台多媒体处理工具&#xff0c;可以用于录制、转换和流媒体处理音视频。它包含了几个核心库和工具&#xff0c;可以在命令行下执行各种音视频处理操作&#xff0c;如剪辑、分割、合并、媒体格式转换、编解码、流媒体传输等。FFmpeg支持多…

探索Java中最常用的框架:Spring、Spring MVC、Spring Boot、MyBatis和Netty

目录 前言 Spring框架 Spring MVC框架 Spring Boot框架 MyBatis框架 Netty框架 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊探索Java中最常用的框架&#xff1a;Spring、Spring MVC、Spring Boot、MyBatis和Netty&#xff0c;希…

解锁Web3:数字未来的大门

随着科技的不断推进&#xff0c;我们正站在数字时代的新门槛上。Web3&#xff0c;作为互联网的下一个演进阶段&#xff0c;正在逐渐揭开数字未来的面纱。本文将深入探讨Web3的本质、对社会的影响以及在数字时代中所扮演的关键角色。 什么是Web3&#xff1f; Web3是互联网发展的…

Mysql 更新数据

MySQL中使用UPDATE语句更新表中的记录&#xff0c;可以更新特定的行或者同时更新所有的行。基本语法结构如下&#xff1a; UPDATE table_name SET column_name1 value1,column_name2 value2,……, column_namen valuen WHERE(condition); column_name1,column_name2,……,…

嵌入式学习 Day13

一. 指针总结 1.指针概念 a.指针 --- 地址 ---内存单元编号 b.指针 --- 数据类型 ---指针类型 不同语境: 定义一个指针 //指针类型的变量 打印某个变量的指针 //指针 --地址 2.指针变量的定义 基类型 * 变量名 a.基类型 …

Python爬虫解析库安装

解析库的安装 抓取网页代码之后&#xff0c;下一步就是从网页中提取信息。提取信息的方式有多种多样&#xff0c;可以使用正则来提取&#xff0c;但是写起来相对比较烦琐。这里还有许多强大的解析库&#xff0c;如 lxml、Beautiful Soup、pyquery 等。此外&#xff0c;还提供了…

【C/C++ 02】希尔排序

希尔排序虽然是直接插入排序的升级版本&#xff0c;和插入排序有着相同的特性&#xff0c;即原始数组有序度越高则算法的时间复杂度越低&#xff08;预排序机制&#xff09;&#xff0c;但是是不稳定排序算法。 为了降低算法的时间复杂度&#xff0c;所以我们需要在排序之前尽…

美化背景(拼图小游戏)

package Puzzlegame.com.wxj.ui;import javax.swing.*; import javax.swing.border.BevelBorder; import java.util.Random;public class GameJframe extends JFrame { //游戏主界面 //创建一个二维数组//目的&#xff1a;管理数据//加载图片的时候&#xff0c;会根据二维数组中…

BabylonJS 6.0文档 Deep Dive 摄像机(六):遮罩层和多相机纹理

1. 使用遮罩层来处理多个摄影机和多网格物体 LayerMask是分配给每个网格&#xff08;Mesh&#xff09;和摄像机&#xff08;Camera&#xff09;的一个数。它用于位&#xff08;bit&#xff09;级别用来指示灯光和摄影机是否应照射或显示网格物体。默认值为0x0FFFFFFF&#xff…

【java】常见的面试问题

目录 一、异常 1、 throw 和 throws 的区别&#xff1f; 2、 final、finally、finalize 有什么区别&#xff1f; 3、try-catch-finally 中哪个部分可以省略&#xff1f; 4、try-catch-finally 中&#xff0c;如果 catch 中 return 了&#xff0c;finally 还会执行吗&#…

SpringMVC 自动配置

SpringMVC 自动配置 一、WebMvcAutoConfiguration&#xff08;SpringMVC自动配置&#xff09;二、DisPatcherServletAutoConfiguration.class&#xff08;中央调度器自动配置&#xff09;三、WebMvcConfigurationSupport&#xff08;SpringMVC组件配置类&#xff09;四、Servle…