百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

C语言项目实战:《飞翔的小鸟》零基础项目!190行源代码示例

yund56 2025-05-09 10:00 32 浏览

这篇文章主要为大家详细介绍了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++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

相关推荐

没有获得Windows 10 20H2升级通知,怎样直接升级

微软公司已经正式发布Windows1020H2操作系统,在正常情况下,微软只会首先推送到少量电脑,然后一边推送一边采集遥测数据。收集遥测数据可以确定哪些电脑可以更新,哪些电脑在更新后可能会失败,微...

不想让人随便卸载你安装的程序,用这四招,他将无计可施

Windows10不提供设置删除应用程序限制的功能,有几种间接方法可以防止用户删除操作系统中的程序和游戏。一、WindowsInstaller服务使用Windows工具,可以部分限制用户的权限。如...

一文看懂苹果全球开发者大会 五大系统全面升级

来源:环球网【环球网智能报道记者张阳】北京时间6月23日凌晨1点,苹果全球开发者大会(WWDC2020)如期举行,还是那个熟悉的乔布斯剧院,依旧是高水准的视频展示,但是这届WWDC,却是苹果历史...

无需等待微软分批推送,23H2可借助注册表快速获取Win11 24H2更新

IT之家10月15日消息,Windows1124H2正在分批推送,但由于存在多种Bug,微软已经开始放缓其推送节奏。WindowsLatest发现,Windows1123H2...

办公小技巧:剑走偏锋 PPT中打造动态图表

年底到了少不了又要制作各种总结报表,为了让自己的报表与众不同,我们可以借助PowerPoint动画组件+报表的方式,打造出更为出彩的动态图表。下面以PowerPoint2016为例,介绍如何使用三维...

文档表格 版本差异何在

在办公过程中,对文档或表格的修改是司空见惯的事。那么,一份文档做了内容改动,如何知道差异在哪里?一份表格改动部分数据,如何知道哪些有所变动?不要说审阅和修订功能,因为不是所有人都会用这些功能来标注的,...

Excel VBA自制日历组件16色可选 完美替代VBA日期控件

本日期组件可跟随单元格跟随窗体中ActiveX文本框组合框控件16种配色可选私信回复880日历可体验效果使用说明1打开自己需要应用日历面板的Excel表,注意必须是启用VBA的格式2在...

如何从交互角度读懂产品需求文档

作为设计师,理解产品经理提供的需求文档是交互设计工作的重要前提与起点,然而对于很多设计师来说,需求文档内容通常非常复杂,设计师们需要花费大量时间去消化、理解和归纳。本文作者结合公司示例,分析设计师如何...

植入让文档变得更强大

有效地利用文档置入技术,会让我们的常用文档功能变得更加强大,实现更加高效或有趣的应用。1.写字板文档嵌入其他文档有时,我们要组织一个大型的文档,但是这些文档的内容可能来自于不同种类的文档编辑器,比如...

Office 2016滚动文本框 顺手就来

【电脑报在线】如果一页PPT内容较多无法在完全显示,就需要用到滚动文本框,在PPT2016中借助控件即可快速制作滚动文本框。在“告诉我你想要做什么”输入“文本框控件”,在搜索结果点击“文本框(Acti...

Axure的多状态复选树

本文将详细介绍如何在Axure中实现一种增强型的多状态复选树组件,它不仅支持全选、半选和未选等状态,还具备动态加载、关键字筛选等高级功能。多状态复选树(Multi-StateCheckboxTre...

办公小技巧:PPT中控件图表巧联动

在利用PPT进行图表演示时,操作者有可能要与图表进行交互联动,比如通过输入数据来预测产品的生产情况等,这时就需要用到“开发工具”中的控件了。几个控件配合几句VBA代码,就可以轻松实现上述交互联动效果(...

用好插件——找回火狐的旧功能

现在的软件,特别是浏览器类软件,更新换代速度都很快,而且无论是外观界面还是系统组件都会有较大的变化,这样会让很多朋友无所适从。以大家常用的火狐浏览器为例,它就已经升级到了最新的35版,而且在新版中对很...

重新认识控件(二)

图片和文字,都是一种数据形式。我平时对文本框的录入,报错和提交的设计比较多。最近涉及到图片控件的设计,细细琢磨一下,这玩意还有一些平时没太注意的细节点,感觉对于其他控件的设计有指导意义,特此总结一下传...

JSA宏教程——在文档中添加复合框控件

上一期,我们初步认识了控件Control,本节我们将继续控件的相关内容。这几期我们将逐一介绍相关控制。本节先介绍复合框(也叫组合框)Combobox。复合框的作用复合框就是一个下拉选项框,一次显示一个...