亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++實(shí)現(xiàn)動(dòng)態(tài)煙花代碼

 更新時(shí)間:2023年01月27日 09:31:31   作者:某一個(gè)軒  
這篇文章主要介紹了利用C++實(shí)現(xiàn)的放煙花程序,用到了EGE圖形庫(kù),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下

寫(xiě)在前面

首先,祝大家新年快樂(lè)!

即將迎來(lái)新的一年——癸卯兔年,祝大家成績(jī)、事業(yè)“兔”飛猛進(jìn),必定紅紅火火!

在這篇文章中,將用煙花致以大家最好的祝福!

煙花代碼將會(huì)用到 Easyx 圖形庫(kù),可以去官網(wǎng)下載:easyx.cn

代碼思路

1 煙花結(jié)構(gòu)體

2 初始化煙花

3 煙花上升

4 煙花爆炸

5 繪制煙花

不需要任何圖片、音效(本來(lái)想加的,你要加自己加吧)

開(kāi)始編寫(xiě)

提前聲明:代碼純?cè)瓌?chuàng)!

需要用到的頭文件以及宏:

#include <graphics.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#define MAXNUM 15
#define WIDTH 640
#define HEIGHT 480
#define PI 3.1415926

graphics.h Easyx圖形庫(kù)

math.h 計(jì)算煙花位置

time.h 選取隨機(jī)種子

stdio.h 標(biāo)準(zhǔn)輸入輸出頭文件

MAXNUM 煙花數(shù)量

WIDTH , HEIGHT 窗口的寬、高

PI 圓周率常量,結(jié)合數(shù)學(xué)庫(kù)計(jì)算煙花位置

1 煙花結(jié)構(gòu)體

定義的參數(shù)如下:

nowx , nowy 現(xiàn)在坐標(biāo)

endy 爆炸高度

radio 爆炸半徑

explode 爆炸進(jìn)度

rgb[3] 煙花顏色rgb值

color 煙花顏色

struct Fire
{
	int nowx;
	int nowy;
	int endy;
	int radio;
	int explode;
	int rgb[3];
	COLORREF color;
}fire[MAXNUM];

2 初始化煙花

nowx , nowy 窗口外的隨機(jī)位置

endy 隨即高度

radio 隨即半徑

explode 一開(kāi)始設(shè)為0

rgb[3] 一些特定的顏色隨機(jī)取

color 按照rgb值

void Init()
{
	for (int i = 0; i < MAXNUM; i++)
	{
		fire[i].nowx = rand() % WIDTH;
		fire[i].nowy = HEIGHT + rand() % 250 + 50;
		fire[i].endy = rand() % 100 + 10;
		fire[i].radio = rand() % 50 + 120;
		fire[i].explode = 0;
		int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
		int n = rand() % 8;
		fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
		fire[i].rgb[0] = c[n][0];
		fire[i].rgb[1] = c[n][1];
		fire[i].rgb[2] = c[n][2];
	}
}

3 煙花上升

y坐標(biāo) 還沒(méi)到達(dá)爆炸高度時(shí)一直上升

for (int i = 0; i < MAXNUM; i++)
{
	if (fire[i].nowy > fire[i].endy)
	{
		fire[i].nowy -= 3;
	}
}

4 煙花爆炸

爆炸進(jìn)度 explode 不斷增加,如果到達(dá)爆炸半徑,就重新初始化。(接上面的if語(yǔ)句)

else
{
	if (fire[i].explode >= fire[i].radio)
	{
		fire[i].nowx = rand() % WIDTH;
		fire[i].nowy = HEIGHT + rand() % 250 + 50;
		fire[i].endy = rand() % 100 + 10;
		fire[i].radio = rand() % 50 + 120;
		fire[i].explode = 0;
		int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
		int n = rand() % 8;
		fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
		fire[i].rgb[0] = c[n][0];
		fire[i].rgb[1] = c[n][1];
		fire[i].rgb[2] = c[n][2];
	}
	else fire[i].explode++;
}

5 繪制煙花

上升

繪制5個(gè)圓,大小從大到小,顏色從深到淺(增加rgb值)

