怎么制作自己的网站,海南省住房和城乡建设局网站,深圳公司网站设计,个人工作室如何纳税系列文章 序号直达链接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…
系列文章 序号直达链接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.hEasyX 库的图形函数。conio.h提供控制台输入输出功能如 _getch() 用于等待按键输入。math.h数学运算函数。Windows.h 和 mmsystem.hWindows 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 图形库的开发环境配置好并且需要准备对应的图片文件和音频文件。此外由于这个程序是无限循环的通常应该有一个退出条件或事件监听机制例如检测用户的关闭窗口操作或者特定键的按下以便能够优雅地退出程序。
写在后面
我是一只有趣的兔子感谢你的喜欢