C/C++流星雨

系列文章

|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | 直达链接 |
| 1 | C/C++爱心代码 |
| 2 | C/C++跳动的爱心 |
| 3 | C/C++李峋同款跳动的爱心代码 |
| 4 | C/C++满屏飘字表白代码 |
| 5 | C/C++大雪纷飞代码 |
| 6 | C/C++烟花代码 |
| 7 | C/C++黑客帝国同款字母雨 |
| 8 | C/C++樱花树代码 |
| 9 | C/C++奥特曼代码 |
| 10 | C/C++精美圣诞树 |
| 11 | C/C++俄罗斯方块 |
| 12 | C/C++贪吃蛇 |
| 13 | C/C++孤单又灿烂的神-鬼怪 |
| 14 | C/C++闪烁的爱心 |
| 15 | C/C++哆啦A梦 |
| 16 | C/C++简单圣诞树 |
| 17 | C/C++小宇宙 |
| 18 | C/C++冰墩墩 |
| 19 | C/C++七彩花朵 |
| 20 | C/C++玫瑰花 |
| 21 | C/C++小猪佩奇 |
| 22 | C/C++简易爱心 |

写在前面

C/C++语言实现流星雨动态效果的完整代码。

完整代码

c 复制代码
#include <stdio.h>
#include <graphics.h> 
#include <conio.h>
#include <math.h>
#include <Windows.h>
#include <time.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")

#define PI 3.1415926535897932384624
#define MAXSTAR 300  // 限制星星数量,减少性能消耗
#define MAXMETEOR 199 // 流星数量

// 定义图片变量
IMAGE img1, img2, background;

// 星星结构体
struct Star
{
    int x, y;
    int speed;
    int color;
} star[MAXSTAR];

// 流星结构体
struct Meteor
{
    int x, y;
    int speed;
    int style;
} meteor[MAXMETEOR];

