C语言项目实战:《飞翔的小鸟》零基础项目!190行源代码示例
liebian365 2024-10-20 09:59 35 浏览 0 评论
这篇文章主要为大家详细介绍了C语言实现——《飞翔的小鸟项目》文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!
游戏介绍:
《Flappy Bird》其实是曾经流行的一款手机游戏,你只要让小鸟保持飞行,不要碰到绿色的管道就可以啦。操作虽然简单,但是非常具有挑战哦,不信就来试试吧!
游戏的目标是让小鸟穿过管子,不要碰到任何物体,挑战更远距离!操作只需要控制方向键,让我们的小鸟不碰到柱子即可。
玩法简单,容易上手!所以这也成为了我们编程学习者C语言练习的一个非常好的小项目,如果你没有玩过的话那么可以先去玩一下的,会玩的话对于项目逻辑的理解也是非常有帮助的!接下来就让我们一起来看看吧!
插件:图形库插件easyX,涉及图片素材可以自行百度找也可以关注文末领取;
效果图展示:
配套讲解教程:飞翔的小鸟游戏教程——哔哩哔哩
源代码示例:
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
/*************************************************
数据设计
**************************************************/
IMAGE background;
IMAGE bigBird[2]; //bigBird[0] bigBird[1];
IMAGE endImg[2];
IMAGE down[2];
IMAGE up[2];
HWND hwnd;
//C语言结构体
struct bird
{
int x; //鸟的x和y坐标
int y;
int speed; //鸟的速度
};
struct bird myBird = { 120, 10, 100 };
//加载资源:把图片和变量绑定一起
void loadResource()
{
loadimage(&background, "background.bmp");
loadimage(&bigBird[0], "birdy.bmp",48,48);
loadimage(&bigBird[1], "bird.bmp",48,48);
loadimage(&endImg[0], "endy.bmp");
loadimage(&endImg[1], "end.bmp");
loadimage(&down[0], "downy.bmp");
loadimage(&down[1], "down.bmp");
loadimage(&up[0], "upy.bmp");
loadimage(&up[1], "up.bmp");
}
/**************************************************
鸟的模块
1.绘制鸟的过程
2.按键操作控制鸟的过程
3.音乐部分---多线程
***************************************************/
//绘制鸟的过程
void drawBigBird(int x, int y)
{
putimage(x, y, &bigBird[0], SRCAND);
putimage(x, y, &bigBird[1], SRCPAINT);
}
//线程处理函数--->C语言中函数指针
DWORD WINAPI playMusic(LPVOID pVoid)
{
mciSendString("open jump.mp3", 0, 0, 0);
mciSendString("play jump.mp3 wait", 0, 0, 0);
mciSendString("close jump.mp3", 0, 0, 0);
return 0;
}
/****************************************************
通用性技术:
1.并发编程
2.网络编程
3.数据库编程
*****************************************************/
//按键交互
void keyDown()
{
char userKey = '\0';
userKey = _getch();
//暂停功能
if (userKey == ' ')
{
while (_getch() != ' ');
}
switch (userKey)
{
case 72: //小键盘
myBird.y -= myBird.speed;
CreateThread(NULL, NULL, playMusic, NULL, NULL, NULL);
break;
default: //其他按键
break;
}
}
//碰地板和上边界处理
int hitFloor()
{
if (myBird.y <= 0 || myBird.y >= (512 - 48))
return 1;
return 0;
}
//结束动画
void gameOverAction()
{
int x = 60;
int y = 608;
while (y >= 240)
{
putimage(0, 0, &background);
putimage(x, y, &endImg[0], SRCAND);
putimage(x, y, &endImg[1], SRCPAINT);
y -= 50;
Sleep(50);
}
MessageBox(hwnd, "GameOver!You die!!","over", MB_OK);
}
/******************************************************
柱子部分
1.画柱子
2.初始化柱子
3.移动柱子
******************************************************/
struct pillar
{
//上面柱子的属性
int x;
int y;
int h;
//能够推出下面柱子的属性:
//Height-h;
};
struct pillar 柱子[3];
//初始化做完
void initPillar(struct pillar 柱子[], int i)
{
柱子[i].h = rand() % 100 + 160;
柱子[i].y = 0;
柱子[i].x = 288;
}
void drawPillar(struct pillar 柱子)
{
//上面的柱子
putimage(柱子.x, 0, 52, 柱子.h, &down[0], 0, 320 - 柱子.h, SRCAND);
putimage(柱子.x, 0, 52, 柱子.h, &down[1], 0, 320 - 柱子.h, SRCPAINT);
//下面的柱子
putimage(柱子.x, 512-(320-柱子.h), 52, 320-柱子.h, &up[0], 0, 0, SRCAND);
putimage(柱子.x, 512 - (320 - 柱子.h), 52, 320 - 柱子.h, &up[1], 0, 0, SRCPAINT);
}
//通用性+重用性
/*************************************************
入口函数
**************************************************/
int main()
{
srand((unsigned int)time(NULL));
loadResource();
//1.创建窗口
hwnd=initgraph(288, 608);
//描述自由落体
for (int i = 0; i < 3; i++)
{
initPillar(柱子, i);
柱子[i].x = 288 + i * 150;
}
while (1)
{
putimage(0, 0, &background);
drawBigBird(myBird.x, myBird.y);
for (int i = 0; i < 3; i++)
{
柱子[i].x -= 10;
if (柱子[i].x < (-52 - 150))
{
initPillar(柱子, i);
}
}
for (int i = 0; i < 3; i++)
{
drawPillar(柱子[i]);
}
if (hitFloor())
{
gameOverAction();
break;
}
myBird.y += 10;
//只有有按键才处理,没有按键不能处理
//kbhit():存在按键返回非零值
if (_kbhit())
{
keyDown();
}
Sleep(50); //延时函数
}
_getch(); //等待用户按键
//2.关闭窗口
closegraph();
return 0;
}
未完成的部分功能代码,大家也可以自己先去想想试试,每一次的思考就是你进步的过程!
如果学习的过程中有什么问题,以及本项目有什么不懂的地方,都可以来找我交流,我来帮你!
那么今天的分享就到这里了,后续会更新更多精彩项目或者知识内容的,大家要好好学C语言C++哟~
写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
编程学习书籍分享:
编程学习视频分享:
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!
相关推荐
- 看黑客是如何获取你电脑最高权限的,一定要看
-
在渗透过程中,通过各种方式获取到一枚cmdshell,但是这个shell的权限比较低,无法让我们做我们想要做的一些操作,比如说获取系统密码,获取数据库信息,又或者比如说拿到服务器中的另一个站点的权限,...
- 是50个常用的Visual Basic代码示例:
-
以下是50个常用的VisualBasic代码示例:1.声明变量```vb...
- 电脑系统型号怎么看版本(如何看电脑系统型号)
-
有时候我们会需要进行查看电脑上安装的windows系统版本及系统版本号,但对于不懂电脑知识的小白来说要怎么查看电脑系统版本信息呢?别着急,有小编在接下来,就将查看电脑系统版本的教程来分享给你们,希望对...
- dos命令systeminfo,查看系统启动时间。电脑卡慢,win10怎么了?
-
最近一段时间,有几个反应电脑卡慢的,都是windows10的系统。询问得知每天电脑有关机,打开任务管理器,内存使用量达到百分之九十多,而程序只打开微信、wps、360浏览器。cmd窗口运行命令syst...
- systeminfo命令:全面解析系统信息!
-
你是否曾想过,仅凭一条简单的命令,就能深入了解计算机的"内心世界"?是不是有点不可思议?那么,让我们一起探寻这个神奇的命令,揭开它背后的奥秘吧!它能提供的信息超乎你的想象,从操作系统到硬件配置,再到驱...
- 电脑序列号怎么查询?只需两行命令一键查询
-
当我们的电脑出问题需要保修的时候,需要查询到电脑的型号和序列号才更便于进行下一步的操作,有包装盒的朋友还可以在包装盒上查询,笔记本用户可以在电脑底部标签上查询,没有包装盒和标签破损的用户就无从下手了。...
- 快速显示系统信息:Systeminfo命令详解
-
Systeminfo命令是windows系统中显示系统信息的命令,此命令可以显示出计算机的操作系统的详细配置信息,包括操作系统配置、安全信息、产品ID和硬件属性(如RAM、磁盘空间和网卡)。使用...
- dos命令systeminfo图文教程,显示操作系统配置信息msinfo32
-
大家好,我是老盖,首先感谢观看本文,本篇文章做的有视频,视频讲述的比较详细,也可以看我发布的视频。今天我们学习systeminfo命令,该工具显示本地或远程机器(包括服务包级别)的操作系统配置的信息,...
- 基于uniapp+vue3跨端仿制chatgpt实例uniapp-chatgpt
-
#夏日生活打卡季#...
- 原创新作uniapp+vue3+pinia2高仿微信App聊天
-
前段时间有给大家分享一个flutter3.x桌面端os系统。今天再分享一款最新原创之作uniapp-vue3-wechat聊天实例。uni-vue3-wechat采用...
- UniApp开发的设备适配(uniapp服务器配置)
-
UniApp是一个跨平台开发框架,支持多端应用(如H5、小程序、iOS、Android等)。由于不同设备的屏幕尺寸、分辨率、操作系统等存在差异,设备适配是开发过程中需要重点关注的问题。以下是Uni...
- 如何用服务器搭建自己的个人网站(自己服务器怎么做网站)
-
这篇教程主要是告诉大家如何利用TCP和HTTP协议来完成网站的搭建。首先你需要有C/C++语言基础,且有服务器、客户端概念,如果你了解TCP或者HTTP协议的话,那么将会帮助你更快的学会如何搭建个人网...
- 大话C语言:字符数组(c语言字符数组教学视频)
-
1字符数组概述C语言中没有字符串这种数据类型,可以通过char的数组来替代。数字0(和字符'\0'等价)结尾的char数组就是一个字符串,字符串是一种特殊的char的数组。...
- 源码分享:在pdf上加盖电子签章(pdf怎么加电子签章)
-
在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...
- C语言wcstombs函数详解:宽字符字符串到多字节的「翻译官」
-
核心定位wcstombs是C语言中用于将宽字符字符串转换为多字节字符串的「翻译官」,它能将宽字符(wchar_t)转换为多字节字符(如UTF-8编码的中文)。就像一位翻译官,它能将一种语言(宽字符...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)