项目实战:基于Linux的Flappy bird游戏开发

一、项目介绍

项目总结

        1.按下空格键小鸟上升,不按小鸟下落

        2.搭建小鸟需要穿过的管道

        3.管道自动左移和创建

        4.小鸟撞到管道游戏结束

知识储备

        1.C语言

        2.数据结构-链表

        3.Ncurses库

        4.信号机制

二、Ncurses库介绍

         Ncurses是最早的System V Release 4.0 (SVr4)中 curses的一个克隆和升级。这是一个可自由配置的库,完全兼容旧版本curses。

        Ncurses构成了一个工作在底层终端代码之上的封装,并向用户提供了一个灵活高效的API(Application Programming Interface 应用程序接口)。它提供了创建窗口界面,移动光标,产生颜色,处理键盘按键等功能。使程序员编写应用程序不需要关心那些底层的终端操作。

        简而言之,它是一个管理应用程序在字符终端显示的函数库。

Ncurses库函数

注:安装命令:sudo apt-get install libncurses5-dev
       为了能够使用Ncurses库,必须在源程序中将#include<curses.h>包括进来,而且在编译的需要与它链接起来. 
       在gcc中可以使用参数-lncurses进行编译.

1.  initscr(void);

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

2.  int  endwin(void); 

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

3.  int curs_set(int visibility); 

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

4.  int move(int  new_y, int  new_x);

    将光标移动到new_y所指定的行和new_x所指定的列

5.  int addch(const  chtype  char); 

    在当前光标位置添加字符

6. int  refresh(void); 

    刷新物理屏幕。将获取的内容显示到显示器上。

7.  int  keypad(WINDOW  *window_ptr,  bool  key_on); 

    允许使用功能键。exp:keypad(stdscr,1);//允许使用功能按键

8.  int getch(void); 

    读取键盘输入的一个字符

9. chtype inch(void); 

    获取当前光标位置的字符。

    注:curses有自己的字符类型chtype,使用时强制类型转换为char

10. int start_color(void); 

    启动color机制,初始化当前终端支持的所有颜色

11. 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              蓝色

12. int  COLOR_PAIR(int  pair_number); 

    设置颜色属性,设置完颜色对,可以通过COLOR_PAIR实现

13. int  attron(chtype  attribute); 

    启用属性设置

14. int  attroff(chtype  attribute); 

    关闭属性设置

Ncurses库安装

        安装命令:sudo apt-get install libncurses5-dev

        注:为了能够使用Ncurses库,必须在源程序中将#include<curses.h>包括进来,而且在编译的需要与它链接起来. 在gcc中可以使用参数-lncurses进行编译。

编译gcc surses.c -o  curses -lncurses

三、信号

        在Linux中,软中断信号(signal,简称为信号)是在软件层次上对中断的一种模拟,用来通

知进程发生了异步事件。内核可以因为内部事件而给进程发送信号,通知进程发生了某个事件。

信号响应的方式:

        1.忽略信号,即对信号不做任何处理;

        2.捕捉信号,即信号发生时执行用户自定义的信号处理函数。

        3.执行缺省操作,Linux对每种信号都规定了默认操作。

设置信号相应方式-signal

#include  <unistd.h>
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);成功时返回原先的信号处理函数,失败时返回SIG_ERRsignum:指明了所要处理的信号类型handler:描述了与信号关联的动作SIG_DFL代表缺省方式; SIG_IGN 代表忽略信号;指定的信号处理函数代表捕捉方式
signal函数-示例
// 头文件省略
void handler (int signo) {printf(“HELLO!\n”);
}
int  main() {signal(SIGINT, handler);while ( 1 ) ;return 0;
}
设置定时器
struct itimerval {struct timeval it_interval; /* 计时器重新启动的间歇值 */struct timeval it_value;    /* 计时器安装后首次启动的初};                               始值,之后就没有用 */
struct timeval {long tv_sec;       /* 秒 */long tv_usec;      /* 微妙*/
};

计时器的实现

int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue)

参数:

which:间歇计时器类型,ITIMER_REAL      //数值为0,发送的信号是SIGALRM。struct itimerval *value:将value指向的结构体设为计时器的当前值,
struct itimerval *ovalue:保存计时器原有值。一般设置为NULL。返回值: 成功返回0。失败返回-1。

四、项目功能实现

项目安排

阶段1:初始化工作,小鸟功能实现

阶段2:管道功能实现

        1.创建链表

        2.显示管道

        3.清除管道

        4.移动管道

