六一专辑||C++实现动态烟花代码

news2024/11/27 18:50:14

首先,祝大家儿童节快乐!

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

烟花代码将会用到 Easyx 图形库,可以去官网下载:easyx.cnicon-default.png?t=N4P3http://easyx.cn/

代码思路

1 烟花结构体

2 初始化烟花

3 烟花上升

4 烟花爆炸

5 绘制烟花

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

开始编写

提前声明:代码纯原创!

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

1

2

3

4

5

6

7

8

#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 烟花颜色

1

2

3

4

5

6

7

8

9

10

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值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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坐标 还没到达爆炸高度时一直上升

1

2

3

4

5

6

7

for (int i = 0; i < MAXNUM; i++)

{

    if (fire[i].nowy > fire[i].endy)

    {

        fire[i].nowy -= 3;

    }

}

4 烟花爆炸

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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值)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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,所以,应该是:

1

y + (HEIGHT - y) * 0.1

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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);

        }

    }

}

完整代码

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

/*******************************

* 项目名称:新年烟花

* 开发环境: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;

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/607825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设置主机名和host映射

这里写目录标题 设置主机名设置host映射主机名解析过程分析 设置主机名 为了方便记忆。可以给linux系统主机名&#xff0c;也可以根据需要修改主机名 指令hostname来查看主机名 修改主机名 vim /etc/hostname 进入之后修改就行 修改之后重启生效 设置host映射 如何通过主机…

分布式锁实现原理

为什么需要分布式锁&#xff1f; 本地锁synchronized只能锁住当前服务进程&#xff0c;一个本地锁只能锁一个服务&#xff0c;如果是分布式服务情况下使用本地锁&#xff0c;那么多少服务就会有多少进程同时执行&#xff0c;就是去了锁的效果&#xff0c;为了到达分布式情况下…

3.9 流水作业调度问题

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 1.我对流水调度问题的理解 流水作业调度问题是动态规划中的一个经典问题&#xff0c;它涉及将一系列作业分配给多个工作站以最小化总完成时间。该问题的…

go test 包外测试

之前文章有介绍过 go test coverage 单测覆盖率 和Go test基础用法&#xff0c;今天这里主要介绍 go 单测中比较特殊的一种场景&#xff1a;包外测试。初次看到这个名字&#xff0c;我还以为就是单独创建一个新目录&#xff0c;所有的单测用例统一都汇总到这个目录下&#xff0…

【P48】JMeter 断言持续时间(Duration Assertion)

文章目录 一、断言持续时间&#xff08;Duration Assertion&#xff09;参数说明二、测试计划设计 一、断言持续时间&#xff08;Duration Assertion&#xff09;参数说明 可以控制取样器的执行是否超过某个时间&#xff0c;如果超时则报错&#xff0c;持续时间断言器也叫超时…

21天学会C++:Day6----内联函数

CSDN的uu们&#xff0c;大家好。这里是C入门的第六讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 知识引入 2. 知识点讲解 2.1 内联函数的使用 2.2 内联函数的特性 2.2 …

强大Excel 插件 Zbrainsoft Dose for Excel 3.6.2 Crack

强大的 Excel 插件 Zbrainsoft Dose for Excel 3.6.2 如果您厌倦了在Excel中消除重复的行&#xff0c;比较工作表或执行困难的活动&#xff0c;那么Dose for Excel是您需要的强大便捷解决方案&#xff0c;只需单击几下即可将所有这些复杂的杂务简化。它具有 100 多个强大的新功…

pytorch实战 -- 自动微分

autograd——自动求导系统 import torch torch.manual_seed(7) <torch._C.Generator at 0x7f3c1f9e0490> torch.autograd.backward(tensors, grad_tensorsNone, retain_graphNone, create_graphFalse) 功能&#xff1a;自动求取梯度 tensors&#xff1a;用于求导的张量&…

axios-CancelToken方法取消请求-控制多次同样api调用取消上一次接口调用

前言 开发当中看到了axios取消方法&#xff0c;经过查阅&#xff0c;axios这个包是提供了取消请求的方法的。 移动端当是tab栏类的页面&#xff0c;或者是下拉刷新和上拉加载是一个接口是&#xff0c;会出现20条情况&#xff08;接口调用2次&#xff09;。 pc端同一个按钮&am…

【欢迎您,xxx--JavaScript】

login.html <body><form action"index.html">用户名&#xff1a;<input type"text" name"usname"><input type"submit" value"登录"></form> </body> index.html <body><di…

BERT在GLUE数据集构建任务

0 Introduction 谷歌开源的BERT项目在Github上&#xff0c;视频讲解可以参考B站上的一个视频 1 GLUE部分基准数据集介绍 GLUE数据集官网GLUE数据集下载&#xff0c;建议下载运行这个download_glue_data.py文件进行数据集的下载&#xff0c;如果链接无法打开&#xff0c;运行…

七、Gitee码云的注册及使用(二)

1、创建远程仓库 (1)登录Gitee.com&#xff0c;点击右上角 号&#xff0c;再点击新建仓库。 (2)填写仓库名称&#xff0c;路径&#xff0c;仓库介绍 (3)选择是否开源 (4)初始化仓库 开源许可证&#xff1a;主要包括开源是否可以随意转载&#xff0c;开源但不能商业使用&…

yolov8改进大作战,开箱即用,提供yolov8魔术师专栏代码

1.yolov8魔术师专栏介绍 开箱即用&#xff1a;提供 yolov8魔术师专栏 代码&#xff0c;方便直接使用&#xff0c;无需自己重新添加引起的一些bug问题&#xff1a; https://blog.csdn.net/m0_63774211/category_12289773.html?spm1001.2014.3001.5482 专栏内容如下&#xff…

【深入浅出Spring Security(五)】自定义过滤器进行前后端登录认证

自定义过滤器 一、自定义过滤器自定义登录认证过滤器自定义 LoginFilter配置 LoginFilter测试 二、总结 一、自定义过滤器 在【深入浅出Spring Security&#xff08;二&#xff09;】Spring Security的实现原理 中小编阐述了默认加载的过滤器&#xff0c;里面有些过滤器有时并…

OpenGL实现第一个窗口-三角形

1.简介 此代码是基于QtOpenGL实现的&#xff0c;但是大部分的代码是OpenGL&#xff0c;Qt封装了一些类&#xff0c;方便使用。 2.准备工作 QOpenGLWidget提供了三个便捷的虚函数&#xff0c;可以重写&#xff0c;用来重写实现典型的OpenGL任务。不需要GLFW。 paintGL&#…

【C语言】Visual Studio社区版安装配置环境(保姆级图文)

目录 1. 官网下载社区版2. 选择安装项目2.1 点击使用C的桌面开发2.2 语言包选择简体中文2.3 设置安装位置 3. 创建新项目3.1 点击创建新项目3.2 点击空项目&#xff0c;下一步3.3 设置项目名称路径3.4 创建项目 4. 测试例程总结 欢迎关注 『C语言』 系列&#xff0c;持续更新中…

代码随想录 二叉树 Java (一)

文章目录 &#xff08;简单&#xff09;144. 二叉树的前序遍历&#xff08;简单&#xff09;94. 二叉树的中序遍历&#xff08;简单&#xff09;145. 二叉树的后序遍历二叉树的统一遍历方法&#xff08;参考代码随想录&#xff09;&#xff08;中等&#xff09;102. 二叉树的层…

横岗茂盛村旧改,已立项,一期已拆平。

项目位于龙岗区横岗街道红棉路与茂盛路交汇处&#xff0c;距离轨道3号线横岗站约700米。 茂盛片区城市更新单元规划&#xff08;草案&#xff09;已经在近日公示&#xff0c;该旧改被纳入《2012年深圳市城市更新单元计划第五批计划》&#xff0c;2019年曾被暂停&#xff0c;20…

Redis实战14-分布式锁基本原理和不同实现方式对比

在上一篇文章中&#xff0c;我们知道了&#xff0c;当在集群环境下&#xff0c;synchronized关键字实现的JVM级别锁会失效的。那么怎么解决这个问题呢&#xff1f;我们可以使用分布式锁来解决。本文咱们就来介绍分布式锁基本原理以及不同实现方式对比。 我们先来回顾&#xff…

【深度学习】混合精度训练与显存分析

混合精度训练与显存分析 ​ 关于参数精度的介绍可以见文章https://zhuanlan.zhihu.com/p/604338403 相关博客 【深度学习】混合精度训练与显存分析 【深度学习】【分布式训练】Collective通信操作及Pytorch示例 【自然语言处理】【大模型】大语言模型BLOOM推理工具测试 【自然语…