for (int i = 0; i < MAXNUM; i++)
{
	if (fire[i].nowy > fire[i].endy)
	{
		for (int size = 5; size > 0; size--)
		{
			int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
			for (int k = 0; k < 3; k++)
			{
				temp[k] += 50 * (5 - size);
				if (temp[k] > 255) temp[k] = 255;
			}
			setfillcolor(RGB(temp[0], temp[1], temp[2]));
			solidcircle(fire[i].nowx, fire[i].nowy + 15*(10 - size), size);
		}
	}
}

爆炸

重頭戲!重頭戲!重頭戲!需要一些簡(jiǎn)(fù)單(zá)的數(shù)(gāo)學(xué)(děng)常(shù)識(shí)(xúe)!

顏色漸變的實(shí)現(xiàn)方式跟前面一樣,只不過(guò)這里要用三角函數(shù)計(jì)算坐標(biāo),再用萬(wàn)有引力、拋物線等改變 y坐標(biāo),讓它看得更真實(shí)?。ㄅnD:算你小子識(shí)相)

具體如何計(jì)算坐標(biāo),看我的文章,里面有說(shuō)如何計(jì)算

然后是萬(wàn)有引力,大概需要高度乘以 0.98 ,這里就相當(dāng)于減去 0.1

由于 easyx 坐標(biāo)上方為 y = 0,所以,應(yīng)該是:

y + (HEIGHT - y) * 0.1

再根據(jù)拋物線:y = x^2 ,修改一下就行了

