C/C++流星雨

news2025/3/1 16:15:59

流星雨

系列文章

序号直达链接
1C/C++爱心代码
2C/C++跳动的爱心
3C/C++李峋同款跳动的爱心代码
4C/C++满屏飘字表白代码
5C/C++大雪纷飞代码
6C/C++烟花代码
7C/C++黑客帝国同款字母雨
8C/C++樱花树代码
9C/C++奥特曼代码
10C/C++精美圣诞树
11C/C++俄罗斯方块
12C/C++贪吃蛇
13C/C++孤单又灿烂的神-鬼怪
14C/C++闪烁的爱心
15C/C++哆啦A梦
16C/C++简单圣诞树
17C/C++小宇宙
18C/C++冰墩墩
19C/C++七彩花朵
20C/C++玫瑰花
21C/C++小猪佩奇
22C/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 图形库的开发环境配置好,并且需要准备对应的图片文件和音频文件。此外,由于这个程序是无限循环的,通常应该有一个退出条件或事件监听机制,例如检测用户的关闭窗口操作或者特定键的按下,以便能够优雅地退出程序。

写在后面

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

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

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

相关文章

MySQL——buffer poll

为什么要有buffer poll&#xff1f; 如果没有buffer poll&#xff0c;每次读取数据的时候都是从磁盘上读的&#xff0c;这样效率是很差的的。 所以有了提高效率的方式&#xff0c;就加上了一个缓存——buffer poll 所以&#xff0c;当我们读取数据的时候就有以下的方式 当读…

2025年山东省职业院校技能大赛“信息安全管理与评估”(山东省) 任务书