阶段3:完善代码,进行项目总结

        1.判断游戏结束:小鸟与管道碰到

        2.循环创建管道

        3.为管道和小鸟添加色彩

代码功能

#include <stdio.h>
#include <curses.h>
#include <signal.h>
#include <sys/time.h>
#include <stdlib.h>
#define BIRD '@'
#define BLANK ' '
#define PIPE '+'
/*定义关于管道的结构体*/
typedef struct Pipe{int x;//列坐标int y;//横坐标struct Pipe *next;
}Pipe_node, *Pipe_list;Pipe_list head, tail;void creat_list();//创建链表
void show_pipe();//显示管道
void clear_pipe();//清除管道
void move_pipe();//移动管道int bird_y, bird_x;//小鸟坐标void show_bird();//显示小鸟
void clear_bird();//清除小鸟
void move_bird();//移动小鸟void init_curses();//curses库初始化
int set_timer(int ms_t);//设置定时器--ms
void handler(int sig);//信号处理函数int main(int argc, const char *argv[])
{bird_y = 15;//行bird_x = 10;//列init_curses();signal(SIGALRM, handler);set_timer(500);//500mssrand(time(0));//随机种子creat_list();show_pipe();show_bird();move_bird();return 0;
}
void init_curses()//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);//管道颜色设置
}
int set_timer(int ms_t)//设置定时器--ms
{struct itimerval timer;long t_sec,t_usec;int ret;t_sec = ms_t / 1000; //st_usec = (ms_t % 1000) * 1000;//ustimer.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 handler(int sig)
{Pipe_list p, new;int i,j;/*小鸟下落*/clear_bird();bird_y++;show_bird();/*游戏结束判断*/if((char)inch() == PIPE){set_timer(0);endwin();exit(1);}p = head->next;if(p->x == 0){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;}/*管道移动*/clear_pipe();move_pipe();show_pipe();
}
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(1);}}}
}
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 < 5; 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;}}

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

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

相关文章

抖音小程序看广告变现秘籍:构建用户粘性与点击收益长期价值解析

在抖音小程序看广告变现的宏伟蓝图中&#xff0c;构建用户粘性和挖掘用户长期价值是核心环节&#xff0c;这是实现丰厚收益和打造高效盈利新引擎的重要保障。 要构建用户粘性&#xff0c;首先要提供优质且持续更新的内容。以一个知识科普类小程序为例&#xff0c;需要不断推出新…

Java学习路线:Maven(三)继承关系

目录 实现继承 依赖管理 实现继承 在maven中&#xff0c;也存在继承关系&#xff0c;允许一个项目继承另一个项目的配置信息 那么&#xff0c;如何实现项目的继承呢&#xff1f; 在idea中&#xff0c;右键父项目文件夹&#xff0c;点击新建模组&#xff0c;就可以新建一个该父…

L0G1000:Linux+InternStudio 闯关作业

1. 配置基础环境 首先&#xff0c;打开 Intern Studio 界面&#xff0c;点击 创建开发机 配置开发机系统。 InternStudio 填写 开发机名称 后&#xff0c;点击 选择镜像 使用 Cuda11.7-conda 镜像&#xff0c;然后在资源配置中&#xff0c;使用 10% A100 * 1 的选项&#xff…

【ArcGISPro】单次将自己建立的工具箱添加至Arcpy中

新建工具箱 添加至Arcpy中 调用刚添加的工具箱

【vue2.7.16系列】手把手教你搭建后台系统__登录使用状态管理(15)

使用store进行登录信息管理 其实就是把登录放到vuex的actions中去执行&#xff0c;然后保存用户信息、权限等 在store/modules/account.js中添加如下代码&#xff1a; import { login, logout, getInfo, menusApi } from /api/account; // getExpiresTime import {getToken,s…

Java项目实战II基于Spring Boot的秒杀系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在互联网电商蓬勃发展的今天&#xff0…

HTML5实现小鸟过管道小游戏源码

文章目录 1.设计来源1.1 主界面1.2 游戏中主界面1.3 游戏结束界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/…

检查系统是否安装 OpenSSH,root 用户无法登录问题处理

一、检查系统是否安装 OpenSSH 在进行服务器配置和管理相关的操作时&#xff0c;我们常常需要确定系统是否已经安装了某些关键的服务和工具&#xff0c;OpenSSH 就是其中之一。它为我们提供了安全的远程登录和文件传输等重要功能。 Ubuntu 系统&#xff1a;Ubuntu 作为一款广…

基础算法练习--滑动窗口(日更中)

