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

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

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

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

烟花代码将会用到 Easyx 图形库,可以去官网下载:easyx.cnhttp://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;

}

 文章来源地址https://www.toymoban.com/news/detail-470743.html

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

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

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

相关文章

  • 大家都在用的AI作画Python几行代码就可实现

    要想快速实现功能,咱们先了解一下OpenAI,OpenAI是一家人工智能公司,专注于开发强化学习、机器学习、自然语言处理等技术。OpenAI的主要目标是创造一套安全的人工智能系统,以帮助人们在各行各业中利用这项技术.接下来咱们来实现一下。 安装openai库: 调用openai生成图片以

    2024年02月06日
    浏览(39)
  • Python-动态烟花【附完整源码】

    运行效果:Python动态烟花代码

    2024年01月17日
    浏览(39)
  • 让代码创造童话,共建快乐世界:六一儿童节特辑

    六一儿童节即将来临,这是一个属于孩子们的快乐节日。为了让这个节日更加有趣,我们发起了“让代码创造童话,共建快乐世界”六一活动。在这个活动中,我们邀请您用代码来制作充满童趣的作品,让孩子们在欢笑和惊喜中度过一个难忘的节日!下面是一篇关于如何用代

    2024年02月07日
    浏览(47)
  • 代码创造童话--Python为六一儿童节送专属礼物

    前言: Hello大家好,我是Dream。 六一儿童节到啦,祝所有的朋友们六一儿童节快乐! 在这个节日里,孩子们可以接受父母、老师、社会各界人士的关爱和祝福,同时也可以享受到各种各样的礼物和活动。Python作为一门流行的编程语言,也可以在六一儿童节中发挥它的作用。

    2024年02月07日
    浏览(47)
  • 【C++历险记】国庆专辑---探索多态迷宫的代码之旅

    🎉博客主页:.小智 🎉欢迎关注:👍点赞🙌收藏✍️留言 🎉系列专栏:C++终极篇 🎉代码仓库:小智的代码仓库 多态多态顾名思义就是多种形态,比如我们要完成某一件事情,不同的对象去完成,我们产生的结果是不一样的。 举个栗子我们平时的买火车票,就有这几种分

    2024年02月08日
    浏览(39)
  • python烟花代码简单可复制,python烟花代码怎么写

    大家好,本文将围绕Python烟花代码总体功能介绍展开说明,python烟花代码简单可复制是一个很多人都想弄明白的事情,想搞清楚python烟花代码怎么写需要先了解以下几个事情。 Source code download: 本文相关源码 疫情太严重了,有很多小伙伴都不能出门玩耍了。给大家看一个特别

    2024年02月20日
    浏览(52)
  • python烟花代码简单可复制,python烟花代码怎么运行

    大家好,小编来为大家解答以下问题,Python烟花代码总体功能介绍,python烟花代码简单可复制,今天让我们一起来看看吧! 天是2023 的第9天,到了这个时间点,部分小伙伴已经开始复盘这一年的得与失。比如今年增加了多少技能点,看了多少本书,写了多少篇文章或者年前

    2024年01月22日
    浏览(57)
  • python烟花代码简单可复制,python烟花代码加名字

    本篇文章给大家谈谈Python烟花代码总体功能介绍,以及python烟花代码简单可复制,希望对各位有所帮助,不要忘了收藏本站喔。 还有两天就到元旦了!!!很多小伙伴已经和朋友约好一起跨年了 但是现在很多地方都禁止烟花燃放,跨年没有烟花总感觉缺少一点味道~为了实现

    2024年03月15日
    浏览(47)
  • Python烟花代码,用Python制作一个烟花特效

    Python实现浪漫的烟花特效 现在很多地方都不能放烟花了,既然看不到, 那作为程序猿的我们还不能自己用代码做一个吗? 今天就带大家用代码做一个烟花特效吧。 pygame介绍 关于Pygame的基本信息,pygame是什么,谁会被Pygame吸引,并且在哪里找到它。 Pygame是被设计用来写游戏

    2024年02月08日
    浏览(48)
  • C语言实现万年历(附代码) 小白完成的第一个C语言程序,希望大家多多关注,点赞

    C语言实现万年历 前言:本文章向大家介绍如何使用C语言代码实现万年历使用实例,讲解编写万年历的方法,教你轻松学会写出万年历。这个小程序算是我自己写的第一个比较完整的小程序,算是对大一上学期学习的C语言程序设计基础的一个总结 知识强调 1.由于教皇格里戈

    2024年02月11日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包