else
{
	for (int a = 0; a < 360; a += 30)
	{
		for (int size = 5; size > 0; size--)
		{
			int x = cos(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowx;
			int y = sin(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowy + fire[i].radio / 2;
			int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
			for (int k = 0; k < 3; k++)
			{
				temp[k] += 50 * (5 - size);
				if (temp[k] > 255) temp[k] = 255;
			}
			setfillcolor(RGB(temp[0], temp[1], temp[2]));
			solidcircle(x, y + (HEIGHT - y) * 0.1 + size * (size - 2), size);
		}
	}
}

效果展示

還挺好看的,不是嗎?

完整代碼

最后,把函數(shù)封裝一下,main 函數(shù)寫(xiě)出來(lái)(有手就行?。?/p>

/*******************************
* 項(xiàng)目名稱:新年煙花
* 開(kāi)發(fā)環(huán)境:vs2022 + Easyx
* 作者:軒
* 代碼長(zhǎng)度:137 行
* 完成時(shí)間:2023.1.20
* 用時(shí):2.2 小時(shí)
*******************************/
#include <graphics.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#define MAXNUM 15
#define WIDTH 640
#define HEIGHT 480
#define PI 3.1415926
struct Fire
{
	int nowx;
	int nowy;
	int endy;
	int radio;
	int explode;
	int rgb[3];
	COLORREF color;
}fire[MAXNUM];
void Init()
{
	for (int i = 0; i < MAXNUM; i++)
	{
		fire[i].nowx = rand() % WIDTH;
		fire[i].nowy = HEIGHT + rand() % 250 + 50;
		fire[i].endy = rand() % 100 + 10;
		fire[i].radio = rand() % 50 + 120;
		fire[i].explode = 0;
		int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
		int n = rand() % 8;
		fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
		fire[i].rgb[0] = c[n][0];
		fire[i].rgb[1] = c[n][1];
		fire[i].rgb[2] = c[n][2];
	}
}
void Draw()
{
	for (int i = 0; i < MAXNUM; i++)
	{
		if (fire[i].nowy > fire[i].endy)
		{
			for (int size = 5; size > 0; size--)
			{
				int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
				for (int k = 0; k < 3; k++)
				{
					temp[k] += 50 * (5 - size);
					if (temp[k] > 255) temp[k] = 255;
				}
				setfillcolor(RGB(temp[0], temp[1], temp[2]));
				solidcircle(fire[i].nowx, fire[i].nowy + 15*(10 - size), size);
			}
		}
		else
		{
			for (int a = 0; a < 360; a += 30)
			{
				for (int size = 5; size > 0; size--)
				{
					int x = cos(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowx;
					int y = sin(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowy + fire[i].radio / 2;
					int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
					for (int k = 0; k < 3; k++)
					{
						temp[k] += 50 * (5 - size);
						if (temp[k] > 255) temp[k] = 255;
					}
					setfillcolor(RGB(temp[0], temp[1], temp[2]));
					solidcircle(x, y + (HEIGHT - y) * 0.1 + size * (size - 2), size);
				}
			}
		}
	}
}
void Move()
{
	for (int i = 0; i < MAXNUM; i++)
	{
		if (fire[i].nowy > fire[i].endy)
		{
			fire[i].nowy -= 3;
		}
		else
		{
			if (fire[i].explode >= fire[i].radio)
			{
				fire[i].nowx = rand() % WIDTH;
				fire[i].nowy = HEIGHT + rand() % 250 + 50;
				fire[i].endy = rand() % 100 + 10;
				fire[i].radio = rand() % 50 + 120;
				fire[i].explode = 0;
				int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
				int n = rand() % 8;
				fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
				fire[i].rgb[0] = c[n][0];
				fire[i].rgb[1] = c[n][1];
				fire[i].rgb[2] = c[n][2];
			}
			else fire[i].explode++;
		}
	}
}
int main()
{
	srand(time(NULL));
	initgraph(640, 480);
	Init();
	BeginBatchDraw();
	while (true)
	{
		cleardevice();
		Draw();
		Move();
		FlushBatchDraw();
		Sleep(2);
	}
	EndBatchDraw();
	closegraph();
	return 0;
}

到此這篇關(guān)于C++實(shí)現(xiàn)動(dòng)態(tài)煙花代碼的文章就介紹到這了,更多相關(guān)C++煙花內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt5多線程編程的實(shí)現(xiàn)

    Qt5多線程編程的實(shí)現(xiàn)

    Qt通過(guò)三種形式提供了對(duì)線程的支持,本文主要介紹了Qt5多線程編程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語(yǔ)言中的柔性數(shù)組你了解嗎

    C語(yǔ)言中的柔性數(shù)組你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C99中的新語(yǔ)法——柔性數(shù)組的使用以及優(yōu)缺點(diǎn),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-04-04
  • 使用MySQL編程實(shí)現(xiàn)C語(yǔ)言功能強(qiáng)大化步驟示例

    使用MySQL編程實(shí)現(xiàn)C語(yǔ)言功能強(qiáng)大化步驟示例

    這篇文章主要為大家介紹了使用MySQL編程實(shí)現(xiàn)C語(yǔ)言功能強(qiáng)大化步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • (C和指針) #if 0/#if 1...#end if

    (C和指針) #if 0/#if 1...#end if

    #if 0還有一個(gè)重要的用途就是用來(lái)當(dāng)成注釋,如果你想要注釋的程序很長(zhǎng),這個(gè)時(shí)候#if 0是最好的,保證不會(huì)犯錯(cuò)誤
    2013-09-09
  • C語(yǔ)言的常量和字符串

    C語(yǔ)言的常量和字符串

    這篇文章主要為大家介紹了C語(yǔ)言常量和字符串,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C語(yǔ)言非遞歸后序遍歷二叉樹(shù)

    C語(yǔ)言非遞歸后序遍歷二叉樹(shù)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言非遞歸后序遍歷二叉樹(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 一文秒懂C語(yǔ)言/C++內(nèi)存管理(推薦)

    一文秒懂C語(yǔ)言/C++內(nèi)存管理(推薦)

    在C++中,內(nèi)存分為:棧、堆、自由存儲(chǔ)區(qū)、全局/靜態(tài)存儲(chǔ)區(qū)、常量存儲(chǔ)區(qū)。這篇文章主要介紹了一文秒懂C語(yǔ)言/C++內(nèi)存管理,需要的朋友可以參考下
    2020-11-11
  • C++實(shí)現(xiàn)基于控制臺(tái)界面的吃豆子游戲

    C++實(shí)現(xiàn)基于控制臺(tái)界面的吃豆子游戲

    這篇文章主要介紹了C++實(shí)現(xiàn)基于控制臺(tái)界面的吃豆子游戲,實(shí)例分析了吃豆子游戲的原理與C++實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • Qt使用QListWidget實(shí)現(xiàn)自定義Item

    Qt使用QListWidget實(shí)現(xiàn)自定義Item

    這篇文章主要為大家詳細(xì)介紹了Qt如何使用QListWidget實(shí)現(xiàn)自定義Item的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • 舉例分析private的作用(c/c++學(xué)習(xí))

    舉例分析private的作用(c/c++學(xué)習(xí))

    我知道我們可以用 public 中的值,把private中的數(shù)據(jù)給提出來(lái),但是還是搞不懂private該怎么用,或者說(shuō)在一個(gè)具體程序中,private有什么用
    2020-08-08

最新評(píng)論