有关圣诞节表白的c语言程序,C语言实战之浪漫烟花表白程序代码

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

创建完毕后,右击头文件新建一个头文件(.h)。名字写main.h

然后在源文件新建一个C++文件(.cpp)。名字写main.cpp

如图:

34ddb7d631da2e8db71504a9a1f19884.png

然后在main.h里面写上如下代码:

#include

#include

#include

#include

#include

#include

#pragma comment(lib,"winmm.lib")

#define PI3.1415926535

#define NUM13

//烟花弹

struct JET

{

intx, y;//坐标

inthx,hy; //最高点坐标

boolshoot; //判断烟花弹是不是发射状态

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目录下。

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

5402d9cd1364f42046ad665952eb288d.png

029741d916b377fe0d416f89b6d502a0.png

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

学习c语言:

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

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

业务逻辑

写程序的顺序

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值