跳转到主内容
极星编程网:以代码为星,赴技术山海!

C语言实战之浪漫烟花表白程序代码

创建win32控制台应用程序,选择空项目。

创建完毕后,右击头文件新建一个头文件(.h)。名字写main.h然后在源文件新建一个C++文件(.cpp)。名字写main.cpp

如图:

然后在main.h里面写上如下代码:#include #include #include #include #include #include #pragma comment(lib,"winmm.lib")

#define PI 3.1415926535#define NUM 13//烟花弹struct JET{int x, y; //坐标int hx,hy; //最高点坐标bool shoot; //判断烟花弹是不是发射状态

DWORD t1, t2, dt; //烟花弹发射的速度IMAGE img[2]; //图片2张 一明一暗的两张byte n : 1; //结构体 位段 变量 n 占用内存的一个位!

}jet[NUM];

//烟花struct FIRE{int r; //半径int maxr; //最大半径int x, y; //相对于窗口 中心点的坐标int cenx, ceny; //相对于图片本身 中心点的坐标int width, height;int xy[240][240]; //图片 保存到一个像素矩阵。

bool show; //是否绽放bool draw; //是否绘制DWORD t1, t2, dt; //爆炸的速度}fire[NUM];

void Init(int i);void Load();void Chose(DWORD& t1);void Shoot();void Show(DWORD* pem);在main.cpp写上如下代码:/*************************************************************************************************************************表白浪漫烟花项目开发************************************主讲人:三黑之毅****************************************最后修改:2019年3月20日*************************************************************************************************************************/

#include "main.h"

int main(){

//打开一个窗口 1200 800 initgraph(1200, 800);srand((unsigned int)time(NULL));

mciSendString(L"open ./fire/千年.mp3 alias bgm", 0, 0, 0);mciSendString(L"play bgm repeat", 0, 0, 0);DWORD t1 = GetTickCount();DWORD* pem = GetImageBuffer();

for (int i = 0; i < NUM; i++){Init(i);}Load();BeginBatchDraw();while (1){Sleep(10);

for (int clr = 0; clr < 1000; clr++){for (int j = 0; j < 2; j++){int px1 = rand() % 1200;int py1 = rand() % 800;

if (py1 < 799){pem[py1 * 1200 + px1] = pem[py1 * 1200 + px1 + 1] = BLACK;}}}

Chose(t1);Shoot();Show(pem);FlushBatchDraw();}return 0;}

//初始化 13个void Init(int i){// 分别为:烟花中心到图片边缘的最远距离、烟花中心到图片左上角的距离 (x、y) 两个分量int r[15] = { 120, 120, 155, 123, 130, 147, 138, 138, 130, 135, 140, 132, 155, 145, 124 };int x[15] = { 120, 120, 110, 117, 110, 93, 102, 102, 110, 105, 100, 108, 110, 145, 124 };int y[15] = { 120, 120, 85, 118, 120, 103, 105, 110, 110, 120, 120, 104, 85, 145, 124 };

fire[i].width = 500;fire[i].height = 500;fire[i].maxr = r[i];fire[i].cenx = x[i];fire[i].ceny = y[i];fire[i].show = false;fire[i].t1 = GetTickCount();fire[i].dt = 5;fire[i].r = 0;

//初始化烟花弹的部分数据jet[i].t1 = GetTickCount(); //定个时间点jet[i].dt = rand() % 10; //0-9 ms jet[i].n = 0;jet[i].shoot = false; //都是没有发射的。

}

//加载图片void Load() //加载到哪里去?

