基于ncurse的floppy_bird小游戏

news2025/2/26 17:45:53

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.coloradmin.cn/o/1416082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML5和CSS3的新特性

HTML5的新特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等 1&#xff0c;HTML5新增的语义化标签 <header> 头部标签 <nav> 导航标签 <article> …

1 月 28日算法练习-前缀和

小郑的蓝桥平衡串 思路&#xff1a;把 L 看成 1&#xff0c;Q 看成 -1&#xff0c;利用前缀和来得到输入串的前缀子串中LQ 的和&#xff0c;利用前缀和差的性质得到子串&#xff0c;通过枚举看它是否平衡。 将L看做1&#xff0c;Q看做&#xff0d;1&#xff0c;只有当某个区间…

Django实战

一、开发登录表单 def login_form(request):html <html><body><form method"post">用户名:<input name "username" type"text"></input></br>密码&#xff1a;<input name "password" type…

ARM常用汇编指令

文章目录 前言一、处理器内部数据传输指令MOV&#xff1a; 将数据从一个寄存器复制到另一个寄存器。MRS&#xff1a; 将特殊寄存器(CPSR,SPSR)中的数据传给通用寄存器。MSR&#xff1a; 将通用寄存器中的数据传给特殊寄存器(CPSR,SPSR)。 二、存储器访问指令LDR:用于从内存中加…

5G赋能智慧文旅:科技与文化的完美结合,打造无缝旅游体验,重塑旅游业的未来

一、5G技术&#xff1a;智慧文旅的强大引擎 5G技术的起源可以追溯到2010年&#xff0c;当时世界各国开始意识到4G技术已经达到了瓶颈&#xff0c;无法满足日益增长的移动通信需求。2013年&#xff0c;国际电信联盟&#xff08;ITU&#xff09;成立了5G技术研究组&#xff0c;开…

力扣LCR 180. 文件组合(双指针)

Problem: LCR 180. 文件组合 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 本题目可以利用滑动窗口的技巧&#xff08;滑动窗口就是双指针的运用&#xff09;解决&#xff0c;具体实现如下 1.逻辑上生成窗口&#xff1a;让两个指针i&#xff0c;j分别初始化为1…

IPv6报文格式(全网最详细)

IPv6报文格式 报文格式 图1 IPv6报文头格式 表1 IP头字段解释 字段长度含义Version4比特 4&#xff1a;表示为IPV4&#xff1b;6&#xff1a;表示为IPV6。Traffic class8比特流量类别。该字段及其功能类似于IPv4的业务类型字段。该字段以区分业务编码点&#xff08;DSCP&…

203.移除链表元素(力扣LeetCode)

文章目录 203.移除链表元素题目描述原链表删除元素虚拟头节点 203.移除链表元素 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head …

基于Micropython利用ESP32-C3驱动墨水屏显示图片

从咸鱼上淘了两块2.9寸的墨水屏价签&#xff0c;可以结合ESP32-C3做个低功耗的时钟温湿度计。 1、所需硬件 合宙的ESP32-C3&#xff1a; 电子价签拆出来的2.9寸墨水屏&#xff1a; ——电子价签型号为&#xff1a;Stellar-L&#xff0c;墨水屏型号为&#xff1a;E029A01。电子…

Less-1(sqlmap自动注入攻击)--sqli

环境准备 打开火狐浏览器&#xff0c;进入sqli第一关的页面 工具准备 sqlmap 参数解释 -u URL 指定目标URL进行注入测试。--dataDATA指定POST请求的数据进行注入测试--cookieCOOKIE指定用于身份验证的cookie进行注入测试-p PARAMETER指定要测试的参数--levelLEVEL设置测试的深…

[260. 只出现一次的数字 III](C语言题解)(位运算)(力扣)

