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

 更新时间:2021年04月24日 12:42:37   投稿:mdxy-dxy  
这篇文章主要介绍了C语言实战之浪漫烟花表白程序代码,需要的朋友可以参考下

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

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

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

如图:

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

#include <stdio.h>
#include <graphics.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#include <mmsystem.h>
#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 && 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<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。
今天直播到此结束!!!三黑之毅!

相关文章

  • Objective-C不带加减号的方法实例

    Objective-C不带加减号的方法实例

    显而易见的事实是,Objective-C 中,+ 表示类方法,- 表示实例方法,这篇文章主要给大家介绍了关于Objective-C不带加减号的相关资料,需要的朋友可以参考下
    2021-06-06
  • C++初始化函数列表详细解析

    C++初始化函数列表详细解析

    C++可以定义引用类型的成员变量,引用类型的成员变量必须在构造函数的初始化列表中进行初始化
    2013-09-09
  • C++数据结构分析多态的实现与原理及抽象类

    C++数据结构分析多态的实现与原理及抽象类

    继承就是可以直接使用前辈的属性和方法。自然界如果没有继承,那一切都是处于混沌状态。多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
    2022-02-02
  • C语言编程中常见的五种错误及对应解决方案

    C语言编程中常见的五种错误及对应解决方案

    这篇文章主要给大家分享的是C语言编程中常见的五种错误及对应解决方案,详细内容就请跟小编一起进入下面的文章内容吧
    2021-10-10
  • OpenCV实现视频绿幕背景替换功能的示例代码

    OpenCV实现视频绿幕背景替换功能的示例代码

    这篇文章主要介绍了如何利用OpenCV实现视频绿幕背景替换功能,文中的示例代码讲解详细,对我们学习OpenCV有一定的帮助,感兴趣的可以学习一下
    2023-02-02
  • C++ main函数的几点细节

    C++ main函数的几点细节

    这篇文章主要介绍了C++ main函数的几点细节,帮助大家更好的理解和学习C++,感兴趣的朋友可以了解下
    2020-08-08
  • C++ AVL树插入新节点后的四种调整情况梳理介绍

    C++ AVL树插入新节点后的四种调整情况梳理介绍

    AVL树是高度平衡的而二叉树,它的特点是AVL树中任何节点的两个子树的高度最大差别为1,本文主要给大家介绍了C++如何实现AVL树,需要的朋友可以参考下
    2022-08-08
  • C++ sleep()和usleep()的区别

    C++ sleep()和usleep()的区别

    本文主要介绍了C++ sleep()和usleep()的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • C++多态的示例详解

    C++多态的示例详解

    多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。本文将通过三个小案例让大家更深入的了解一下C++的多态,感兴趣的可以了解一下
    2022-06-06
  • C++ 虚函数与纯虚函数的使用与区别

    C++ 虚函数与纯虚函数的使用与区别

    本文主要介绍了C++ 虚函数与纯虚函数的使用与区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论