【原创】烟花实现,基于windows操作系统

前言:

烟花的实现是我自己独立实现的第一个项目。那时离除夕只剩几天,我刚学完贪吃蛇。其实个人也很喜欢烟花。所以想送给朋友一份礼物。于是觉得可以一试。构思了一会后,就直接进行了。

成品:

思路:

1.vs2022很多特殊字符都打印不了。我首先把c语言本地化,然后复制了许多特殊字符,尝试它们在控制台能打印出来的结果,把能够打印出来的筛选字符都列出来。这样在烟花制作的过程中也许会用上。

2.烟花的画面是这样的。

下面是花筒,上面是烟花在上升时的花束和升到制高点时绽放的花体。

3.烟花如何实现

花筒直接用宽字符打印出来就可以,烟花的花束需要设置一个结构体,和贪吃蛇的蛇身一样(贪吃蛇的实现见上篇文章),只不过是单向向上移动,而且移动的速度要快许多。(睡眠的时间少很多)

烟花的花体也是一个结构体。这个结构体的构成也是一个个结点。你构建的结点个数,取决于一次绽放闪烁的火花有多少个。我尝试了一下,在9-15是最合适的,选择了12个结点。这些结点的坐标都用随机数设置。限制在上图的方体区域中。绽放一次睡眠一次。一个花筒得闪个四五次吧,在外面套上一层循环就可以了。

但是闪烁之后要消失,这个怎么处理?

借助贪吃蛇的删尾的思路,在原坐标处打印两个空格字符就可以覆盖掉。所以花体绽放之后还要写个循环来清理这些花体。

再来说花束的移动,花束升到至高点(指定坐标)后,再清理掉花束。

以上就可以完成简单的烟花播放了。(虽然是长方形的烟花)

如果要循环播放,就要在外面套个循环体。把烟花的初始化放在循环体外面。

4.代码附上

firework.h

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#pragma once

#include <stdio.h>
#include <locale.h>
#include <windows.h>
#include <stdbool.h>
#include <stdlib.h>

#define FIRE L'●'
#define ITEM L'█'
#define FLOWER L'﹡'

typedef struct firenode
{
	int x;
	int y;
	struct firenode* next;
}firenode,*pfirenode;

typedef struct firework
{
	pfirenode pf;
}firework,*pfirework;

void SetPos(int x, int y);
void Initfirework(pfirework ps);

void GameStart(pfirework ps,pfirework pflower);

void GameRun(pfirework ps,pfirework pflower);

firework.c

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include "firework.h"

void SetPos(int x, int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos = { x,y };
	SetConsoleCursorPosition(handle, pos);
}

void Initfirework(pfirework ps)
{
	for (int i = 0; i < 3; i++)
	{
		pfirenode node = (pfirenode)malloc(sizeof(firenode));
		if (node == NULL)
		{
			perror("Initfirework::(malloc)");
			return;
		}

		if (ps->pf == NULL)
		{
			node->x = 59;
			node->y = 31;
			node->next = NULL;
			ps->pf = node;
		}
		else
		{
			node->x = ps->pf->x;
			node->y = ps->pf->y - 1;
			node->next = ps->pf;
			ps->pf = node;
		}
	}

}

void Initfireflower(pfirework pflower)
{
	for (int i = 0; i < 12; i++)
	{
		pfirenode node = (pfirenode)malloc(sizeof(firenode));
		if (node == NULL)
		{
			perror("Initfirework::(malloc)");
			return;
		}

		pfirenode flower = pflower->pf;
		if (flower == NULL)
		{
			node->x = 30;
			node->y = 30;
			node->next = NULL;
			pflower->pf = node;
		}
		else
		{
			node->x = flower->x;
			node->y = flower->y - 1;
			node->next = flower;
			pflower->pf = node;
		}
	}

}
void WelcomeInfo()
{
	
	SetPos(52, 15);
	printf("请查收你的礼物.");
	SetPos(60, 17);
	printf("制作者:真白");

}
void GameStart(pfirework ps,pfirework pflower)
{
	//修改控制台大小和隐藏光标
	system("mode con cols=120 lines=40");
	system("title 礼物");

	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO console;
	GetConsoleCursorInfo(handle, &console);
	console.bVisible = false;
	SetConsoleCursorInfo(handle, &console);

    WelcomeInfo();

	SetPos(100, 36);
	system("pause");
	system("cls");

	Initfirework(ps);
	Initfirework(pflower);
}

