2023 新的一年:C++烟花代码

这篇具有很好参考价值的文章主要介绍了2023 新的一年:C++烟花代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

写在前面

代码思路

开始编写

1 烟花结构体

 2 初始化烟花

3 烟花上升

4 烟花爆炸

5 绘制烟花

上升

爆炸

效果展示

完整代码


写在前面

首先,祝大家新年快乐

即将迎来新的一年——癸卯兔年,祝大家成绩、事业“兔”飞猛进,必定红红火火

在这篇文章中,将用  烟  花   致以大家最好的祝福!

烟花代码将会用到 Easyx 图形库,可以去官网下载:easyx.cn

代码思路

1         烟花结构体

2         初始化烟花

3         烟花上升

4         烟花爆炸

5         绘制烟花

不需要任何图片、音效(本来想加的,你要加自己加吧) 

开始编写

提前声明:代码纯原创!

需要用到的头文件以及宏:

#include <graphics.h>
#include <math.h>
#include <time.h>
#include <stdio.h>

#define MAXNUM 15
#define WIDTH 640
#define HEIGHT 480
#define PI 3.1415926

graphics.h                        Easyx图形库

math.h                              计算烟花位置

time.h                               选取随机种子

stdio.h                              标准输入输出头文件

MAXNUM                          烟花数量

WIDTH , HEIGHT              窗口的宽、高

PI                                       圆周率常量,结合数学库计算烟花位置

1 烟花结构体

定义的参数如下:

nowx , nowy                       现在坐标

endy                                    爆炸高度

radio                                    爆炸半径

explode                               爆炸进度

rgb[3]                                   烟花颜色rgb值

color                                    烟花颜色

struct Fire
{
	int nowx;
	int nowy;
	int endy;
	int radio;
	int explode;
	int rgb[3];
	COLORREF color;
}fire[MAXNUM];

 2 初始化烟花

nowx , nowy                       窗口外的随机位置

endy                                    随即高度

radio                                    随即半径

explode                               一开始设为0

rgb[3]                                   一些特定的颜色随机取

color                                    按照rgb值

void Init()
{
	for (int i = 0; i < MAXNUM; i++)
	{
		fire[i].nowx = rand() % WIDTH;
		fire[i].nowy = HEIGHT + rand() % 250 + 50;
		fire[i].endy = rand() % 100 + 10;
		fire[i].radio = rand() % 50 + 120;
		fire[i].explode = 0;
		int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
		int n = rand() % 8;
		fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
		fire[i].rgb[0] = c[n][0];
		fire[i].rgb[1] = c[n][1];
		fire[i].rgb[2] = c[n][2];
	}
}

3 烟花上升

y坐标 还没到达爆炸高度时一直上升

for (int i = 0; i < MAXNUM; i++)
{
	if (fire[i].nowy > fire[i].endy)
	{
		fire[i].nowy -= 3;
	}
}

4 烟花爆炸

爆炸进度 explode 不断增加,如果到达爆炸半径,就重新初始化。(接上面的if语句)

else
{
	if (fire[i].explode >= fire[i].radio)
	{
		fire[i].nowx = rand() % WIDTH;
		fire[i].nowy = HEIGHT + rand() % 250 + 50;
		fire[i].endy = rand() % 100 + 10;
		fire[i].radio = rand() % 50 + 120;
		fire[i].explode = 0;
		int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
		int n = rand() % 8;
		fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
		fire[i].rgb[0] = c[n][0];
		fire[i].rgb[1] = c[n][1];
		fire[i].rgb[2] = c[n][2];
	}
	else fire[i].explode++;
}

5 绘制烟花

上升

绘制5个圆,大小从大到小,颜色从深到浅(增加rgb值)

for (int i = 0; i < MAXNUM; i++)
{
	if (fire[i].nowy > fire[i].endy)
	{
		for (int size = 5; size > 0; size--)
		{
			int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
			for (int k = 0; k < 3; k++)
			{
				temp[k] += 50 * (5 - size);
				if (temp[k] > 255) temp[k] = 255;
			}
			setfillcolor(RGB(temp[0], temp[1], temp[2]));
			solidcircle(fire[i].nowx, fire[i].nowy + 15*(10 - size), size);
		}
	}
}

爆炸

重头戏!重头戏!重头戏!需要一些简(fù)单(zá)的数(gāo)学(děng)常(shù)识(xúe)!

颜色渐变的实现方式跟前面一样,只不过这里要用三角函数计算坐标,再用万有引力抛物线等改变 y坐标,让它看得更真实!(牛顿:算你小子识相)

具体如何计算坐标,看我的文章,里面有说如何计算

然后是万有引力,大概需要高度乘以 0.98 ,这里就相当于减去 0.1

由于 easyx 坐标上方为 y = 0,所以,应该是:

y + (HEIGHT - y) * 0.1