// 初始化星星
void initStar(int i)
{
    star[i].x = rand() % 1500;
    star[i].y = rand() % 1000;
    star[i].speed = rand() % 8 + 1;
    star[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
}

// 绘制并移动星星
void drawAndMoveStar(int i)
{
    setfillcolor(star[i].color);
    solidcircle(star[i].x, star[i].y, 2); // 绘制小圆作为星星
    star[i].x += star[i].speed;
    if (star[i].x > 1500)
    {
        initStar(i); // 重新初始化超出边界的星星
    }
}

// 初始化流星
void initMeteor(int i)
{
    meteor[i].x = rand() % 2200 - 1200; 
    meteor[i].y = -400;
    meteor[i].speed = rand() % 15 + 5;  // 速度范围 [5,19]
    meteor[i].style = rand() % 2;       // [0,1]
}

// 更新并绘制流星
void updateAndDrawMeteor()
{
    for (int i = 0; i < MAXMETEOR; i++)
    {
        // 移动流星
        meteor[i].x = meteor[i].x + meteor[i].speed / 2;
        meteor[i].y = meteor[i].y + meteor[i].speed / 2;

        // 绘制流星
        if (meteor[i].style == 0)
        {
            putimage(meteor[i].x, meteor[i].y, &img1, SRCPAINT);
        }
        else
        {
            putimage(meteor[i].x, meteor[i].y, &img2, SRCPAINT);
        }

        // 流星超出边界重新初始化
        if (meteor[i].x > 1500 || meteor[i].y > 1000)
        {
            initMeteor(i);
        }
    }
}

// 主函数
int main()
{
    // 加载图片
    loadimage(&img1, "1.jpg", 50, 50);
    loadimage(&img2, "2.jpg", 50, 50);
    loadimage(&background, "background.jpg", 1500, 1000);

    srand((unsigned int)time(NULL));

    // 创建图形窗口
    HWND hwnd = initgraph(1500, 1000);
    ShowWindow(hwnd, 3);

    // 播放背景音乐
    mciSendString("open 小幸运.mp3 alias MM", 0, 0, 0);
    mciSendString("play MM repeat", 0, 0, 0);

    // 初始化星星和流星
    for (int i = 0; i < MAXSTAR; i++)
    {
        initStar(i);
    }
    for (int i = 0; i < MAXMETEOR; i++)
    {
        initMeteor(i);
    }

    // 主绘图循环
    while (1)
    {
        BeginBatchDraw();

        // 绘制背景
        putimage(0, 0, &background);

        // 绘制并移动星星
        for (int i = 0; i < MAXSTAR; i++)
        {
            drawAndMoveStar(i);
        }

        // 更新并绘制流星
        updateAndDrawMeteor();

        EndBatchDraw();

        // 控制帧率
        Sleep(10);
    }

    _getch();
    closegraph();
    return 0;
}

代码分析

这段代码是一个使用 EasyX 图形库编写的 C++ 程序,它创建了一个模拟星空效果的图形窗口。程序中包含了星星和流星的动画效果,并且背景音乐在循环播放。下面是对这段代码的详细分析。

包含的头文件

  • graphics.h:EasyX 库的图形函数。
  • conio.h:提供控制台输入输出功能,如 _getch() 用于等待按键输入。
  • math.h:数学运算函数。
  • Windows.hmmsystem.h:Windows API 头文件,以及多媒体支持。

宏定义

  • PI:圆周率的值。
  • MAXSTAR:设定最大星星数量为300个,以限制性能消耗。
  • MAXMETEOR:设定最大流星数量为199个。

结构体定义

  • Star:表示一个星星,包含位置(x, y)、速度(speed)和颜色(color)。
  • Meteor:表示一个流星,包含位置(x, y)、速度(speed)和样式(style),其中样式决定了使用哪个图片作为流星图像。

函数定义

  • initStar(int i):初始化第i颗星星的位置、速度和颜色。
  • drawAndMoveStar(int i):绘制第i颗星星并更新其位置;如果星星移出了屏幕,则重新初始化。
  • initMeteor(int i):初始化第i颗流星的位置、速度和样式。
  • updateAndDrawMeteor():更新所有流星的位置,并根据它们的样式绘制相应的图片;如果流星移出了屏幕,则重新初始化。

主函数 main()

  • 加载了三张图片资源,分别用作两种不同样式的流星图像 (img1, img2) 和背景图像 (background)。
  • 使用当前时间来播种随机数生成器 (srand((unsigned int)time(NULL))),确保每次运行时星星和流星的初始状态都是不同的。
  • 创建了一个1500x1000像素的图形窗口,并显示出来。
  • 打开并循环播放名为"小幸运.mp3"的背景音乐。
  • 初始化所有星星和流星的状态。
  • 进入主绘图循环,持续不断地绘制背景、移动和绘制星星及流星,直到用户关闭程序。
  • 在主循环内使用 BeginBatchDraw()EndBatchDraw() 来批量处理绘图命令,提高效率。
  • 控制帧率为大约每秒100帧(通过 Sleep(10) 实现)。
  • 最后,在用户按键之前保持图形窗口打开,并在结束时清理图形环境。

请注意,为了正确运行这段代码,你需要有 EasyX 图形库的开发环境配置好,并且需要准备对应的图片文件和音频文件。此外,由于这个程序是无限循环的,通常应该有一个退出条件或事件监听机制,例如检测用户的关闭窗口操作或者特定键的按下,以便能够优雅地退出程序。

写在后面

我是一只有趣的兔子,感谢你的喜欢!

相关推荐
我不是代码教父10 分钟前
[原创](Modern C++)现代C++的关键性概念: 流格式化
c++·字符串格式化·流格式化·cout格式化
利刃大大27 分钟前
【回溯+剪枝】找出所有子集的异或总和再求和 && 全排列Ⅱ
c++·算法·深度优先·剪枝
charlie11451419136 分钟前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)
c语言·驱动开发·单片机·学习·教程·oled
LUCIAZZZ42 分钟前
简单的SQL语句的快速复习
java·数据库·sql
子燕若水1 小时前
mac 手工安装OpenSSL 3.4.0
c++
*TQK*1 小时前
ZZNUOJ(C/C++)基础练习1041——1050(详解版)
c语言·c++·编程知识点
komo莫莫da1 小时前
寒假刷题Day19
java·开发语言
ElseWhereR1 小时前
C++ 写一个简单的加减法计算器
开发语言·c++·算法
*TQK*2 小时前
ZZNUOJ(C/C++)基础练习1031——1040(详解版)
c语言·c++·编程知识点
S-X-S2 小时前
算法总结-数组/字符串
java·数据结构·算法