Flappy bird小游戏

2024-06-01 22:04
文章标签 flappy bird 小游戏

本文主要是介绍Flappy bird小游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Ncurses库

        (1):Ncurses向用户提供了一个灵活高效的应用程序接口(API),它提供了创建窗口界面,移动光标,产生颜色以及处理键盘按键等功能。通俗点来说,它就是一个管理应用程序在字符终端显示的函数库。

        (2):安装Ncurses库的命令--> sudo apt-get install libncurses5-dev

        (3):在本项目中使用到的函数

 initscr(void);
    是curses模式的入口。将终端屏幕初始化为curses模式,为当前屏幕和相关的数据结构分配内存。

int  endwin(void); 
    是curses模式的出口,退出curses模式,释放curses子系统和相关数据结构占用的内存。

int curs_set(int visibility);                 设置光标是否可见,visibility:0(不可见),1(可见)

 int move(int  new_y, int  new_x);                 将光标移动到new_y所指定的行和new_x所指定的列

int addch(const  chtype  char);              在当前光标位置添加字符 

int  refresh(void);                 刷新物理屏幕。将获取的内容显示到显示器上。    

int  keypad(WINDOW  *window_ptr,  bool  key_on); 
    允许使用功能键。exp:keypad(stdscr,1);//允许使用功能按键

int getch(void);                         读取键盘输入的一个字符 

chtype inch(void);                 获取当前光标位置的字符。
    注:curses有自己的字符类型chtype,使用时强制类型转换为char

int start_color(void);                         启动color机制,初始化当前终端支持的所有颜色

int init_pair(short  pair_number,  short  foreground,  short  background);        配置颜色对        
    COLOR_BLACK         黑色        COLOR_MAGENTA      品红色
    COLOR_RED           红色        COLOR_CYAN          青色
    COLOR_GREEN         绿色        COLOR_WHITE      白色
    COLOR_YELLOW     黄色       COLOR_BLUE       蓝色

int  COLOR_PAIR(int  pair_number); 
            设置颜色属性,设置完颜色对,可以通过COLOR_PAIR实现

int  attron(chtype  attribute);          启用属性设置

int  attroff(chtype  attribute);         关闭属性设置

二、运行代码

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <signal.h>
#include <sys/time.h>

#define BIRD '@'    //@表示小鸟
#define BLANK ' '   //空格表示空格
#define PIPE '+'   //+表示管道
int bird_y,bird_x;    //小鸟坐标


/*定义关于管道的结构体*/
typedef struct Pipe{
    int x;  //列坐标
    int y;  //横坐标
    struct Pipe *next;
}Pipe_node,*Pipe_list;
Pipe_list head,tail;   //头尾结点
                       
/*创建链表*/
void creat_list(){
    int i;
    Pipe_list p,new;
    head = (Pipe_list)malloc(sizeof(Pipe_node));
    head->next = NULL;
    p = head;

    for(i=0;i<6;i++){
        new = (Pipe_list)malloc(sizeof(Pipe_node));
        new->x = (i+1)*20;
        new->y = rand()%11+5;  //管道5-15行
        new->next = NULL;
        p->next = new;
        p = new;
    }
    tail = p;
}


/*显示管道*/
void show_pipe(){
    Pipe_list p;
    int i,j;
    p = head->next;
    attron(COLOR_PAIR(2));
    while(p){
        for(i=p->x;i<p->x+10;i++){
            /*创建上半部分管道*/
            for(j=0;j<p->y;j++){
                move(j,i);
                addch(PIPE);
            }
            /*创建下半部分管道*/
            for(j=p->y+5;j<25;j++){
                move(j,i);
                addch(PIPE);
            }
        }
        refresh();
        p = p->next;
    }
    attroff(COLOR_PAIR(2));
}


/*清除管道*/
void clear_pipe(){
    Pipe_list p;
    int i,j;
    p = head->next;
    while(p){
        for(i=p->x;i<p->x+10;i++){
            /*清除上半部分管道*/
            for(j=0;j<p->y;j++){
                move(j,i);
                addch(BLANK);
            }
            /*清除下半部分管道*/
            for(j=p->y+5;j<25;j++){
                move(j,i);
                addch(BLANK);
            }
        }
        refresh();
        p = p->next;
    }

}