{IMAGE fm, gm;loadimage(&fm, L"./fire/flower.jpg", 3120, 240);for (int i = 0; i < NUM; i++){SetWorkingImage(&fm); //fm去拿getimage(&gm,i*240, 0, 240, 240); //gm SetWorkingImage(&gm); //gm去拿

for (int a = 0; a < 240; a++){for (int b = 0; b < 240; b++){fire[i].xy[a][b] = getpixel(a, b);}}}

//文件夹IMAGE sm;loadimage(&sm, L"./fire/shoot.jpg", 200, 50);//保存在sm for (int i = 0; i < NUM; i++){SetWorkingImage(&sm); //sm去拿int n = rand() % 5; //0-4 getimage(&jet[i].img[0], n*20,0,20,50); //暗的getimage(&jet[i].img[1], (n + 5) * 20, 0, 20, 50); //亮的}SetWorkingImage(NULL); //sm去拿}

//选择烟花弹 烟花弹产生的速度!!!

void Chose(DWORD& t1){DWORD t2 = GetTickCount(); //13个

if (t2 - t1 > 1) //每隔1个ms 产生一个烟花弹{int n = rand() % NUM; //0-12 if (jet[n].shoot == false&&fire[n].show == false) //非发射状态{jet[n].x = rand()%1200;jet[n].y = rand() % 100 + 600; //600-699之间jet[n].hx = jet[n].x;jet[n].hy = rand()%400; //0-399 jet[n].shoot = true; //发射状态

putimage(jet[n].x, jet[n].y, &jet[n].img[jet[n].n], SRCINVERT);}t1 = t2;}}

void Shoot(){for (int i = 0; i < NUM; i++){jet[i].t2 = GetTickCount();if (jet[i].t2 - jet[i].t1 >= jet[i].dt&&jet[i].shoot==true){putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);if (jet[i].y >= jet[i].hy){jet[i].n++; //一闪一闪jet[i].y -= 5; //上升}//putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);

if (jet[i].y <= jet[i].hy) //到达最高点了{//擦除烟花弹putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);//烟花弹最高点的 hx hy -----》烟花fire[i].x = jet[i].hx;fire[i].y = jet[i].hy;//改变烟花弹的状态jet[i].shoot = false;fire[i].show = true;}

putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);jet[i].t1 = jet[i].t2;}}}

void Show(DWORD* pem){int dir[16] = { 5, 5, 5, 5, 5, 8, 25, 25, 25, 55, 55, 55, 55, 65, 65, 66 };

for (int i = 0; i < NUM; i++){fire[i].t2 = GetTickCount();

if (fire[i].t2 - fire[i].t1>fire[i].dt&&fire[i].show == true){if (fire[i].r < fire[i].maxr){fire[i].r++;fire[i].dt = dir[fire[i].r / 10];fire[i].draw = true;}

if (fire[i].r >= fire[i].maxr - 1){fire[i].draw = false;Init(i);}fire[i].t1 = fire[i].t2;}

if (fire[i].draw == true){//圆 PI for (double a = 0; a <= 6.28; a += 0.01){int x1 = (int)(fire[i].cenx + fire[i].r*cos(a));int y1 = (int)(fire[i].ceny - fire[i].r*sin(a));if (x1 > 0 && x10 && y1 < fire[i].height){int b = fire[i].xy[x1][y1] & 0xff;int g = (fire[i].xy[x1][y1] >> 8) & 0xff;int r = fire[i].xy[x1][y1] >> 16;

int xx = (int)(fire[i].x + fire[i].r*cos(a));int yy = (int)(fire[i].y - fire[i].r*sin(a));

if (r>0x20 && g > 0x20 && b > 0x20 && xx > 0 && xx<1200 && yy>0 && yy < 800) pem[yy * 1200 + xx] = BGR(fire[i].xy[x1][y1]);}}fire[i].draw = false;}}}注:音乐:千年.mp3,自己去网上下载,然后放到程序fire目录下。

注:图片素材就是这两张:

自己下载一下这两图,也放到fire目录下。

学习c语言:

幼儿园英语水平 初中数学水平 高中语文水平

也就是说只要会记单词就行!!!

业务逻辑

写程序的顺序

这是最主要的,而并不是代码

会了所有代码,脑子里没有业务逻辑,还是没用,被称为“码农”

还是不懂的联系q:2060164008或进q群:706625210。

今天直播到此结束!!!三黑之毅!

您可能感兴趣的文章:c语言判断是否素数程序代码C语言实现烟花表白程序代码C语言小程序 杨辉三角示例代码C语言 实现N阶乘的程序代码如何将C语言代码转换为应用程序(也就是编译) C语言实现数独程序的示例代码C语言必背的一些经典程序代码实例

相关文章