前言

flappy bird是一款在2014年爆火的游戏,相信大家都曾听说过或者玩过,今天我们将会采用C语言来写这个游戏的基本玩法,最重要的是从中接触可视化编程。

代码效果

可视化编程需要图形库,需要自己下载(点击前往下载安装教程),这里我们选择easyx,这个图形库对新手比较友好。

贴图技术

我选择的开发工具是vs2019,去掉了安全检查以及将字符集换成了多字符集(点击前往教程)。
这个游戏主要运用到了一些贴图技术和利用多线程播放音乐的方法。
我们首先需要构建一个窗口并且将我们的背景图片贴上去。

#include <graphics.h>
IMAGE bg[2];// 定义图形变量数组
initgraph(288, 624);// 构建一个宽288,高624的窗口
loadimage(&bj[0], "图片路径");// 将图片赋给图形变量,就相当于给图片起一个名字
loadimage(&bj[1], "图片路径");
putimage(0, 0, &bg[0]);// 在0,0的位置贴上图片
putimage(0, 512, &bg[1]);

因为我使用的素材是天空与地面分开的背景图,所以这里贴了2次。

柱子与鸟

接着便是贴小鸟和柱子的图片了,但是与贴背景图不同的是这里的小鸟和柱子并不是一个规则的图形,所以我们采用透明贴图技术将小鸟和柱子贴上去。具体方法可以参考下面这篇文章。
https://blog.csdn.net/qq969422014/article/details/44536375
因为柱子的高度是随机而且成对出现的,我们需要一个随机数去模拟上面柱子及下面柱子的高度,我们使用结构体的方法去写柱子。

//下面的x,y都指其所在窗口的位置
//定义小鸟的结构体
struct huoyin
{int x;int y;int speed;//小鸟弹跳的距离
};
struct huoyin hero = { 100 , 240 , 70 };
//三对柱子的结构体
struct walls
{int x, y;int height;//上面柱子的高
};
struct walls pillar[3];
void pillars(struct walls pillar[],int i)
{pillar[i].height = rand() % 100 + 120;pillar[i].x = 288;pillar[i].y = 0;
}
//贴柱子
void drawWall(struct walls nowpillar)
{//上面柱子putimage(nowpillar.x, 0, 52, nowpillar.height, wall, 0, 320 - nowpillar.height, SRCAND);putimage(nowpillar.x, 0, 52, nowpillar.height, wall + 1, 0, 320 - nowpillar.height, SRCPAINT);//下面柱子putimage(nowpillar.x, 512 - (320 - nowpillar.height), 52, 320 - nowpillar.height, wall + 2, 0, 0, SRCAND);putimage(nowpillar.x, 512 - (320 - nowpillar.height), 52, 320 - nowpillar.height, wall + 3, 0, 0, SRCPAINT);
}
//以时间为种子构建随机函数
#include <time.h>//需要的头文件
srand(time(NULL));
//移动柱子
for (int i = 0; i < 3; i++)
{pillar[i].x -= 10;
}
//柱子的初始化
for (int i = 0; i < 3; i++)
{pillars(pillar, i);//每对柱子等距离pillar[i].x = 288 + i * 150;
}
//不断创造新的柱子
for (int i = 0; i < 3; i++)
{drawWall(pillar[i]);if (pillar[i].x <= -158){pillars(pillar, i);}
}

介绍一下在贴柱子使用的 putimage(x,y,width,height,&IMAGE,xx,yy)函数,这个函数是从图片(&IMAGE)的 x,y 坐标截取 width 宽与 height 高贴在窗口的 xx,yy 坐标上。

多线程播放音乐

为了不让播放音乐影响画面,我们采用多线程播放音乐。

#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
//播放音乐
DWORD WINAPI playMusic(LPVOID lpvoid)
{mciSendString("open 卡通弹跳.wav alias music", 0, 0, 0);mciSendString("play music wait", 0, 0, 0);mciSendString("close music", 0, 0, 0);return 0;
}

