1.效果图

2.给vs2022配置exsyx,教学链接

1.VS2022安装EasyX 及 EasyX图形库安装和使用(附C++各图形编程项目示例源码)_vs配置easyx-CSDN博客

3.完整代码以及注释

/*******************************
* 项目名称:新年烟花
* 开发环境: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 1024    // 窗口宽度
#define HEIGHT 768    // 窗口高度
#define PI 3.1415926  // π常量

// 定义烟花结构体,包含位置、颜色、爆炸状态等
struct Fire
{
    int nowx;       // 当前烟花的x坐标
    int nowy;       // 当前烟花的y坐标
    int endy;       // 烟花的终点y坐标
    int radio;      // 烟花升空的速度
    int explode;    // 烟花爆炸的程度
    int rgb[3];     // 烟花的RGB颜色值
    COLORREF color; // 烟花的颜色(RGB颜色)
} fire[MAXNUM];     // 数组,用来存储多个烟花对象

// 初始化烟花的随机位置、颜色、爆炸速度等
void Init()
{
    for (int i = 0; i < MAXNUM; i++)
    {
        // 随机生成烟花的初始位置,适应新的大屏幕
        fire[i].nowx = rand() % WIDTH;      // x坐标
        fire[i].nowy = HEIGHT + rand() % 250 + 50; // y坐标(随机生成更高的位置)
        fire[i].endy = rand() % 100 + 10;   // 终点y坐标(控制烟花升空的高度)
        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;  // 保证颜色不超过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) // 每次生成8个方向的烟花粒子(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;  // 保证颜色不超过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; // 烟花每次上升3个像素
        }
        else
        {
            // 烟花已经到达终点,开始爆炸
            if (fire[i].explode >= fire[i].radio)
            {
                // 烟花爆炸后重新随机生成位置
                fire[i].nowx = rand() % WIDTH;      // 随机生成新的x坐标
                fire[i].nowy = HEIGHT + rand() % 250 + 50;  // 随机生成新的y坐标
                fire[i].endy = rand() % 100 + 10;   // 重新设定终点y坐标
                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(1024, 768);  // 创建一个1024x768的窗口
    Init();  // 初始化烟花
    BeginBatchDraw();  // 开始批量绘制
    while (true)
    {
        cleardevice();  // 清空屏幕
        Draw();         // 绘制烟花效果
        Move();         // 更新烟花位置
        FlushBatchDraw();  // 刷新屏幕
        Sleep(2);       // 每2毫秒刷新一次
    }
    EndBatchDraw();  // 结束批量绘制
    closegraph();    // 关闭图形窗口
    return 0;        // 程序结束
}

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