/*移动管道*/
void move_pipe(){
    Pipe_list p;
    p = head->next;
    while(p){
        p->x--;
        p = p->next;
    }
}


/*初始化Ncurses库*/
void init_curses(){
    initscr();    //进入curses模式
    curs_set(0);   //禁止光标显示
    noecho();    //禁止输入字符显示
    keypad(stdscr,1);    //允许功能键在当前窗口使用
    start_color();        //启动颜色机制
    init_pair(1,COLOR_WHITE,COLOR_RED);   //设置小鸟颜色,字体白色,背景红色
    init_pair(2,COLOR_WHITE,COLOR_GREEN);   //设置管道颜色
    
}
/*设置定时器,参数为毫秒(ms)*/
int set_timer(int ms_t){
    struct itimerval timer;
    long t_sec,t_usec;
    int ret;
    t_sec = ms_t / 1000;  //s
    t_usec = (ms_t % 1000) * 1000;  //us
    
    timer.it_value.tv_sec = t_sec;
    timer.it_value.tv_usec = t_usec;  //首次启动定时值
    timer.it_interval.tv_sec = t_sec;
    timer.it_interval.tv_usec = t_usec;  //之后每次启动的定时值
    
    ret = setitimer(ITIMER_REAL,&timer,NULL);    //启动定时器
    
    return ret;
}


/*显示小鸟*/
void show_bird(){
    attron(COLOR_PAIR(1));
    move(bird_y,bird_x);
    addch(BIRD);
    refresh();
    attroff(COLOR_PAIR(1));
}


/*清除小鸟*/
void clear_bird(){
    move(bird_y,bird_x);
    addch(BLANK);
    refresh();

}


/*移动小鸟*/
void move_bird(){
    char key;
    while(1){
        key = getch();
        if(key==' '){
            clear_bird();
            bird_y--;
            show_bird();
            /*游戏结束判断*/
            if((char)inch()==PIPE){
                set_timer(0);   //停止定时
                endwin();    //退出模式
                exit(0);    //结束程序
            }
        }
    }
}

void handler(int sig){
    Pipe_list p,new;
    //小鸟下落
    clear_bird();
    bird_y++;
    show_bird();
    //管道的循环创建
    p = head->next;
    if(p->x==0){
        int i,j;
        head->next = p->next;
        for(i=p->x;i<p->x+10;i++){
            /*清除上半部分管道*/
            for(j=0;j<p->y;j++){
                move(j,i);
                addch(BLANK);
            }
            /*清除下半部分管道*/
            for(j=p->y+5;j<25;j++){
                move(j,i);
                addch(BLANK);
            }
            refresh();
        }
        free(p);
        new = (Pipe_list)malloc(sizeof(Pipe_node));
        new->x = tail->x+20;
        new->y = rand()%11+5;
        new->next = NULL;
        tail->next = new;
        tail = new;
    }
    /*游戏结束判断*/
    if((char)inch()==PIPE){
        set_timer(0);   //停止定时
        endwin();    //退出模式
        exit(0);    //结束程序            
    }
    //管道左移
    clear_pipe();
    move_pipe();
    show_pipe();
}

/*主函数*/
int main(int argc,const char *argv[]){
    bird_y = 15; //行
    bird_x = 15; //列
    init_curses();
    signal(SIGALRM,handler);
    set_timer(500);  //定时时间为500毫秒
    srand(time(0));  //随机种子:每次启动的管道长度不一样
    creat_list();
    show_pipe();
    show_bird();
    move_bird();
    return 0;
}
 

编译程序时要链接到Ncurses库即添加参数  -lncurses

这篇关于Flappy bird小游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022221

相关文章

贪吃蛇的小游戏--用C语言实现

贪吃蛇的小游戏–用C语言实现 游戏背景 贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 实现基本的功能: • 贪吃蛇地图绘制 • 蛇吃⻝物的功能 (上、下、左、右⽅向键控制蛇的动作) • 蛇撞墙死亡 • 蛇撞⾃⾝死亡 • 计算得分 • 蛇⾝加速、减速 • 暂停游戏 技术要点 C语⾔函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32

