#include<stdio.h>
#include<easyx.h>
#include<time.h>
#include<stdlib.h>
#include <Windows.h>
#include<math.h>
#include <conio.h>
#pragma comment(lib,"winmm.lib")
#include<mmsystem.h>
IMAGE img;
IMAGE img1;
IMAGE img2;
IMAGE img3;
#define num 10
#define PI 3.14
struct Fire //创建烟花弹结构体类型
{
int x, y;//初始坐标
int max_x, max_y;//烟花最大高度
IMAGE Img[1];//保存图片
bool boom;//是否要爆开
};
struct Fire fire[num];
struct Show
{
int x, y;//绽放的位置
int cx, cy;//烟花中心点坐标
int r;//当前的半径
int max_r;//最大半径
int pixel[200][200];//图片像素数组
bool isshow; // 是否绽放
bool isdraw; // 开始输出像素点
DWORD t1, t2, dt;
int width, height;
};
struct Show show[num];
void initshow(int i)//初始化烟花
{
show[i].cx = 100;
show[i].cy = 100;
show[i].r = 0;
show[i].max_r = 100;
show[i].width = 200;
show[i].height = 200;
show[i].isshow = false;
show[i].dt = 5;
show[i].t1 = timeGetTime();//时间获取速度
}
void initfire(int i)//初始化烟花弹
{
fire[i].x = rand() % 700 + 100;//烟花弹坐标初始化x=100-800;y=100-400;
fire[i].y = 600;
fire[i].max_x = fire[i].x;
fire[i].max_y = rand() % 300 + 100;
fire[i].boom = false;
loadimage(&fire[i].Img[0], "烟花弹.png", 20, 60);
}
void load()//加载烟花图片
{
for (int k = 0; k < num; k++)
{ int a = rand() % 3 + 1;
loadimage(&img1, "烟花1.png", 200, 200);//三种不同的烟花
loadimage(&img2, "烟花2.png", 200, 200);
loadimage(&img3, "烟花3.png", 200, 200);
if(a==1)
SetWorkingImage(&img1);
else
if(a==2)
SetWorkingImage(&img2);
else
SetWorkingImage(&img3);
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 200; j++)
{
show[k].pixel[i][j] = getpixel(i, j);//把图片像素点放到数组中
}
}
}
SetWorkingImage(NULL);
}
void Draw(int i, DWORD* pMem)//绘制一圈像素点
{
if (show[i].isdraw)
{
for (double a = 0; a <= 2*PI; a += 0.01) //一圈628个像素点
{
//(x1,y1)是相对于烟花小图片的 像素 坐标点
int x1 = (int)(show[i].cx + show[i].r * cos(a));
int y1 = (int)(show[i].cy + show[i].r * sin(a));
if (x1 > 0 && x1 < show[i].width && y1>0 && y1 < show[i].height)
{
int b = show[i].pixel[x1][y1] & 0xff; //blue
int g = (show[i].pixel[x1][y1] >> 8) & 0xff; //green
int r = show[i].pixel[x1][y1] >> 16; //red
//(xx,yy)是相对于窗口的 像素 坐标点
int xx = (int)(show[i].x + show[i].r * cos(a));
int yy = (int)(show[i].y + show[i].r * sin(a));
if (r > 0x20 && g > 0x20 && b > 0x20 && xx < 1000 && xx>0 && yy > 0 && yy < 600)
{
//把(x1,y1)坐标上的像素点 赋值 给(xx,yy)坐标点
pMem[yy * 1000 + xx] = BGR(show[i].pixel[x1][y1]);
}
}
}
show[i].isdraw = false;
}
}
void fire_boom(DWORD* pMem)//烟花绽放
{
int drt[16] = { 5, 5, 5, 5, 15, 15, 25, 25, 35, 35, 55, 55, 65, 65, 75, 75 };
for (int i = 0; i < num; i++)
{
show[i].t2 = timeGetTime();
if (show[i].t2 - show[i].t1 > show[i].dt && show[i].isshow == true)
{
if (show[i].r < show[i].max_r)
{
show[i].r++;
show[i].dt = drt[show[i].r / 10]; //每十个烟花像素点改变一下烟花绽放的速度
show[i].isdraw = true;
}
if (show[i].r >= show[i].max_r - 1)
{
show[i].isdraw = false;
initshow(i);
initfire(i);
}
//更新时间
show[i].t1 = show[i].t2;
//可以绽放的状态
Draw(i,pMem);
}
}
}
void fire_up()//烟花弹上升
{
for (int i = 0; i < num; i++)
{
putimage(fire[i].x, fire[i].y, &fire[i].Img[0], SRCINVERT);//消除残影
if (fire[i].y > fire[i].max_y)
{
fire[i].y -= 10;//向上移动
}
else
{ //已到达最高点,准备绽放
show[i].x = fire[i].x+10;
show[i].y = fire[i].y;
fire[i].boom = true;
show[i].isshow = true;
}
putimage(fire[i].x, fire[i].y, &fire[i].Img[0], SRCINVERT);
}
}
void word()//文字提醒-“请按任意键...”
{
settextcolor(RED);
settextstyle(25, 0, "宋体");
outtextxy(400, 550, "请");
Sleep(500);
outtextxy(425, 550, "按");
Sleep(500);
outtextxy(450, 550, "任");
Sleep(500);
outtextxy(475, 550, "意");
Sleep(500);
outtextxy(500, 550, "键");
Sleep(500);
outtextxy(525, 550, ".");
Sleep(500);
outtextxy(550, 550, ".");
Sleep(500);
outtextxy(575, 550, ".");
}
int main()
{
int i = 0;
srand((unsigned int)time(NULL));
initgraph(1000, 600);//初始化图形界面
loadimage(&img, "2023.png", 1000, 600);
putimage(0,0,&img,SRCINVERT);//背景图
mciSendString("open 打上花火.mp3",0,0,0);//播放—“打上花火”
mciSendString("play 打上花火.mp3", 0, 0, 0);
Sleep(1000);
word();//文字提醒-“请按任意键...”
_getch();//输入任意键继续
DWORD* pMem = GetImageBuffer();
for (int i = 0; i < num; i++)//初始化烟花弹和烟花
{
initfire(i);
initshow(i);
}
load();//加载烟花图片
while (1)
{
for (int i = 0; i < 3000; i++)
{
int px1 = rand() % 1000; // 0..1199
int py1 = rand() % 600; // 0.799
pMem[py1 * 1000 + px1] = BLACK;
pMem[py1 * 1000 + px1 + 1] = BLACK; // 对显存赋值擦出像素点
}
fire_up();//发射烟花弹
fire_boom(pMem);//烟花绽放
Sleep(50);
}
return 0;
}
75024659021676c语言烟花代码.zip
需积分: 0 2 浏览量
更新于2023-03-10
1
收藏 45.34MB ZIP 举报
标题 "75024659021676c语言烟花代码.zip" 提供的信息表明,这个压缩包包含的是用C语言编写的烟花模拟程序。C语言是一种广泛应用的编程语言,以其高效、简洁和灵活性而著名,是学习计算机科学的基础之一。烟花模拟程序可能是一个基于命令行或图形用户界面的应用,用于在屏幕上展示烟花绽放的效果。
描述 "75024659021676c语言烟花代码.zip" 并没有提供额外的具体信息,但我们可以推测这可能是一个教学项目或者编程挑战,旨在帮助学习者了解C语言中的图形绘制、动画制作以及随机数生成等技术。C语言并不直接支持图形化编程,所以实现烟花效果通常会涉及到控制台输出或者利用特定库,如SDL、Allegro或OpenGL等第三方图形库。
从压缩包的子文件名 "新年快乐-兔年顶呱呱" 来看,这个烟花代码可能是为了庆祝新年或兔年的到来而设计的。在中国文化中,新年尤其是春节时,烟花是重要的庆祝元素,象征着欢乐和繁荣。因此,这个程序可能包含了一些节日元素,比如特定颜色的烟花、特定形状的图案,甚至可能有文字显示,比如"新年快乐"或"兔年顶呱呱"。
关于C语言烟花代码的知识点可能包括:
1. **基本数据类型与控制结构**:理解C语言中的整型、浮点型变量,以及if语句、for循环和while循环,这些是程序逻辑的基础。
2. **函数的使用**:烟花程序可能会包含多个函数,如初始化、绘制烟花、更新状态等,需要理解函数的定义、调用和参数传递。
3. **随机数生成**:烟花的轨迹和颜色通常由随机数决定,需要用到C语言的`<stdlib.h>`库中的`rand()`函数,可能还需要配合`srand()`设置种子以确保每次运行的结果不同。
4. **字符与字符串处理**:如果要在屏幕上输出文字,就需要理解C语言的字符数组和字符串操作,如`printf()`函数。
5. **控制台绘图**:通过控制台输出不同的字符来模拟图形,如ASCII艺术,或者使用非标准输入/输出函数如ANSI转义码来改变文本颜色和位置。
6. **图形库应用**:如果使用了图形库,如SDL或Allegro,那么需要学习如何安装、配置和使用这些库,以及它们提供的图形绘制和动画功能。
7. **时间与延迟**:为了让烟花有动态效果,可能需要使用`<time.h>`库中的`sleep()`或`clock()`函数来实现定时器。
8. **结构体与指针**:复杂的数据结构如烟花对象可能需要用结构体表示,并通过指针进行操作,以便在函数之间传递和更新状态。
9. **内存管理**:根据程序规模,可能需要使用`malloc()`和`free()`来动态分配和释放内存。
10. **调试与优化**:理解和使用调试工具如GDB,以及如何通过性能分析优化代码,提高执行效率。
这个C语言烟花代码项目不仅涵盖了C语言的基本语法和控制流程,还涉及到了高级特性如图形绘制和随机数生成,是学习和实践C语言的一个有趣且富有挑战性的实例。
m0_74980634
- 粉丝: 0
- 资源: 1
最新资源
- 排序算法中插入排序C++实现及其特性
- 土地出让数据集(2000-2022.12)(104.8W+ 记录,48特征)CSV
- MFC如何修改多文档视图的标签
- 无人机路径规划中基于DDPG算法的MATLAB实现与信噪比优化
- 配电网电压与无功协调优化 以最小化运行成本(包含开关动作成本、功率损耗成本以及设备运行成本)和电压偏差为目标函数,考虑分布式电源的接入,采用线性化和二次松弛方法,将非凸模型转化为二阶锥规划模型,通过优
- MATLAB轴承动力学代码(正常、外圈故障、内圈故障、滚动体故障),根据滚动轴承故障机理建模(含数学方程建立和公式推导)并在MATLAB中采用ODE45进行数值计算 可模拟不同轴承故障类型,输出时域
- comsol模拟冻土水土热力盐四个物理场耦合
- Qt源码~~EQ曲线升级版 代码写的不错,注释也很详细了
- Halcon深度图渲染
- 01前端 / Node.js