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

整体思路

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

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/lw13572259173/article/details/81662103

完整代码

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
//辅助函数
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;}elsereturn 0;}updateWithInput();//与用户输入有关的更新}return 0;
}

效果演示

在这里,我们从游戏失败之后重新开始演示

总结

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

用C语言实现FlappyBird相关推荐

  1. 用C语言开发入门游戏FlappyBird

    前言 <flappy bird>是一款由来自越南的独立游戏开发者Dong Nguyen所开发的作品,游戏于2013年5月24日上线,并在2014年2月突然暴红.2014年2月,<Fl ...

  2. 初学C语言没有项目练手怎么行,这17个小项目收下不谢

    C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中--,这些迷茫也导致了我们在学习的过程 ...

  3. c语言倒计时不影响进程_初学C语言没有项目练手怎么行,这17个小项目收下不谢...

    image C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中--,这些迷茫也导致了我们 ...

  4. 零基础如何学习C语言?大神亲手总结 17 招,教你玩转C语言!

    C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中-- 这些迷茫也导致了我们在学习的过程 ...

  5. c语言21个入门练手项目,初学C语言没有项目练手怎么行,这17个小项目收下不谢...

    C语言是咱们大多数人的编程入门语言,对其也再熟悉不过了,不过不少初学者在学习的过程当中不免会出现迷茫,好比:不知道C语言能够开发哪些项目,能够应用在哪些实际的开发中--,这些迷茫也致使了咱们在学习的过 ...

  6. C语言小游戏:飞翔的小鸟(完整版)

    每天一个C语言小项目,提升你的编程能力!  <Flappy Bird>是曾经一款流行的一款手机游戏,你只要让小鸟保持飞行,不要碰到绿色的管道就可以啦.操作虽然简单,但是非常具有挑战!本次我 ...

  7. 【Go语言】Go语言我们应该这样学~全网较全的学习教程

    哈喽,我是一个初级的互联网玩家,致力于分享各领域优质开源项目. 这是一篇可以让你受益终身的 Go 精华文章,汇聚了圣经级 500 + Go开源项目的精华,Go 开源电子书.Go学习路线图! 建议你花 ...

  8. Go语言的错误异常处理机制及其应用

    一.背景 在日常编写golang程序或阅读别人的golang代码时,我们总会看到如下的一堆代码块: xx, err = func(xx) if err != nil {//do sth. to tac ...

  9. Go 知识点(19)— Go 语言中的野指针

    野指针是一种指向内存位置是不可知的指针,一般是由于指针变量在声明时没有初始化所导致的.在 Go语言中,布尔类型的零值为 false,数值类型的零值为 0,字符串类型的零值为 "", ...

  10. gcc 自动识别的文件扩展名,gcc/g++ -x 选项指定语言,不同 gcc 版本 -std 编译选项支持列表

    对于执行 C 或者 C++ 程序,需要借助 gcc(g++)指令来调用 GCC 编译器. 对于以 .c 为扩展名的文件,GCC 会自动将其视为 C 源代码文件 对于以 .cpp 为扩展名的文件,GCC ...

最新文章

  1. 关于python的一些好的书籍推荐-如果只能推荐3本关于python的书,你会推荐哪3本?...
  2. div 按 id 刷新 需要jquery
  3. [YTU]_2631( B1 能存各种类型数据的Store类)
  4. 漫说中介者模式--创业公司成长记
  5. Facebook开源Horizon:首个用于大规模产品和服务的强化学习平台
  6. 怎样在ArcIMS 上实现专题图
  7. 实验3-1 求一元二次方程的根 (20 分)
  8. 1250. Sea Burial
  9. 计算机 画图软件 快捷键大全,教你完整版电脑CAD快捷键大全
  10. delphi10.1调用BarTender2016R5文件打印标签
  11. laypage分页java例子_laypage分页控件使用实例详解
  12. php读取剪贴板内容,jQuery获取剪贴板内容的方法
  13. 平面/球面坐标中已知起点坐标、(偏转)角度、长度求终点坐标(三角函数)
  14. android studio 补间动画,Android动画学习(一):帧动画和补间动画
  15. 蚂蚁金融NLP竞赛——文本语义相似度赛题总结
  16. C不会断句?【前后置,位,移位操作符详解】 b = ++c, c++, ++a, a++
  17. 微博【黄金分析师吕超】--2.16黄金分析
  18. Linux 流量控制工具 TC 详解
  19. Solving environment: failed ResolvePackageNotFound: - ld_impl_linux-64==2.34=h53a641e_4
  20. 潘多拉 rt thread lcd

热门文章

  1. AMiner推荐论文:Flexible artificial Si-In-Zn-O/ion gel synapse and its application to sensory-neuromorphi
  2. python xmind_XMind
  3. android备忘录的开发总结报告,android备忘录
  4. 同宇新材冲刺深交所:年营收9.47亿 张驰与苏世国为实控人
  5. [经验] 系统封装常见问题大总结(非官方)
  6. 在支付宝中开通信用卡快捷支付
  7. 快捷方式和活动桌面小贴
  8. Spring Cloud Hystrix 全解 (1) - 总览篇
  9. 利用账号密码模拟登录新浪微博
  10. Linux内核之——等待队列wait queue