欢迎光临散文网 会员登陆 & 注册

用c++表达生日祝福丨生日歌+烟花代码

2023-07-22 10:18 作者:MnAg同学  | 我要投稿

完整代码


# include<graphics.h>

#include<time.h>

#include<stdlib.h>

#include<stdio.h>

#include<math.h>

#include<Windows.h>

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

#define NUM 10  //烟花弹个数

#define PI 3.1415926 

# define L1 262  //定义音调

# define sL1 277

# define L2 294

# define sL2 311

# define L3 300

# define L4 349

# define sL4 370

# define L5 392

# define sL5 415

# define L6 440

# define sL6 466

# define L7 494

# define M1 523

# define sM1 554

# define M2 587

# define sM2 622

# define M3 659

# define M4 698

# define sM4 740

# define M5 784

# define sM5 831

# define M6 880

# define sM6 932

# define M7 988

# define H1 1046

# define sH1 1109

# define H2 1175

# define sH2 1245

# define H3 1318

# define H4 1397

# define sH4 1480

# define H5 1568

# define sH5 1661

# define H6 1760

# define sH6 1865

# define H7 1976

# define K  0

# define d1 222

# define d2 444

# define d3 888


void FireInit(int);

void Load();

void Shoot();

void ChoiceJet(DWORD&);

void ShowFire(DWORD*);


//烟花弹

struct jet{

int x,y;     //烟花弹坐标

int hx,hy;    //最高点坐标

bool shoot;    //烟花弹是否处于发射状态

DWORD t1,t2,dt;  //发射时间 引爆时间 间隔时间

IMAGE img[2];   //2张图片 一明一暗 01下标

byte n: 1;    //C结构体 位段 

}jet[NUM];      //烟花弹个数


//烟花

struct Fire{

int x,y;     //烟花的坐标

int r;      //烟花的半径

int max_r;    //最大半径

int cen_x,cen_y; //中心距左上角的距离

int width,height; //长宽

int xy[240][240]; //像素 矩阵

bool draw;    //画出

bool show;    //显示

DWORD t1,t2,dt;  //发射时间 引爆时间 隔离时间

}fire[NUM];


//初始化函数

void FireInit(int i){

//初始化烟花弹

jet[i].t1=GetTickCount();

jet[i].shoot=false;

jet[i].dt=10;

jet[i].n=0;

fire[i].show=false;

fire[i].r=0;

fire[i].dt=5;

fire[i].t1=GetTickCount();

fire[i].max_r=rand()%50+100;

fire[i].cen_x=rand()%30+80;

fire[i].cen_y=rand()%30+80;

fire[i].width=240;

fire[i].height=240;

}


//加载

void Load(){

//加载烟花弹

IMAGE jeting;

loadimage(&jeting,L"E:/mypro/fire/shoot.jpg",200,50);

SetWorkingImage(&jeting);

for(int i=0;i<NUM;i++){

int n=rand()%5;

getimage(&jet[i].img[0],n*20,0,20,50);

getimage(&jet[i].img[1],(n+5)*20,0,20,50);

}

SetWorkingImage(NULL);

//加载烟花

IMAGE fireimage,Fireimage;

loadimage(&Fireimage,L"E:/mypro/fire/flower.jpg",3120,240);

for(int i=0;i<NUM;i++){

SetWorkingImage(&Fireimage);

getimage(&fireimage,i*240,0,240,240);

SetWorkingImage(&fireimage);

for(int a=0;a<240;a++){

for(int b=0;b<240;b++){

fire[i].xy[a][b]=getpixel(a,b);

}

}

}

SetWorkingImage(NULL);

}


//选择烟花弹

void ChoiceJet(DWORD&t1){

DWORD t2=GetTickCount();

if(t2-t1>100) //烟花弹出现的时间间隔100ms

{

//烟花弹个数

int i=rand()%10;

//不处于发射状态

if (i<10 && jet[i].shoot==false && fire[i].show==false)

{

//烟花弹

jet[i].x=rand()%1000;

jet[i].y=rand()%100+450;

jet[i].hx=jet[i].x;

jet[i].hy=rand()%300; //0-299

jet[i].shoot=true; //发射状态


putimage(jet[i].x,jet[i].y,&jet[i].img[jet[i].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);

jet[i].shoot=false;

//达到最大高度,接下来交给烟花

//重新发射

fire[i].x=jet[i].hx;

fire[i].y=jet[i].hy;

fire[i].show=true;

}

}

jet[i].t1=jet[i].t2;

}

}


//显示烟花

void ShowFire(DWORD*pMem)

{

int drt[16]={5,5,5,5,5,10,25,25,25,25,55,55,55,55,55,65};


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].max_r)

{

fire[i].r++;

fire[i].dt=drt[fire[i].r/10];

fire[i].draw=true;

}

if(fire[i].r>=fire[i].max_r-1)

{

fire[i].draw=false;

FireInit(i);

}

fire[i].t1=fire[i].t2;

//如果该号炮花可爆炸,根据当前爆炸半径画烟花,颜色值接近黑色的不输出

if (fire[i].draw)

{

for(double a=0;a<=6.28;a+=0.01)

{

int x1=(int)(fire[i].cen_x+fire[i].r*cos(a));

int y1=(int)(fire[i].cen_y-fire[i].r*sin(a));

if (x1>0 && x1<fire[i].width && y1>0 && 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<1000 && yy>0 && yy<600)

{

pMem[yy*1000+xx]=BGR(fire[i].xy[x1][y1]);

}

fire[i].draw=false;

}

}

}

}

}

}


//主函数

int main()

{

//初始界面(1000,600)

initgraph(1000,600);

//初始化种子

srand((unsigned int)time(NULL));

DWORD t1=GetTickCount();

DWORD t2=GetTickCount();

DWORD*pMem=GetImageBuffer();

Beep(M1,d2); //祝你生日快乐

Beep(M1,d2);

Beep(M2,d3);

Beep(M1,d3);

Beep(M4,d3);

Beep(M3,d3+d3);

Beep(M1,d2); //祝你生日快乐

Beep(M1,d2);

Beep(M2,d3);

Beep(M1,d3);

Beep(M5,d3);

Beep(M4,d3+d3);

Beep(M1,d3); //祝你生日快乐

Beep(M1,d3);

Beep(H1,d3);

Beep(M6,d3);

Beep(M4,d3);

Beep(M3,d3);

Beep(M2,d3);

Beep(M7,d3+d1); //祝你生日快乐

Beep(M7,d2);

Beep(M6,d3);

Beep(M4,d3);

Beep(M5,d3);

Beep(M4,d3+d3);

for(int i=0;i<NUM;i++)

{

FireInit(i);

}

Load();

BeginBatchDraw();

while(1)

{

//随机选择像素点擦除

for(int clr=0;clr<200;clr++)

{

int px1=rand()%1000;

int py1=rand()%600;


//防止越界

if(py1<599)

{

//对显存赋值擦除像素点

pMem[py1*1000+px1]=pMem[py1*1000+px1+1]=BLACK;

}

}

ChoiceJet(t1);

Shoot();

ShowFire(pMem);

FlushBatchDraw();

}

system("pause");

return 0;

}






用c++表达生日祝福丨生日歌+烟花代码的评论 (共 条)

分享到微博请遵守国家法律