void CreatFire(pfirework ps)
{
	//打印烟花
	pfirenode cur = ps->pf;
	while (cur)
	{
		SetPos(cur->x,cur->y);
		wprintf(L"%lc", FIRE);
		cur = cur->next;
	}
}



void FireMove(pfirework ps, pfirenode pnext)
{
	pnext->next = ps->pf;
	ps->pf = pnext;

	//尾删
	pfirenode cur = ps->pf;
	while (cur->next->next)
	{
		SetPos(cur->x, cur->y);
		wprintf(L"%lc", FIRE);
		cur = cur->next;
	}
	SetPos(cur->next->x, cur->next->y);
	printf("  ");
	free(cur->next);
	cur->next = NULL;
	
}

void CreatNextnode(pfirework ps)
{
	pfirenode cur = (pfirenode)malloc(sizeof(firenode));
	if (cur == NULL)
	{
		perror("CreatNextnode::malloc()");
		return;
	}

	//设置下一个结点的坐标
	pfirenode pnext = cur;
	pnext->x = ps->pf->x;
	pnext->y = ps->pf->y - 1;
	pnext->next = NULL;

	Sleep(50);
	FireMove(ps,pnext);
}

void FireFlower(pfirework pflower)
{
	
	Initfireflower(pflower);
	pfirenode cur = pflower->pf;
	while (cur)
	{
		cur->x = rand() % 20 + 50;
		cur->y = rand() % 12 + 2;
		cur = cur->next;
	}

	cur = pflower->pf;
	while (cur->next)
	{
		SetPos(cur->x, cur->y);
		wprintf(L"%lc", FLOWER);
		cur = cur->next;
	}
	Sleep(200);
	cur = pflower->pf;
	while (cur->next)
	{
		SetPos(cur->x, cur->y);
		printf("  ");
		cur = cur->next;
	}
}

test.c

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include "firework.h"


void test()
{
	firework fw = { 0 };
	firework Flower = { 0 };
    GameStart(&fw,&Flower);
	GameRun(&fw,&Flower);
	
}
int main()
{
	setlocale(LC_ALL, "");
	test();
	return 0;
}

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于yolov5的烟火检测可以分为两个主要步骤:模型训练和C++实现部署。 首先是模型训练。我们需要收集包含烟火的图像数据集,并进行数据标注,即标记图像中的烟火目标。接着,在yolov5的基础上进行一些调整和优化,以适应烟火检测任务。然后,使用标注好的数据集进行模型训练,通过迭代优化模型的权重和参数,使其具备较高的烟火检测精度。可以使用GPU来加速模型训练过程。最后,通过评估指标如mAP(平均精度均值)等来评估模型的性能。 其次是C++实现部署。在完成模型训练后,我们需要将其部署到实际环境中进行使用。首先,将模型保存为.onnx或.torchscript格式,以便于在C++中加载和使用。然后,使用C++编程语言,利用相应的深度学习框架(如OpenCV、TensorRT等)进行模型加载和推理。通过读取输入图像数据,将其输入到模型中进行烟火检测,获取检测结果。最后,根据实际需求,可以将检测结果进行可视化展示、保存或者与其他业务系统进行集成。 总之,基于yolov5的烟火检测涉及模型训练和C++实现部署两个主要步骤。模型训练需要进行数据收集、标注和调优,以及模型训练和性能评估;C++实现部署需要将模型保存,并利用C++编程语言和深度学习框架进行模型加载、推理和结果处理。这样可以实现高效准确的烟火检测功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值