再根据抛物线:y = x^2 ,修改一下就行了

else
{
	for (int a = 0; a < 360; a += 30)
	{
		for (int size = 5; size > 0; size--)
		{
			int x = cos(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowx;
			int y = sin(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowy + fire[i].radio / 2;
			int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
			for (int k = 0; k < 3; k++)
			{
				temp[k] += 50 * (5 - size);
				if (temp[k] > 255) temp[k] = 255;
			}
			setfillcolor(RGB(temp[0], temp[1], temp[2]));
			solidcircle(x, y + (HEIGHT - y) * 0.1 + size * (size - 2), size);
		}
	}
}

效果展示

c++ 烟花,C++,# EasyX,c++

c++ 烟花,C++,# EasyX,c++

c++ 烟花,C++,# EasyX,c++

还挺好看的,不是吗? 

完整代码

最后,把函数封装一下,main 函数写出来(有手就行!):

/*******************************
* 项目名称:新年烟花
* 开发环境:vs2022 + Easyx
* 作者:轩
* 代码长度:137 行
* 完成时间:2023.1.20
* 用时:2.2 小时
*******************************/

#include <graphics.h>
#include <math.h>
#include <time.h>
#include <stdio.h>

#define MAXNUM 15
#define WIDTH 640
#define HEIGHT 480
#define PI 3.1415926

struct Fire
{
	int nowx;
	int nowy;
	int endy;
	int radio;
	int explode;
	int rgb[3];
	COLORREF color;
}fire[MAXNUM];

void Init()
{
	for (int i = 0; i < MAXNUM; i++)
	{
		fire[i].nowx = rand() % WIDTH;
		fire[i].nowy = HEIGHT + rand() % 250 + 50;
		fire[i].endy = rand() % 100 + 10;
		fire[i].radio = rand() % 50 + 120;
		fire[i].explode = 0;
		int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
		int n = rand() % 8;
		fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
		fire[i].rgb[0] = c[n][0];
		fire[i].rgb[1] = c[n][1];
		fire[i].rgb[2] = c[n][2];
	}
}

void Draw()
{
	for (int i = 0; i < MAXNUM; i++)
	{
		if (fire[i].nowy > fire[i].endy)
		{
			for (int size = 5; size > 0; size--)
			{
				int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
				for (int k = 0; k < 3; k++)
				{
					temp[k] += 50 * (5 - size);
					if (temp[k] > 255) temp[k] = 255;
				}
				setfillcolor(RGB(temp[0], temp[1], temp[2]));
				solidcircle(fire[i].nowx, fire[i].nowy + 15*(10 - size), size);
			}
		}
		else
		{
			for (int a = 0; a < 360; a += 30)
			{
				for (int size = 5; size > 0; size--)
				{
					int x = cos(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowx;
					int y = sin(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowy + fire[i].radio / 2;
					int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
					for (int k = 0; k < 3; k++)
					{
						temp[k] += 50 * (5 - size);
						if (temp[k] > 255) temp[k] = 255;
					}
					setfillcolor(RGB(temp[0], temp[1], temp[2]));
					solidcircle(x, y + (HEIGHT - y) * 0.1 + size * (size - 2), size);
				}
			}
		}
	}
}

void Move()
{
	for (int i = 0; i < MAXNUM; i++)
	{
		if (fire[i].nowy > fire[i].endy)
		{
			fire[i].nowy -= 3;
		}
		else
		{
			if (fire[i].explode >= fire[i].radio)
			{
				fire[i].nowx = rand() % WIDTH;
				fire[i].nowy = HEIGHT + rand() % 250 + 50;
				fire[i].endy = rand() % 100 + 10;
				fire[i].radio = rand() % 50 + 120;
				fire[i].explode = 0;
				int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
				int n = rand() % 8;
				fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
				fire[i].rgb[0] = c[n][0];
				fire[i].rgb[1] = c[n][1];
				fire[i].rgb[2] = c[n][2];
			}
			else fire[i].explode++;
		}
	}
}

int main()
{
	srand(time(NULL));
	initgraph(640, 480);
	Init();
	BeginBatchDraw();
	while (true)
	{
		cleardevice();
		Draw();
		Move();
		FlushBatchDraw();
		Sleep(2);
	}
	EndBatchDraw();
	closegraph();
	return 0;
}

新年快乐!文章来源地址https://www.toymoban.com/news/detail-745279.html

到了这里,关于2023 新的一年:C++烟花代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • C++实现贪吃蛇(含源代码)—基于easyx图形库

    C++实现贪吃蛇(含源代码)—基于easyx图形库

                                            食用指南:本文在有C++基础的情况下食用更佳                                           🍀 本文前置知识: C++基础                                        ♈️ 今日夜电波:toge—あよ              

    2024年02月09日
    浏览(40)
  • C++ easyx大一期末作业利器

    C++ easyx大一期末作业利器

    紧跟着1.0版本的完成,又到了激动人心的C++期末作业了。(上学期是C语言的),这学期,我仅仅改了一点点上学期的期末作业,然后很轻松的水…啊不,完成了这次的期末作业。 所以,大家一定要注重复用!!! 很快乐。 这个改一改就是你的…啊不是,我是说基于框架进行开发

    2024年02月15日
    浏览(8)
  • C++烟花实现思路及源码

    C++烟花实现思路及源码

    青春就像一场烟花,美得让人窒息,却短暂得让人流泪。 我们该如何用代码记录下现实中的烟花,让它成为永恒呢? 首先把烟花分成两个阶段: 烟花弹升空 和 烟花绽放 。 然后把 烟花弹(jet) 和 烟花(flower) 各作为一个 对象 ,再思考它们各自的 属性 。 为了实现多个烟花的效

    2024年02月02日
    浏览(8)
  • Visual C++ 2010 Express和EasyX初学者入门

    Visual C++ 2010 Express和EasyX初学者入门

    本文将介绍Visual C++ 2010 Express创建Win32控制台(Console)程序、创建WIN32项目(project)程序,及其EasyX的用途和使用。 Visual C++ 2010 Express使用 Visual C++ 2010 Express是微软在2010年出品的免费C++开发集成开发环境,专用于C++语言的编程、调试和运行。 【为什么用这个版本?VC++6.0版本太

    2024年02月05日
    浏览(9)
  • 基于easyx和C++实现的鼠标交互界面(点击按钮)| 系统设计

    基于easyx和C++实现的鼠标交互界面(点击按钮)| 系统设计

    实现效果一览: 当鼠标放上去后效果: 代码实现及详解: 欢迎讨论!

    2024年04月27日
    浏览(12)
  • C++ 之 Visual Studio 搭建 EasyX Graphics Library 图形库环境,并使用EasyX(graphics.h)绘制第一个图形

    C++ 之 Visual Studio 搭建 EasyX Graphics Library 图形库环境,并使用EasyX(graphics.h)绘制第一个图形

    目录 C++ 之 Visual Studio 搭建 EasyX Graphics Library  图形库环境,并使用EasyX(graphics.h)绘制第一个图形 一、简单介绍 二、Visual Studio 下载安装 三、EasyX Graphics Library 下载与安装到 Visual Studio 中 四、 EasyX(graphics.h)  和 Visual Studio C++  绘制第一个图形 五、关键代码 C++ 开发的一些知识

    2024年02月05日
    浏览(11)
  • easyx常见问题:编译错误:“2 个重载中没有一个可以转换所有参数类型” ;编译错误:“EasyX is only for C++”

    错误描述: 一些程序在 VC6 下运行好好地,但是放到 VC2008 及更高版本 VC 下编译却报错误(以下仅以 VC2008 举例,高版本 VC 类似),例如使用如下语句: 在 VC6 下可以成功编译,但在 VC2008 下编译后会有错误。 错误提示如下: 同样的,对于其他一些包含字符串调用的函数,例

    2024年02月05日
    浏览(11)
  • 蓝桥杯 2023 C++ B组 (个人代码,可能有小错误)

    蓝桥杯 2023 C++ B组 (个人代码,可能有小错误)

    A题直接枚举即可,枚举日期,暴力匹配 答案: 可以看出香浓信息熵有单调性(在0不超过1这个前提下) 因此直接二分即可,顺便输出一下结果对应的函数值 貌似可以直接O(1)算,但是我选择直接二分 二分的正确性在保证有解的前提下成立 顺便跑了几组对拍: N ≤ le ≤ 10 直接

    2023年04月09日
    浏览(9)
  • 【华为OD机试 2023】 查找重复代码(C++ Java JavaScript Python)

    在线OJ 已购买本专栏用户,请私信博主开通账号,在线刷题!!! 运行出现 Runtime Error 0Aborted,请忽略 华为OD统一考试A卷+B卷 新题库说明 2023年5月份,华为官方已经将的 2022/0223Q(1/2/3/4)统一修改为OD统一考试(A卷)和OD统一考试(B卷)。 你收到的链接上面会标注A卷还是B卷。

    2023年04月13日
    浏览(12)
  • 【华为OD机试 2023】 查找重复代码(C++ Java JavaScript Python 100%)

    在线OJ 已购买本专栏用户,请私信博主开通账号,在线刷题!!! 运行出现 Runtime Error 0Aborted,请忽略 华为OD统一考试A卷+B卷 新题库说明 2023年5月份,华为官方已经将的 2022/0223Q(1/2/3/4)统一修改为OD统一考试(A卷)和OD统一考试(B卷)。 你收到的链接上面会标注A卷还是B卷。

    2024年02月02日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包