用C语言实现FlappyBird

用C语言实现FlappyBird在 FlappyBird 这款游戏中 玩家需要用一根手指来操控小鸟往上飞 不断的点击屏幕就会不断的往高处飞 放松手指 则会快速下降 所以玩家要控制小鸟一直向前飞行 然后注意躲避途中高低不平的管子得分 在这里 我们主要使用 C 语言中的 printf 和 scanf 函数实现一个简单的 FlappyBird 游戏整体思路在开始游戏之前 我们先了解一些辅助函数 voidgotoxy intx in

整体思路

在开始游戏之前,我们先了解一些辅助函数

void gotoxy(int x, int y) //将光标调整到(x,y)的位置 { 
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(handle, pos); } 
void HideCursor() //隐藏光标 { 
    CONSOLE_CURSOR_INFO cursor_info = { 
    1, 0 }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } 

主函数

我们使用一个简单的游戏框架,来减小游戏实现的难度

int main() { 
    startup(); //初始化变量  while (1) { 
    show(); //显示画面 updateWithoutInput();//与用户无关的更新 updateWithInput();//与用户输入有关的更新 } return 0; } 

全局变量的定义

//游戏画面大小 int high; //行 int width; //列 //小鸟的坐标 int bird_x; //行 int bird_y; //列 //障碍物的相关坐标  int bar1_y; //障碍物与左边界的距离 int bar1_xTop; //上边障碍物底部与上边界的距离 int bar1_xDown; //下边障碍物顶部与上边界的距离 int score; //得分 

在这里插入图片描述

数据的初始化

//游戏界面大小  high = 15; width = 25; //小鸟的初始位置  bird_x = high / 2; bird_y = width / 4; //障碍物的初始位置 bar1_y = width - 1; bar1_xTop = high / 4; bar1_xDown = high / 2; //得分  score = 0; 

显示画面

每一次循环,都需要重新输出一次画面,在这里,我们使用 @ 表示小鸟, * 表示障碍物

for (i = 0; i < high; i++) //行 { 
    for (j = 0; j < width; j++) //列 { 
    if ((i == bird_x) && (j == bird_y)) //输出小鸟 { 
    printf("@"); } else if ((j == bar1_y) && ((i < bar1_xTop) || (i > bar1_xDown))) //输出障碍物 { 
    //只有在合适的列时才需要去判断是否需要输出*,所以需要利用&&的性质,第一个条件成立之后才去判断第二个条件 printf("*"); } else { 
    printf(" "); } } printf("\n"); } printf("得分:%d\n", score); 

与用户无关的更新

实现小鸟的下落和障碍物的移动
bird_x++; //小鸟向下落 bar1_y--; //小鸟只是在上下移动,障碍物向左移动 
判断游戏的得分与失败
if (bird_y == bar1_y) //障碍物与小鸟在同一列 { 
    if ((bird_x >= bar1_xTop) && (bird_x <= bar1_xDown)) //得分 { 
    score++; } else //不能撞墙 { 
    printf("游戏失败!!!"); return -1; } } else { 
    if (bird_x > high) //小鸟不能落到high以下 { 
    printf("游戏失败!!!"); return -1; } } 
重新生成障碍物
if (bar1_y <= 0) //新生成一个障碍物 { 
    bar1_y = width - 1; //随机生成障碍物与开口大小 int upside = rand() % (int)(high * 0.6) + 1; //防止上侧障碍物出现在边界 bar1_xTop = upside; int opening = rand() % (int)(high * 0.2) + 2; //开口大小随机,且开口不能太小 while ((bar1_xDown = bar1_xTop + opening) > high - 2) //防止下侧障碍物过小 { 
    opening = rand() % (int)(high * 0.2) + 2; } } 

与用户输入有关的更新

游戏在运行的过程中,用户需要输入空格来使小鸟向上跳动

if (_kbhit()) { 
    input = _getch(); if (input == ' ' && bird_x > 0) { 
    bird_x = bird_x - 2; } } 

关于_kbhit()和_getch()函数可以在《使用c语言实现飞机游戏》中getch函数部分查看,链接:https://blog.csdn.net/lw/article/details/

完整代码

