Flappy Bird游戏 C语言实现
目录
一、准备工作
二、初识图形化界面
先来做一个窗口
接下来创建一个小球
接下来创建一个矩形
三、设置参数
四、设置速度
小球的运动
画面的运动
判断输赢
五、完整代码
大家是否玩过上面这款游戏呢?想要自己做出来并不难,跟着我来用手吧。
(参考童晶老师的《C和C++游戏趣味编程》)
一、准备工作
编译器使用VS2019,但需要下载一个图形库Easy—X。
由于此图形库是C++的,所以我们要以C++文件来进行编写,C++文件内也可以使用C语言。
EasyX 下载地址https://easyx.cn/
怎样安装 EasyX? - EasyXhttps://easyx.cn/setup#:~:text=1.%20%E5%8F%8C%E5%87%BB%E4%B8%8B%E8%BD%BD%E7%9A%84%20EasyX%20%E5%AE%89%E8%A3%85%E5%8C%85%EF%BC%8C%E5%9C%A8%E2%80%9CWindows%20%E5%B7%B2%E4%BF%9D%E6%8A%A4%E4%BD%A0%E7%9A%84%E7%94%B5%E8%84%91%E2%80%9D%E6%8F%90%E7%A4%BA%E7%AA%97%E4%B8%AD%EF%BC%8C%E7%82%B9%E2%80%9C%E6%9B%B4%E5%A4%9A%E4%BF%A1%E6%81%AF%E2%80%9D%EF%BC%8C%E5%86%8D%E7%82%B9%E2%80%9C%E4%BB%8D%E8%A6%81%E8%BF%90%E8%A1%8C%E2%80%9D%EF%BC%8C%E8%BF%99%E6%97%B6%EF%BC%8C%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%88%B0%20EasyX%20%E7%9A%84%E5%AE%89%E8%A3%85%E7%A8%8B%E5%BA%8F%E3%80%82%202.,EasyX%20%E5%AE%89%E8%A3%85%E7%A8%8B%E5%BA%8F%E4%BC%9A%E6%A3%80%E6%B5%8B%E5%88%B0%E5%BD%93%E5%89%8D%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E4%B8%AD%E5%AE%89%E8%A3%85%E7%9A%84%20Visual%20Studio%20%E7%89%88%E6%9C%AC%E3%80%82%20%E5%9C%A8%E5%AF%B9%E5%BA%94%E7%9A%84%20VS%20%E7%89%88%E6%9C%AC%E5%8F%B3%E4%BE%A7%E7%82%B9%E5%87%BB%E2%80%9C%E5%AE%89%E8%A3%85%E2%80%9D%E5%8D%B3%E5%8F%AF%E3%80%82
二、初识图形化界面
先来做一个窗口
#include <graphics.h>
#include <conio.h>
#include <stdio.h>int main()
{initgraph(600, 600);_getch();closegraph();return 0;
}
可能很多函数、头文件不认识。记住这样用就行,不理解没关系。
这样我们就创建了一个600×600的图形界面。
接下来创建一个小球
#define _CRT_SECURE_NO_WARNINGS 1
#include <graphics.h>
#include <conio.h>
#include <stdio.h>int main()
{initgraph(600, 600);fillcircle(300,300,100);_getch();closegraph();return 0;
}
我们运用fillcircle( )函数,第一个值参数是X坐标,第二个参数是Y坐标,第三个参数是半径。
这里讲解一下横纵坐标的定义:
接下来创建一个矩形
#include <graphics.h>
#include <conio.h>
#include <stdio.h>int main()
{initgraph(600, 600);fillrectangle(200,0,400,400);_getch();closegraph();return 0;
}
我们使用fillrectangle( )函数,前两个参数是矩形左上角坐标,后两个参数是矩形右下角坐标。
三、设置参数
有了上面基础,下面我们一步一步来做。
首先我们要选定好我们窗口大小、小球大小以及方块障碍物大小。
我们想要小球动起来,需要给他初速度与重力加速度,方块同理。
在平面上就可以理解为它们的横纵坐标移动。
我们先设置基本参数,详情见注释
float w, h, g;//游戏画面宽高与重力加速度
float ball_x, ball_y, ball_vy, r;//小球圆心坐标,y方向速度和半径
float rect1_x1, rect1_y1, rect1_x2, rect1_y2, rect1_vx;//上方块的横纵坐标
//因为画面向左移动,我们只要让方块向左移就可以实现,所以需要x方向速度
float rect2_x1, rect2_y1, rect2_x2, rect2_y2, rect2_vx;//下方块的横纵坐标
float rect_h = 130;//因为随机方块高度的需要,单独设置一个高度
int score;//得分
再给参数赋值
//下面给具体参数w = 600;h = 400;g = 0.6;initgraph(w, h);//创建一个窗口//小球参数r = 20;ball_x = w / 4;//让小球在画面左边1/4处ball_y = h - r;//让小球贴地,离地面一个半径距离ball_vy = 0;//上方块参数rect1_x1 = w * 3 / 4;//方块在画面3/4处rect1_y1 = 0;//上方块左上角y坐标为0rect1_x2 = rect1_x1 + 30;//+30就是指宽度为30rect1_y2 = rect1_y1 + rect_h;//高度为130//下方块参数rect2_x1 = w * 3 / 4;rect2_y1 = h - rect_h;//下方块的左上角y坐标离右下角差一个高度rect2_x2 = rect2_x1 + 30;rect2_y2 = h;//下方块贴地//速度rect1_vx = rect2_vx = -3;
最后我们来看一下效果
fillcircle(ball_x, ball_y, r);
fillrectangle(rect1_x1, rect1_y1, rect1_x2, rect1_y2);
fillrectangle(rect2_x1, rect2_y1, rect2_x2, rect2_y2);
_getch();
closegraph();
四、设置速度
小球的运动
画面一直在动,就需要循环。接下来的我们就放在一个死循环里进行。
首先我们先让小球动起来,用_kbhit() 来收集按键,_getch()接收,如代码:
while (1)
{if(_kbhit())//当按键时{char input = _getch();//获得输入字符if (input == ' ')//按下空格时{ball_vy = -15;//给小球一个向上的初速度}}
}
有了速度不够,速度要换成路程才行,平面上体现为小球的坐标更新。
当小球落到地面时,我们把速度变为0,并且纵坐标变为h - r就能实现小球在地面上。
现在我们来看下效果。
while (1)
{//当摁下空格,小球向上跳跃,给一个反向速度if(_kbhit()){char input = _getch();if (input == ' '){ball_vy = -17;}}if (ball_y >= h - r)//当小球落到地面时{ball_vy = 0;//速度变为0ball_y = h - r;//规范其y坐标,防止落到地面下。}ball_vy = ball_vy + g;//y方向初速度为0,再加上一个重力加速度ball_y = ball_y + ball_vy;//根据小球y方向速度更新y坐标cleardevice();//在每次循环清一次屏,不然会出现小球的轨迹fillcircle(ball_x, ball_y, r);fillrectangle(rect1_x1, rect1_y1, rect1_x2, rect1_y2);fillrectangle(rect2_x1, rect2_y1, rect2_x2, rect2_y2);Sleep(10);//让小球暂停10ms,不然小球一眨眼就没了
}
closegraph();
画面的运动
画面的运动可以看作方块向左移,那么我们就要给方块的x坐标更新。
rect1_x1 = rect1_x1 + rect_vx;
rect2_x1 = rect2_x1 + rect_vx;
但是方块到了最左边,我们还需要让它出现在右边,并且此时得分+1。
重新出现的方块我们需要一个新的随机高度,增加趣味性。
别忘了把方块左移速度提升上去,增加游戏难度。
//更新两个方块的位置坐标
rect1_x1 += rect_vx;
rect1_x2 += rect_vx;
rect2_x1 += rect_vx;
rect2_x2 += rect_vx;if (rect1_x1 <= 0 && rect2_x1 <= 0)//方块来到最左边
{//让他们出现在最右侧rect1_x1 = rect2_x1 = w - 30;rect1_x2 = rect2_x2 = w;score += 1;//得分+1rect_h = rand() % int(h / 4) + h / 4;//设置随即高度,高度不超过画面的1/4//设置随即高度rect2_y1 = h - rect_h;rect1_y2 = rect_h;if (score > 0)rect_vx -= 0.1;//如果速度一直大于0,左移速度加大。当得分为0速度还原。
}
看一下效果:
这里我的参数有些不合理,大家可以自行更改,原理就是这样。
判断输赢
如果碰到方块的边缘,那么得分变为0,速度还原。否则继续。
这里是六种死法,所以我们需要六个条件判断。
if (((ball_x + r >= rect2_x1)&&(ball_y + r >= h - rect_h)&&(ball_x - r <= rect2_x2))//碰到下方块||((ball_x + r >= rect1_x1)&&(ball_y - r <= rect_h)&&(ball_x - r <= rect1_x2))//碰到上方块)
{Sleep(100);//给个慢速回放,看看怎么死的score = 0;//得分归0
}
结尾咱给来一份打印成绩,代码如下,暂且了解就行:
TCHAR s[20];
_stprintf(s, _T("%d"), score);
settextstyle(40, 0, _T("宋体"));
outtextxy(50, 30, s);
五、完整代码
以下是自己选了合适的参数,并添加了一些元素。
大家也可以参照自行修改。
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>int main()
{float w, h, g;//游戏画面宽高与重力加速度float ball_x, ball_y, ball_vy, r;//小球圆心坐标,y方向速度和半径float rect1_x1, rect1_y1, rect1_x2, rect1_y2, rect_vx;//上方块的横纵坐标//因为画面向左移动,我们只要让方块向左移就可以实现,所以需要x方向速度float rect2_x1, rect2_y1, rect2_x2, rect2_y2;//下方块的横纵坐标float rect_h = 125;//因为随机方块高度的需要,单独设置一个高度int score = 0;//得分//下面给具体参数w = 600;h = 400;g = 0.4;initgraph(w, h);//创建一个窗口//小球参数r = 18;ball_x = w / 4;//让小球在画面左边1/4处ball_y = h - r;//让小球贴地,离地面一个半径距离ball_vy = 0;//上方块参数rect1_x1 = w * 3 / 4;//方块在画面3/4处rect1_y1 = 0;//上方块左上角y坐标为0rect1_x2 = rect1_x1 + 30;//+30就是指宽度为30rect1_y2 = rect1_y1 + rect_h;//高度为130//下方块参数rect2_x1 = w * 3 / 4;rect2_y1 = h - rect_h;//下方块的左上角y坐标离右下角差一个高度rect2_x2 = rect2_x1 + 30;rect2_y2 = h;//下方块贴地//速度rect_vx = -2.5;while (1){//当摁下空格,小球向上跳跃,给一个反向速度if(_kbhit()){char input = _getch();if (input == ' '){ball_vy = -8;}}ball_vy = ball_vy + g;//y方向初速度为0,再加上一个重力加速度ball_y = ball_y + ball_vy;//根据小球y方向速度更新y坐标if (ball_y >= h - r){ball_vy = 0;ball_y = h - r;}//更新两个方块的位置坐标rect1_x1 += rect_vx;rect1_x2 += rect_vx;rect2_x1 += rect_vx;rect2_x2 += rect_vx;if (rect1_x1 <= 0 && rect2_x1 <= 0)//方块来到最左边{//让他们出现在最右侧rect1_x1 = rect2_x1 = w - 30;rect1_x2 = rect2_x2 = w;score += 1;//得分+1rect_h = rand() % int(h / 5.5) + h / 5.5;//设置随即高度rect1_y2 = rect_h;rect2_y1 = h - rect_h;if (score > 0)rect_vx -= 0.1;//如果速度一直大于0,左移速度加大。}if (((ball_x + r >= rect2_x1)&&(ball_y + r >= h - rect_h)&&(ball_x - r <= rect2_x2))//碰到下方块||((ball_x + r >= rect1_x1)&&(ball_y - r <= rect_h)&&(ball_x - r <= rect1_x2))//碰到上方块||(ball_y + r >= h - 10)//碰到底部){Sleep(100);//给个慢速回放,看看怎么死的score = 0;//得分归0rect_vx = -3;//碰到就速度还原}if (ball_y - r <= 10)//如果碰到顶部,直接回到底部,分数为0{ball_vy += 100 * g;ball_y += ball_vy;score = 0;}cleardevice();//绘制小球setfillcolor(GREEN);//填上绿色fillcircle(ball_x, ball_y - 10, r);//绘制方块setfillcolor(BROWN);//填上棕色fillrectangle(rect1_x1, rect1_y1, rect1_x2, rect1_y2);fillrectangle(rect2_x1, rect2_y1, rect2_x2, rect2_y2);setfillcolor(RED);fillrectangle(0, 0, w, 10);fillrectangle(0, h - 10, w, h);//打印分数TCHAR s[20];_stprintf(s, _T("%d"), score);settextstyle(40, 0, _T("宋体"));outtextxy(50, 30, s);Sleep(10);}closegraph();return 0;
}
如果你能看到这,希望对您有所帮助,我会继续写一些有趣的游戏,欢迎关注。
Flappy Bird游戏 C语言实现相关推荐
- flappy bird游戏源代码揭秘和下载后续---移植到android真机上
前言: 上一篇博客 flappy bird游戏源代码揭秘和下载,源码是运行在window或者mac系统上的,现在我们需要把代码移植到android真机上,让小鸟在手机里飞起来! ps: ...
- flappy bird游戏源代码揭秘和下载后续---移植到html5网页浏览器
前言: 我们分析了flappy bird的代码思路(flappy bird游戏源代码揭秘和下载),也移植到了android平台(flappy bird游戏源代码揭秘和下载后续---移植到an ...
- flappy bird游戏源代码揭秘和下载
背景: 最近火爆全球的游戏flappy bird让笔者叹为观止,于是花了一天的时间山寨了一个一模一样的游戏,现在把游戏的思路和源码分享出来,代码是基于javascript语言,cocos2d-x游戏引 ...
- 飞翔的圆(Flappy Bird)游戏源码完整版
2019独角兽企业重金招聘Python工程师标准>>> 这个源码是一个不错的休闲类的游戏源码,飞翔的圆(Flappy Bird)游戏源码V1.0,本项目是一个仿Flappy Bird ...
- 利用python开发的flappy bird 游戏
python 中 pygame模块能让我们很方便的编写游戏,16年我用python 仿制了flappy bird 游戏,下面是游戏的完整代码以及素材,分享给大家. 第一个python文件,flappy ...
- cocos2dx-html5 实现网页版flappy bird游戏
我也是第一次使用cocos2d_html5,对js和html5也不熟,看引擎自带的例子和引擎源码,边学边做,如果使用过cocos2d-x的话,完成这个游戏还是十分简单的.游戏体验地址: http:// ...
- Python详细了解强化学习算法并基于强化学习Q_learning让电脑玩flappy bird游戏
完整代码:https://github.com/Connor666/flappy_bird-RL 首先,如果你是为了追求一个非常高的强化学习效果,也就是flappy bird的分数,那么建议出门右拐选 ...
- HTML5版Flappy Bird游戏源码下载
Flappy Bird相信大家都很熟悉了,2014年最热门的手机游戏之一.Flappy Bird这款游戏是一位来自越南河内的独立游戏开发者阮哈东开发,形式简易但难度极高的休闲游戏,很容易让人上瘾.今天 ...
- C语言高级demo Flappy Bird游戏
Demo目录 导语 序章 游戏总体设计 游戏流程图 游戏中数据与函数介绍 游戏实现 开始界面实现 bird控制 游戏绘图 碰撞与得分实现 结语 导语 这是C语言高级demo.用C语言实现Flappy ...
- flappy+bird+c语言程序,C语言实现flappy bird游戏
本文实例为大家分享了C语言实现flappy bird的具体代码,供大家参考,具体内容如下 #include #include #include //定义全局变量 int high,width; //边 ...
最新文章
- 我在兰亭这三年之部门动荡
- SAP EWM 性能优化(一)
- 女性养生需知的16条健康戒律
- CentOS 7 为firewalld添加开放端口及相关资料
- Leetcode738. 单调递增的数字[C++题解]:贪心,数学解法
- 【C++基础学习】关于C++静态成员函数和变量
- Python内置函数总结
- 浏览器判断及客户端跳转,绕开微信对某宝限制
- 《Python预测之美》送书活动,拿走不谢~
- 107 nginx rewrite规则和alias
- Ubuntu18.04设置自动连接WIFI
- Win10+Vmvare+Ubuntu16.04lts的主机为英伟达TX2重装Ubuntu18.04操作系统
- win10锁屏幻灯片放映不能播放幻灯片问题的一种解决办法
- c语言数组判断不及格人数,C语言编程 运用数组求不及格人数
- python timm库
- Go语言系列——31-自定义错误、32-panic和recover、33-函数是一等公民(头等函数)、34-反射、35-读取文件、36-写入文件
- Mac 格式化TF卡,获取原来的容量大小。
- wordpress开启全站https
- 从键盘输入一个字符串,然后提取其中的数字字符,将其排列在其他字符之后,例如,输入字符串“this’7is89#@hg”排列后的结果为“thisis#@hg’789”。
- 一文排除WINDOWS-PYTHON3.7环境安装WORD2VEC包的所有坑