MFC对话框贪吃蛇小游戏

花了近一个月的时间,学习了一下VC++深入详解,做了个贪吃蛇小游戏,虽然有很多的瑕疵,但还是想分享一下战果。 说一下思路: ①我们要绘制图形,我们可以用CClientDC(客户区设备上下文,与特定的窗口关联)声明一个dc对象作图。 当然这里我们要画蛇的身体和食物,设置一个食物类和蛇身体结构体 ②我们如何让图形动起来?SetTimer创建一个计时器,KillTimer()用来销毁计时器

GameFi生存法则:从巨头争霸到小游戏革命,掀起区块链游戏的全新风暴

随着区块链技术的飞速发展,GameFi(游戏与去中心化金融的结合)正成为加密世界的一个重要领域。然而,随着时间的推移,这一领域也经历了显著的演变,从最初的3A大作到如今流行的Telegram小游戏,这种变化不仅反映了市场需求的转变,也揭示了GameFi如何在生存与繁荣之间找到平衡。 一、GameFi 的演变:从 3A 大作到 Telegram 小游戏 不同类型 GameFi 项目的优劣 Ga

Unity实战案例 2D小游戏HappyGlass(模拟水珠)

本案例素材和教程都来自Siki学院,十分感谢教程中的老师 本文仅作学习笔记分享交流,不作任何商业用途 预制体   在这个小案例中,水可以做成圆形但是带碰撞体,碰撞体比图形小一圈,顺便加上Trail renderer组件   材质 将碰撞材质的friction为0,bonciness可以按照需要修改 脚本  生成水珠的脚本并不难, 只是需要创建大量实例化对象的时候,加一个携程

UNO小游戏2

前言 hello,大家好我是文宇。最近也是抽出时间更一期了。 bug还是很多(恼),所以就当个乐子看看,反正后面还会有的,先把这玩意儿发了再说。 正文 #include<bits/stdc++.h>#include<windows.h>using namespace std;bool can = 1;int colorsz1[25];int cardsz1[25];int co

flappy bird js 源码

素材 注入灵魂 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>#canvas{background-image:

C++战列舰小游戏Lv. 1.2版本(半成品)

这是一组初始数据: a[1].gas=1000;     a[1].attack=0;     a[1].att_1=0;     a[1].att_2=0;     a[1].att_3=0;     a[1].att_4=0;     a[1].fire=0;     a[1].gas_good=0.9;     a[1].guard=0;     a[1].HP=15000;     a[

C++实现简易俄罗斯方块小游戏

实现一个简易的俄罗斯方块(Tetris)游戏涉及多个方面,包括图形显示、游戏逻辑、用户输入等。下面是一个简化版本的俄罗斯方块游戏的实现步骤和代码示例。这个实现会使用 C++ 和一个简单的图形库——如 SFML(Simple and Fast Multimedia Library),这是一个非常适合游戏开发的跨平台图形库。 1. 环境准备 -安装 SFML: 你可以从 SFML 官网 下载适合你

Unity实战案例 2D小游戏HappyGlass(画笔摇晃效果)

本案例素材和教程都来自Siki学院,十分感谢教程中的老师 本文仅作学习笔记分享交流,不作任何商业用途 using System.Collections;using System.Collections.Generic;using UnityEngine;public class Pencil : MonoBehaviour{//摆动速度public float pencilSpeed

第一次使用Egret开发微信小游戏经验总结(包括排行榜排序,每周一数据清零,超越好友等处理)

转自:https://blog.csdn.net/xw1110280055/article/details/82469825 最近项目组立项了个小游戏,用Egret(白鹭)开发,本来游戏核心功能2天就完成了,后来准备接入微信好友排行榜的时候,用到了子域,加入分享给好友的时候,图片合成后分享给微信好友有时候不能显示出图片内容。现整理一下,避免大家踩坑。 好友排行榜微信只让我们在开放数据域(后文都简