> Problem: [260. 只出现一次的数字 III](260. 只出现一次的数字 III - 力扣&#xff08;LeetCode&#xff09;) # 思路 > 想到数组中只有一个数只出现了一次的解法&#xff1a;**所有数异或&#xff0c;最后答案就是那个只出现一次的数**&#xff0c;该题只需将两个不…

Java技术栈 —— Hadoop入门(二)

Java技术栈 —— Hadoop入门&#xff08;二&#xff09; 一、用MapReduce对统计单词个数1.1 项目流程1.2 可能遇到的问题1.3 代码勘误1.4 总结 一、用MapReduce对统计单词个数 1.1 项目流程 (1) 上传jar包。 (2) 上传words.txt文件。 (3) 用hadoop执行jar包的代码&#xff0c;…

HarmonyOS 鸿蒙应用开发 (七、HTTP网络组件 axios 介绍及封装使用)

在HarmonyOS应用开发中&#xff0c;通过HTTP访问网络&#xff0c;可以使用官方提供的ohos.net.http模块。但是官方提供的直接使用不太好使用&#xff0c;需要封装下才好。推荐使用前端开发中流行的axios网络客户端库&#xff0c;如果是前端开发者&#xff0c;用 axios也会更加顺…

FOC系列(五)----STM32F405RGT6控制板焊接与初步编写代码

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。    首先祝大家新年快乐&#xff0c;因为我也快放假了&#xff0c;驱动板只能是开学之后再去测试了&#xff0c;本篇博客应该是本专栏年前的最后一篇了 一…

QT 范例阅读:Vector Deformation

效果图&#xff1a; 主要代码&#xff1a; 实现放大镜效果QPainter painter;//两种方式if (1) {m_lens_image QImage(bounds.size(), QImage::Format_ARGB32_Premultiplied);m_lens_image.fill(0);painter.begin(&m_lens_image);} else {m_lens_pixmap QPixmap(bounds.si…

GEE数据集——2024 年日本海地震的紧急观测数据

2024 年日本海地震的紧急观测数据 2024 年日本海地震发生在 2024 年 1 月 1 日下午 4:00 后&#xff08;日本时间&#xff09;&#xff0c;造成了重大损失&#xff0c;包括多处建筑物倒塌、山体滑坡和火灾。应日本国内防灾机构的请求&#xff0c;JAXA 利用 ALOS-2 对灾害发生当…

计算机网络-编制与调制(基带信号 基带传输 宽度信号 宽度传输 编码 调制 )

文章目录 基带信号与宽带信号编码与调制数字数据编码为数字信号数字数据调制为模拟信号模拟数据编码为数字信号模拟数据调制为模拟信号小结 基带信号与宽带信号 信道上传输的信号除了可以分为数字信号和模拟信号&#xff0c;也可以分为基带信号和宽带信号&#xff0c;只是分类…

安利6款免费又高清的视频转GIF方法,值得收藏

前言 平时我们在聊天的时候会发的很多有趣表情包&#xff0c;其实有些就是视频里面的画面&#xff0c;觉得好玩有趣就被网友转换成了GIF&#xff0c;聊天的时候就可以用这些表情包来代表当时的心情。 如何将视频转成GIF动图&#xff1f;对于还不知道怎么将视频转成GIF的朋友&a…

vmware-VCSA6.0部署

下载vcsa的iso包&#xff0c;解压后首先安装VMware-ClientIntegrationPlugin-6.0.0-6823256.exe 如果不配置域名配置成ip地址也可以 https://172.16.51.202/

我爱这夜色茫茫

夜来香 - 李香兰 那南风吹来清凉 那夜莺啼声细唱月下的花儿都入梦 只有那夜来香 吐露着芬芳 我爱这夜色茫茫 也爱这夜莺歌唱 更爱那花一般的梦 拥抱着夜来香 吻着夜来香夜来香我为你歌唱 夜来香我为你思量 啊~啊我为你歌唱 我为你思量 我爱这夜色茫茫 也爱这夜莺歌唱更爱那花…