2025年山东省职业院校技能大赛“信息安全管理与评估”(山东省 任务书 模块一网络平台搭建与设备安全防护任务1&#xff1a;网络平台搭建 &#xff08;50分&#xff09;任务2&#xff1a;网络安全设备配置与防护&#xff08;250分&#xff09; 模块二网络安全事件响应、数字取证…

ERROR: KeeperErrorCode = NoNode for /hbase/master

原因分析 通过上面的情景模拟&#xff0c;我们可以看到报错的原因在于zookeeper中出现问题&#xff0c;可能是zookeeper中的/hbase/master被删除&#xff0c;或者是在hbase集群启动之后重新安装了zookeeper&#xff0c;导致zookeeper中的/hbase/master节点数据异常。 1. 停止…

ElasticSearch7.8学习笔记

1. ElasticSearch概述 1.1 ElasticSearch是什么 Elaticsearch&#xff0c;简称为 ES&#xff0c;ES 是一个开源的高扩展的分布式全文搜索引擎&#xff0c;是整个Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到…

CSS制作字体炫彩效果

目录 序言一、思路二、代码实现 序言 本节内容主要来讲解一下炫彩字体的实现&#xff0c;主要通过使用 background-clip以及background-position来实现&#xff0c;那么话不多说开始本节内容的学习吧&#xff01; 一、思路 添加盒子以及内容使用 background-clip属性&#x…

如何防止短信盗刷和短信轰炸?

短信盗刷和短信轰炸是项目开发中必须要解决的问题之一&#xff0c;它的优先级不亚于 SQL 注入的问题&#xff0c;同时它也是面试中比较常见的一个经典面试题&#xff0c;今天我们就来看下&#xff0c;如何防止这个问题。 1.概念介绍 短信盗刷和短信轰炸的概念如下&#xff1a…

ios逆向某新闻 md5+aes

本期的案例比较简单&#xff0c;也许是ios逆向算法本来就比较简单的原因&#xff0c;所以前面我就多扯一些爬虫和逆向的东西。之前写的文章都是js逆向和android逆向的案例&#xff0c;这也是首篇ios的案例&#xff0c;所以会从入门开始讲起。 3大逆向对比 首先爬虫工程师大部…

SpringBoot【一】零基础入门 springboot 及 idea 搭建

一、前言 springboot是什么&#xff1f; Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。用我的话来理解&#xff0…

2024年超大跨径钢结构桥梁创新技术论坛暨钢桥联盟年度工作会议顺利召开

12月5日&#xff0c;由中交公路规划设计院有限公司、装配化钢结构桥梁产业技术创新战略联盟主办&#xff0c;保利长大工程有限公司、中交第二航务工程局有限公司、中交第二公路工程局有限公司、中交路桥建设有限公司、中交西安筑路机械有限公司、南京现代综合交通实验室、巨力锁…

win10上部署win11记事本

win10上部署win11记事本 原因 win10的老用户们, 不肯升级win11, 绝对是有留恋的东西吧,就想win7用户那样, 但是win11在日益更新, 特别是记事本, 增加了很多好用的功能, 比如多标签页, 但是不想升级win11, 还想用, 怎么办? 我在网上找到了解决方案, 接下来, 我们来操作一下吧…

记录:ubuntu24.04源码安装nginx

一. 下载Nginx源码 两个地址二选一即可 Nginx官网Nginx官网 Github eg&#xff1a;nginx-1.27.3.tar.gz 下载到 ubuntu24.04 的 Downloads &#xff0c;解压 cd Downloads tar -zxvf nginx-1.27.3.tar.gz二. 编译安装 Note: 编译最好用 root 权限&#xff0c; 使用下面命令…

【前端】深入理解 JavaScript 中的数组与对象

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;数组与对象的基本概念数组&#xff08;Array&#xff09;数组示例 对象&#xff08;Object&#xff09;对象示例 &#x1f4af;数组与对象的对比核心区别如何选择&#…

31.下一个排列 python

下一个排列 题目题目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;题目链接 题解解题思路python实现代码解释&#xff1a;提交结果 题目 题目描述 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3…

Codeforces Round 992 (Div. 2)

这场cf只在b卡了一下&#xff0c;因为b真是犯蠢了&#xff0c;我以为会向下取整&#xff0c;结果是完全就不取整&#xff0c;或者说是向上取整&#xff0c;卡了我半个小时&#xff0c;要不是紧急看了题一下&#xff0c;昨天那场就毁了 话不多说&#xff0c;直接开讲 A. Game …

vue入门实战(二)父子组件显示,参数传递

经过上次的写法&#xff0c;我们已经写出每个list项&#xff0c;现在要在每个父组件下面加入自己的子项 一、新建子组件&#xff1a; smallItem.vue&#xff1a; <script> export default{props:[text,id,status] //父组件传来的参数 } </script> <template>…

批量验证指定漏洞思路和流程

免责申明 本文仅是用于学习研究POC的地址收集与漏洞验证原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》【学法时习之丨网络安全在身边一图了解网络安…

Android 事件分发机制详解/ 及Activity启动流程浅谈

目前网上的事件分发机制文章很多&#xff0c;可能大家看了很多&#xff0c;还是很懵逼&#xff0c;这篇文章是我自己总结的事件分发机制&#xff0c;提取了在事件分发机制中&#xff0c;最精华的部分&#xff0c;如果对事件分发还是不太清楚&#xff0c;可以看看这篇文章 更多…

蓝桥杯刷题日记02-小球反弹

问题描述 有一长方形&#xff0c;长为 343720343720 单位长度&#xff0c;宽为 233333233333 单位长度。在其内部左上角顶点有一小球 (无视其体积)&#xff0c;其初速度如图所示且保持运动速率不变&#xff0c;分解到长宽两个方向上的速率之比为 dx:dy15:17dx:dy15:17。小球碰…

SkyWalking 和 ELK 链路追踪实战

一、背景 最近在给项目搭建日志平台的时候&#xff0c;采用的方案是 SkyWalking ELK 日志平台&#xff0c;但发现 ELK 日志平台中的日志没有 Trace ID&#xff0c;导致无法追踪代码报错的整体链路。 空哥提示&#xff1a;Trace ID 是分布式追踪中用来唯一标识一个服务请求或事…

Ubuntu22.04深度学习环境安装【cuda+cudnn】

为了复现一篇深度学习论文&#xff0c;特意安装了Linux系统。前一天已经安装Linux显卡驱动&#xff0c;现在需要安装cuda、cudnn等。 论文代码 论文PDF 确定包版本&#xff1a; 根据论文提供的代码。在requirements.txt中发现cuda版本为11.7,cudnn为8.5.0&#xff0c;python没…