#include  
     #include  
     #include  
     #include  
     #include  
     //辅助函数 void gotoxy(int x, int y) //将光标调整到(x,y)的位置 { 
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(handle, pos); } void HideCursor() //隐藏光标 { 
    CONSOLE_CURSOR_INFO cursor_info = { 
    1, 0 }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } //全局变量的定义 //游戏画面大小 int high; int width; //小鸟的坐标 int bird_x; int bird_y; //障碍物的相关坐标  int bar1_y; int bar1_xTop; int bar1_xDown; int score; void startup() //数据初始化 { 
    //游戏界面大小  high = 15; width = 25; //小鸟的初始位置  bird_x = high / 2; bird_y = width / 4; //障碍物的初始位置 bar1_y = width - 1; bar1_xTop = high / 4; bar1_xDown = high / 2; //得分  score = 0; } void show() //显示画面 { 
    gotoxy(0, 0); //将光标调整到(0,0)的位置 int i, j; for (i = 0; i < high; i++) { 
    for (j = 0; j < width; j++) { 
    if ((i == bird_x) && (j == bird_y)) //输出小鸟 { 
    printf("@"); } else if ((j == bar1_y) && ((i < bar1_xTop) || (i > bar1_xDown))) //输出障碍物  { 
    printf("*"); } else { 
    printf(" "); } } printf("\n"); } printf("得分:%d\n", score); } int updateWithoutInput()//与用户无关的更新 { 
    bird_x++; bar1_y--; if (bird_y == bar1_y) { 
    if ((bird_x >= bar1_xTop) && (bird_x <= bar1_xDown)) { 
    score++; } else { 
    printf("游戏失败!!!"); return -1; } } else { 
    if (bird_x > high) { 
    printf("游戏失败!!!"); return -1; } } if (bar1_y <= 0) { 
    bar1_y = width - 1; int upside = rand() % (int)(high * 0.6) + 1; bar1_xTop = upside; int opening = rand() % (int)(high * 0.2) + 2; while ((bar1_xDown = bar1_xTop + opening) > high - 2) { 
    opening = rand() % (int)(high * 0.2) + 2; } } Sleep(150); return 0; } void updateWithInput()//与用户输入有关的更新 { 
    char input; if (_kbhit()) { 
    input = _getch(); if (input == ' ' && bird_x > 0) { 
    bird_x = bird_x - 2; } } } int main() { 
    srand((unsigned)time(NULL)); HideCursor(); again: startup(); //初始化变量  while (1) { 
    show(); //显示画面 int ret = updateWithoutInput();//与用户无关的更新 if (ret == -1) { 
    system("CLS"); printf("1.重新开始\n0.退出\n请选择:"); int input = 0; scanf("%d", &input); if (input) { 
    goto again; } else return 0; } updateWithInput();//与用户输入有关的更新 } return 0; } 

效果演示

总结

到这里,我们的FlappyBird游戏已经实现完了,多有不足之处,任需要继续改进。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218613.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午11:50
下一篇 2026年3月17日 下午11:50


相关推荐

  • ActiveMq和RabbitMq区别及其解析

    ActiveMq和RabbitMq区别及其解析1 ActiveMq 传统的消息队列 使用 Java 语言编写 基于 JMS JavaMessageS 采用多线程并发 资源消耗比较大 支持 P2P 和发布订阅两种模式 2 RabbitMQ 基于 AMQP 协议实现 支持多种场景 社区活跃量大 高性能 高可用 支持海量数据 两者区别在于 JMS 和 AMQP 此图取自别处 JMS 提供了两种消息模型 peer 2 peer 点对点 以及

    2026年3月19日
    2
  • 电商后台管理系统(一)

    电商后台管理系统(一)后台管理系统git地址:https://gitee.com/kk23851一.项目大体架构二.用户登录用户登录页面思路:用Element表单验证完成以后,把数据存储到本地用户登录代码位置如图:三.用户管理用户列表页面绘制用户列表基本结构,请求用户列表数据,将用户列表数据展示,实现用户列表分页,实现搜索功能,实现添加用户,修改用户信息,删除用户,分配权限用户管理代码位置如图:四.权限管理权限管理有俩个板块分别是角色列表和权限列表,用到的技术无非就是element-ui,所

    2022年6月10日
    50
  • 【转】汇编指令与机器码的相互转换

    【转】汇编指令与机器码的相互转换80x86opcodes:http://www.aogosoft.com/download/opcodes.rar

    2022年8月31日
    5
  • html字体下划线取消,取消下划线与显示下划线设置

    html字体下划线取消,取消下划线与显示下划线设置a标签下划线和勾销下划线样式text-decoration配置篇以下介绍DIVCSS组织时刻,默许情况下A超链接锚文本下划线几种情况兼容各阅读器设置装备摆设。1、取消A默认下划线在CSS代码中最前面设置CSS以下:a{text-decoration:none}多么就可设置默认状况下超链接标签A字体无论是默许情况下照常鼠标悬停超链接字体均不闪现下划线。2、兼容各大涉猎器默许A超链接全显示下划线岂论…

    2022年5月26日
    45
  • C语言的运算符及优先级[通俗易懂]

    C语言的运算符及优先级[通俗易懂]C语言的运算符包括单目运算符、双目运算符、三目运算符,优先级如下:第1优先级:各种括括号,如()、[]等、成员运算符.;第2优先级:所有单目运算符,如++、–、!、~等;第3优先级(算数运算符):乘法运算符*、除法运算符/、求余运算符%;第4优先级(算数运算符):加法运算符+、减法运算符-;第5优先级(移位运算符):移位运算符<<、>>;第6优先级(条件运算符):大于运算符>、大于等于运算符>=、小于运算符<、小于等于运算符<=;第7优先级(

    2025年6月11日
    5
  • LAMP环境搭建与配置(一)

    LAMP环境搭建与配置(一)LAMP是LinuxApacheMySQLPHP的简写,即把Apache、MySQL以及PHP安装在Linux系统上,组成一个环境来运行PHP的脚本语言,通常是网站。Apache是最常用的web服务软件,而MySQL是比较小型的数据库软件,这两个软件以及PHP都可以安装在一台机器上,也可以分开安装,但Apache和PHP必须安装在同一台机器上,因为PHP是作为Apache的一个模块存在的。…

    2022年5月3日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号