算法介绍 滑动窗口算法来自tcp协议的一种特性,它的高效使得其也变成了算法题的一种重要考点.滑动窗口的实现实际上也是通过两个指针前后遍历集合实现,但是因为它有固定的解题格式,我将其单独做成一个篇章. 滑动窗口的解题格式: 首先,定义两个指针left和right,与双指针不同的…

C#如何快速获取P/Invoke方法签名

使用API函数已经好几年了&#xff0c;封装函数签名基本是参照MSDN上的文档&#xff0c;然后再做数据类型对应。 虽然有 pinvoke.net 这个网站&#xff0c;但基本很少使用。一方面是想多动手&#xff0c;另一方面是因为各种数据类型基本都用过了&#xff0c;都能自己在C#中 对应…

人脑与机器连接:神经科技的伦理边界探讨

内容概要 在当今科技飞速发展的时代&#xff0c;人脑与机器连接已成为一个引人注目的前沿领域。在这一背景下&#xff0c;神经科技的探索为我们打开了一个全新的世界&#xff0c;从脑机接口到人工智能的飞跃应用&#xff0c;不仅加速了技术的进步&#xff0c;更触动了我们内心…

这么多优秀的 AI 大模型,我应该选择哪个呢?

前两次&#xff0c;我们向大家介绍了当前全球最有名的总共 11 个 AI 大模型。在此期间&#xff0c;openAI 于 8月 6 日 最新推出另了一个超强 AI 大模型 —— GPT-4o&#xff08;Aug 6&#xff09;&#xff0c;强势跻入全球前列。不得不说&#xff0c;这才多久&#xff0c;open…

Flutter鸿蒙next 使用 BLoC 模式进行状态管理详解

1. 引言 在 Flutter 中&#xff0c;随着应用规模的扩大&#xff0c;管理应用中的状态变得越来越复杂。为了处理这种复杂性&#xff0c;许多开发者选择使用不同的状态管理方案。其中&#xff0c;BLoC&#xff08;Business Logic Component&#xff09;模式作为一种流行的状态管…

软件开发设计管理文档,项目设计规程制度,项目开发规程,项目建设方案文档(word原件)

2 过程总体描述 2.1 过程概述 2.2 过程流程图 3 过程元素描述 3.1 产品方案 3.2 产品设计 3.3 产品实现 获取方式&#xff1a;本文末个人名片直接获取。 软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xf…

【taro react】 ---- 常用自定义 React Hooks 的实现【六】之类渐入动画效果的轮播

1. 效果 2. 场景 css 效果实现:可以看到效果图中就是一个图片从小到大的切换动画效果,这个效果很简单,使用 css 的 transform 的 scale 来实现图片的从小到大的效果,切换就更加简单了,不管是 opacity 还是 visibility 都可以实现图片的隐藏和显示的切换。React.Children.m…

使用 JPA 的 `save()` 方法更新数据库中的数据

在开发基于 JPA&#xff08;Java Persistence API&#xff09;的应用时&#xff0c;数据持久化操作中的常见问题是执行 save() 方法后数据库中的数据没有更新。本文将详细介绍 JPA 的 save() 方法如何工作、其可能出现的问题&#xff0c;以及如何解决这些问题&#xff0c;以确保…

2024年转行指南:大学生进军就业前景广阔的领域——人工智能大模型

据教育部数据统计&#xff0c;2024高校毕业生规模预计达1179万人&#xff0c;将再创历史新高&#xff0c;“就业难”仍是当前大学毕业生需要直面的问题。在此背景下&#xff0c;选择一个就业前景好的专业尤为重要。 究竟学什么样的专业好就业呢&#xff1f;给毕业生们推荐3个当…

strongswan链表结构

链表结构定义如下&#xff0c;public成员为公共的方法&#xff0c;count&#xff0c;first和last为私有成员&#xff0c;count表示链表中元素的数量&#xff0c;first和last分别指向链表的头和尾。public&#xff08;linked_list_t结构&#xff09;定义了一系列操作链表的方法&…

前端react常见面试题目(basic)

1. 如果 React 组件的属性没有传值&#xff0c;它的默认值是什么? 如果一个 React 组件的属性&#xff08;props&#xff09;没有传值&#xff0c;那么它的默认值会是 undefined。你可以通过组件内部的逻辑来设置默认值&#xff0c;比如使用逻辑运算符或者 ES6 的默认参数。 …

重学SpringBoot3-整合 Elasticsearch 8.x (一)客户端方式

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-整合 Elasticsearch 8.x &#xff08;一&#xff09;客户端方式 1. 为什么选择 Elasticsearch&#xff1f;2. Spring Boot 3 和 Elasticsearch 8.x 的集…