小鸟的弹跳

接着就要实现使用空格让小鸟弹跳了。

//按键响应
void keyDown()
{char keys = _getch();switch(keys){case ' ':hero.y -= hero.speed;CreateThread(NULL, NULL, playMusic, NULL, NULL, NULL);break;default:break;}
}

判断游戏是否结束

//判断游戏是否结束
int overs()
{if (hero.y < 0 || hero.y > 440 )return 1;for (int i = 0; i < 3; i++){if (hero.x > pillar[i].x  && hero.x < pillar[i].x + 52 - 12)  {if(hero.y < pillar[i].height || hero.y > pillar[i].height + 112 + 38)return 1;}else return 0;}
}

判断游戏结束方面还存在一些问题,如有高见可以留言指出来,感谢!

游戏结束动画

//游戏结束动画
void overMovies()
{int x = 42, y = 700;while (y >= 200){putimage(0, 0, &bg[0]);putimage(0, 512, &bg[1]);putimage(x, y, &end[0], SRCAND);putimage(x, y, &end[1], SRCPAINT);y -= 30;Sleep(100);//防止出现掩码图与彩图交替出现}
}

完整代码

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <time.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
//背景图\小鸟图\游戏结束图\柱子图
IMAGE bg[2],bird[2][3],end[2],wall[4];
//定义小鸟的结构体
struct huoyin
{int x;int y;int speed;
};
struct huoyin hero = { 100 , 240 , 70 };
//三对柱子的结构体
struct walls
{int x, y;int height;
};
struct walls pillar[3];
void pillars(struct walls pillar[],int i)
{pillar[i].height = rand() % 100 + 120;pillar[i].x = 288;pillar[i].y = 0;
}
//批量加载资源(给文件夹里的图片命名)
void jiazai()
{loadimage(&bg[0], "4.jpg");loadimage(&bg[1], "5.jpg");loadimage(&bird[0][0], "bird0_0.png");loadimage(&bird[1][0], "bird1_0.png");loadimage(&bird[0][1], "bird0_1.png");loadimage(&bird[1][1], "bird1_1.png");loadimage(&bird[0][2], "bird0_2.png");loadimage(&bird[1][2], "bird1_2.png");loadimage(&end[0], "11.jpg");loadimage(&end[1], "8.jpg");loadimage(&wall[0], "9.jpg");loadimage(&wall[1], "6.jpg");loadimage(&wall[2], "10.jpg");loadimage(&wall[3], "7.jpg");
}
//透明贴图(掩码图加原图)
/*
void drawHero()
{putimage(hero.x, hero.y, &bird[0][1], SRCAND);putimage(hero.x, hero.y, &bird[1][1], SRCPAINT);
}*/
//贴柱子*****
void drawWall(struct walls nowpillar)
{//上面柱子putimage(nowpillar.x, 0, 52, nowpillar.height, wall, 0, 320 - nowpillar.height, SRCAND);putimage(nowpillar.x, 0, 52, nowpillar.height, wall + 1, 0, 320 - nowpillar.height, SRCPAINT);//下面柱子putimage(nowpillar.x, 512 - (320 - nowpillar.height), 52, 320 - nowpillar.height, wall + 2, 0, 0, SRCAND);putimage(nowpillar.x, 512 - (320 - nowpillar.height), 52, 320 - nowpillar.height, wall + 3, 0, 0, SRCPAINT);
}
//播放音乐
DWORD WINAPI playMusic(LPVOID lpvoid)
{mciSendString("open 卡通弹跳.wav alias music", 0, 0, 0);mciSendString("play music wait", 0, 0, 0);mciSendString("close music", 0, 0, 0);return 0;
}
//按键响应
void keyDown()
{char keys = _getch();switch(keys){case ' ':hero.y -= hero.speed;CreateThread(NULL, NULL, playMusic, NULL, NULL, NULL);break;default:break;}
}
//判断游戏是否结束
int overs()
{if (hero.y < 0 || hero.y > 440 )return 1;for (int i = 0; i < 3; i++){if (hero.x > pillar[i].x  && hero.x < pillar[i].x + 52 - 12)  {if(hero.y < pillar[i].height || hero.y > pillar[i].height + 112 + 38)return 1;}else return 0;}
}
//游戏结束动画
void overMovies()
{int x = 42, y = 700;while (y >= 200){putimage(0, 0, &bg[0]);putimage(0, 512, &bg[1]);putimage(x, y, &end[0], SRCAND);putimage(x, y, &end[1], SRCPAINT);y -= 30;Sleep(100);}
}int main()
{srand(time(NULL));jiazai();//柱子的初始化for (int i = 0; i < 3; i++){pillars(pillar, i);//每对柱子等距离pillar[i].x = 288 + i * 150;}initgraph(288, 624);for (int num = 0; num < 3; num++){putimage(0, 0, &bg[0]);putimage(0, 512, &bg[1]);putimage(hero.x, hero.y, &bird[1][num], SRCAND);putimage(hero.x, hero.y, &bird[0][num], SRCPAINT);//移动柱子for (int i = 0; i < 3; i++){pillar[i].x -= 10;}if (overs())break;//不断创造新的柱子for (int i = 0; i < 3; i++){drawWall(pillar[i]);if (pillar[i].x <= -158){pillars(pillar, i);}}if (overs())break;hero.y += 20;if (overs())break;if (_kbhit()){keyDown();if (overs())break;}if (num == 2)num = 0;Sleep(100);}Sleep(240);overMovies();_getch();closegraph();system("pause");return 0;
}

因为我还给小鸟做了扇动翅膀的动画,所以这个for (int num = 0; num < 3; num++)循环是加载鸟的三张图片。

用到的素材

由于有小伙伴找反映不到对应的素材,所以我将素材也放在网盘上分享了

链接:https://pan.baidu.com/s/1ovDvFtqIKIhoCfn0Z11PkA
提取码:1234

游戏素材网站

  1. The Spriters Resource
    地址:https://www.spriters-resource.com
    https://www.sounds-resource.com
    介绍:非常丰富齐全的游戏素材网站,并且按照游戏主机分类,包括 NES、PS、GBA 等各大游戏平台的游戏,素材基本都是抠好图的 PNG 格式,非常好用。想做高仿游戏的同学不要错过。

    还有 3D 模型、贴图、音效等素材。就是国外网站,访问速度有点慢。

  2. Open Game Art
    地址:https://opengameart.org

    介绍:很全很好用的游戏资源网站,就是国外网站的访问速度有点慢。

  3. 爱给网
    地址:http://www.aigei.com

    介绍:国内的游戏素材网站,也很好用齐全。不过有个不足:不登录不让下载。

总结

这是第一次在CSDN上写文章,如有不妥之处还请多多包涵。

C语言实现flappy bird(可视化编程)相关推荐

  1. flappy+bird+c语言程序,C语言实现flappy bird游戏

    本文实例为大家分享了C语言实现flappy bird的具体代码,供大家参考,具体内容如下 #include #include #include //定义全局变量 int high,width; //边 ...

  2. C语言版flappy bird黑白框游戏

    在此记录下本人在大一暑假,2014.6~8这段时间复习C语言,随手编的一个模仿之前很火热的小游戏----flappy bird.代码bug基本被我找光了,如果有哪位兄弟找到其他的就帮我留言下吧,谢谢了 ...

  3. c语言飞扬的小鸟程序,C语言实现flappy bird游戏

    #include #include #include //定义全局变量 int high,width; //边界 int bird_x,bird_y; //小鸟坐标 int bar_y; //挡板坐标 ...

  4. flappy bird c语言,C语言实现flappy bird

    #include #include #include //定义全局变量 int high,width;//边界 int bird_x,bird_y; //小鸟坐标 int bar_y;//挡板坐标 i ...

  5. C语言高级demo Flappy Bird游戏

    Demo目录 导语 序章 游戏总体设计 游戏流程图 游戏中数据与函数介绍 游戏实现 开始界面实现 bird控制 游戏绘图 碰撞与得分实现 结语 导语 这是C语言高级demo.用C语言实现Flappy ...

  6. c语言flappy bird代码,Flappy bird源代码(略吊)

    [codesyntax lang="cpp"] #include #include #include #include #include /********函数变量声明****** ...

  7. 人形图案c语言程序_做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码...

    经过之前的学习,我们基本掌握了开发小游戏所需要的语法知识和搭建方法,但是基础C语言的可视化与交互功能实在是太弱了 . 利用免费的EasyX插件,我们可以快速上手,简单实现很酷的视觉效果 . EasyX ...

  8. 做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码

    经过之前的学习,我们基本掌握了开发小游戏所需要的语法知识和搭建方法,但是基础C语言的可视化与交互功能实在是太弱了 . 利用免费的EasyX插件,我们可以快速上手,简单实现很酷的视觉效果 . EasyX ...

  9. c语言心形编程代码_做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码...

    经过之前的学习,我们基本掌握了开发小游戏所需要的语法知识和搭建方法,但是基础C语言的可视化与交互功能实在是太弱了 . 利用免费的EasyX插件,我们可以快速上手,简单实现很酷的视觉效果 . EasyX ...

  10. 做游戏,学编程(C语言) 4 flappy bird

    在学习数组之前,我们再做一个好玩的游戏:flappy bird.大家可以按照上一个教程中空战游戏的思路,先按照我们的提示,逐步地实现,如果有困难,再参考我们分步骤的代码,这样的锻炼效果最好. 备注:# ...

最新文章

  1. java成绩排名平均成绩_java 数组 输入5名学生的成绩 得出平均分。
  2. 【学习笔记-集合】HashMap 源码浅析
  3. [蓝桥杯2016初赛]剪邮票-dfs+next_permutation(好题)
  4. 四年级计算机课程,信息技术(四年级)全部课程PPT课件.ppt
  5. 用git上传自己的第一个github项目
  6. @程序员,快收下这份比特币“勒索病毒”应对须知!
  7. Spring基础精华知识点
  8. logo语言是计算机语言吗,什么是LOGO语言?
  9. 数字通信之数字信号基带传输(九)
  10. 【LWP,进程,线程】Linux
  11. cv面试百问day2
  12. 如何快速查看bili上的视频学习
  13. python摄像头动作捕捉_OpenMMD:没有专业摄像设备也能动作捕捉!K帧动作设计苦手的福音~...
  14. java 节日_java节假日
  15. js html 渐变透明度,JavaScript动画之透明度渐变
  16. 1.[RK3288][Android6.0] USB UVC 协议简结
  17. AWVS安装与使用(最新版2022.12.27更新)
  18. 嵌入式计算机答辩标准,陈月昆答辩公告
  19. Flash Download failed - “Cortex-M3“解决方法
  20. 大三实习面试 基础+加分项

热门文章

  1. php转到qq并分享,php怎么实现qq分享
  2. sid图像数据_【技术前沿】首届“水下机器人目标抓取大赛”第一名的图像增强方法...
  3. 数据结构二叉树算法c语言实现,数据结构与算法 :AVL平衡二叉树C语言实现
  4. Java基础教程——线程局部变量
  5. HBase在新能源汽车监控系统中的应用
  6. ES6与ES2015、ES2016以及ECMAScript的区别
  7. C#_asp.net mvc 验证码功能的具体实现
  8. Centos yum 命令行 安装KDE Desktop
  9. ubuntu9.10之grub.cfg详解
  10. 【原】对txt文本进行数据读取