情人节浪漫表白,程序员的专属浪漫-----烟花表白

2023-05-16

谁说程序员不懂浪漫?

for(birth; death; ){ love++; }

do{ love++; } while (death)

可执行的exe文件我放在文章后面了!

直接双击点开就可以使用了

最终效果:

 

 

 

运行环境:VS2019 、 easyx图形库

1.头文件:

#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <mmsystem.h>
#pragma comment ( lib, "Winmm.lib" )

#define PI 3.14
#define NUM 13

2.定义烟花弹、烟花结构体

 struct Fire{ ...... }fires[NUM];

struct Fire
{
	int r;					// 当前爆炸半径
	int max_r;				// 爆炸中心距离边缘最大半径
	int x, y;				// 爆炸中心在窗口的坐标
	int cent2LeftTopX, cent2LeftTopY;		// 爆炸中心相对图片左上角的坐标
	int width, height;		// 图片的宽高
	int pix[240][240];		// 储存图片像素点

	bool show;				// 是否绽放
	bool draw;				// 开始输出像素点
	DWORD t1, t2, dt;		// 绽放速度
}fires[NUM];

struct Bullet{. ....... }bullets[NUM];

// 烟花弹结构
struct Bullet
{
	int x, y;				// 烟花弹的当前坐标
	int topX, topY;				// 最高点坐标------将赋值给 FIRE 里面的 x, y
	int height;				// 烟花高度
	bool shoot;				// 是否可以发射

	DWORD t1, t2, dt;		// 发射速度
	IMAGE img[2];			// 储存花弹一亮一暗图片
	unsigned char n : 1;	// 图片下标 n++
}bullets[NUM];

3.定义一些函数

开场的表白函数:

//表白字幕部分
void welcome() {
	setcolor(YELLOW);  //修改画笔的颜色为黄色

	// 模拟字幕运动规矩
	int R = 180;
	int offX = 600; //圆心偏移量
	int offY = 200; //圆心偏移量
	for (int a = 90; a >= -210; a -= 6) {
		int x = offX + R * cos(a / 180.0 * PI);
		int y = offY + R * sin(a / 180.0 * PI);
		// 在指定的 (x,y)画一个圆,半径10
		//circle(x, y, 10);

		cleardevice(); //清除屏幕
		// a:  90 ~ -210
		// 90-a:  0~300
		// (90-a)/300.0: 0~1
		// (90-a)/300.0 * 50 = 0~50
		settextstyle((90 - a) / 300.0 * 50, 0, "楷体");

		// outtextxy在指定的位置,输入文字
		outtextxy(x - 80, y, "520——浪漫表白日");
		outtextxy(x - 10, y + 100, "献给我挚爱的女神");

		Sleep(18);
	}

	getchar();  //获取一个字符,实现暂停效果

	cleardevice();
	settextstyle(40, 0, "楷体");
	outtextxy(400, 200, "我爱你");
	outtextxy(400, 250, "往后余生是你");
	outtextxy(400, 300, "风雪是你");
	outtextxy(400, 350, "平淡是你");
	outtextxy(400, 400, "清贫是你");
	outtextxy(400, 450, "荣华是你");
	outtextxy(400, 500, "目光所致也是你");

	getchar();
}

 加载图片的函数:

// 加载图片
void loadFireImages()
{
	/**** 储存烟花的像素点颜色 ****/
	IMAGE fm, gm;
	loadimage(&fm, "fire/flower.jpg");

	for (int i = 0; i < 13; i++)
	{
		SetWorkingImage(&fm);
		getimage(&gm, i * 240, 0, 240, 240);

		SetWorkingImage(&gm);
		for (int a = 0; a < 240; a++)
			for (int b = 0; b < 240; b++)
				fires[i].pix[a][b] = getpixel(a, b);
	}

	/**** 加载烟花弹 ************/
	IMAGE sm;
	loadimage(&sm, "fire/shoot.jpg");

	for (int i = 0; i < 13; i++)
	{
		SetWorkingImage(&sm);
		int n = rand() % 5; //0..4

		getimage(&bullets[i].img[0], n * 20, 0, 20, 50);			// 暗
		getimage(&bullets[i].img[1], (n + 5) * 20, 0, 20, 50);		// 亮
	}

	//设置绘图设备为默认绘图窗口,就是当前游戏窗口
	SetWorkingImage();		// 设置回绘图窗口
}

烟花弹的升空函数

// 烟花弹升空
void shoot() {
	for (int i = 0; i < 13; i++) {
		bullets[i].t2 = timeGetTime();

		if (bullets[i].t2 - bullets[i].t1 > bullets[i].dt && bullets[i].shoot == true) {
			// 擦除
			putimage(bullets[i].x, bullets[i].y, &bullets[i].img[bullets[i].n], SRCINVERT);

			// 更新烟花弹的位置和图片状态
			if (bullets[i].y > bullets[i].topY) {
				bullets[i].n++;
				bullets[i].y -= 5;
			}

			// 在新位置上,重新绘制
			putimage(bullets[i].x, bullets[i].y, &bullets[i].img[bullets[i].n], SRCINVERT);

			/**** 上升到高度的 3 / 4,减速 *****/
			// 即距离最高点还有1/4的时候,减速
			if ((bullets[i].y - bullets[i].topY) * 4 < bullets[i].height)
				bullets[i].dt = rand() % 4 + 10; // 10..13

			/**** 上升到最大高度 *****/
			if (bullets[i].y <= bullets[i].topY) {
				// 擦除烟花弹
				putimage(bullets[i].x, bullets[i].y, &bullets[i].img[bullets[i].n], SRCINVERT);

				// 准备渲染“烟花”
				fires[i].x = bullets[i].topX + 10;		// 在烟花弹中间爆炸
				fires[i].y = bullets[i].topY;			// 在最高点绽放
				fires[i].show = true;					// 开始绽放
				bullets[i].shoot = false;				// 停止发射

				 // 关闭点烟花的音效,并播放爆炸的音效, 并重新打开点烟花的音效
				char c1[64], c2[64];
				sprintf(c1, "close s%d", i);
				sprintf(c2, "play f%d", i);
				mciSendString(c1, 0, 0, 0);
				mciSendString(c2, 0, 0, 0);

				sprintf_s(c1, sizeof(c1), "open fire/shoot.mp3 alias s%d", i);
				mciSendString(c1, 0, 0, 0);
			}

			// 更新烟花弹的时间
			bullets[i].t1 = bullets[i].t2;
		}
	}
}

注意:以上只是部分代码,稍后我会把源码上传~

文章中无法发exe文件,可@博主本人或私聊!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

情人节浪漫表白,程序员的专属浪漫-----烟花表白 的相关文章

  • MySQL/MariaDB 字段约束

    主键约束 primary key 唯一且不为空 主键约束 xff1a 如果为一个列添加了主键约束 xff0c 那么这个列就是主键 xff0c 主键的特点是唯一且不能为空 通常情况下 xff0c 每张表都会有主键 添加主键约束 xff0c 例
  • MySQL/MariaDB 时间函数

    获取年月日时分秒 SELECT NOW 年月日及当前时间 SELECT CURDATE 年月日 SELECT CURRENT DATE 年月日 SELECT CURTIME 时分秒 SELECT CURRENT TIME 时分秒 年份 YE
  • MySQL/MariaDB 查询语句

    基础表 emp 去重查询 DISTINCT 查询职位 SELECT job from emp 显示所有职位 SELECT DISTINCT job FROM emp 查看表中包含的所有job类型 xff0c 重复的只显示一个 输出结果 限制
  • Spring框架通过工厂实现对象实例化过程

  • Eclipse常用设置

    1 界面风格 2 代码字体字号 3 工作空间编码
  • SpringBoot整合HikariCP连接池

    整合 HikariCP 连接池 创建依赖 配置连接池 打开 application properties 配置文件 xff0c 添加如下内容 spring datasource url 61 jdbc mysql dbgoods serve
  • SpringBoot框架整合MyBatis

    添加 MyBatis 启动依赖 参考官网mybatis org spring 找到Spring Boot菜单选项 基于菜单项找到MyBatis启动依赖 xff0c 一定要设置版本 xff0c Spring Boot 中没有设置 MyBati
  • BadTokenException: Unable to add window -- token android.os.BinderProxy

    由于遇到的是BadTokenException这个异常 xff0c 所以搜资料总结了一下 xff1a 这个异常总共有一下几种出现方式 xff1a 1 Unable to add window token null is not valid
  • SpringBoot框架整合SpringMVC、Mybatis框架,对数据库操作的工作原理

    Controller层 Controller层是接收用户访问的url信息 xff0c 再将获取到的内容发送到其他层级进行处理 xff0c 处理完成后返回新的url xff0c 使用户得到想要查询或是其他操作的页面 64 Controller
  • Lombok插件应用

    Lombok安装步骤 https blog csdn net weixin 47253919 article details 119871501 spm 61 1001 2014 3001 5502 常用注解 64 Setter 用于为描述
  • 类的属性(公有属性,受保护属性,私有属性)

    x是类的公有属性 class Animal x 61 10 def test self print Animal x print self x self是类本身 xff0c 等于Animal class Dog Animal def tes
  • linux网络配置(超简单,一看就会)

    2022 11 19 文章目录 前言一 linux网络 xff1f 二 使用步骤 1 查看本机ip 2 进入root用户 3 进入配置网络的目录 4 配置网络 5 重启网络服务 6 查看IP并测试网络 总结 一 linux网络 本章以配置虚
  • 【FPGA】四、按键消抖

    文章目录 一 按键消抖简介 二 按键消抖方式 1 硬件消抖 2 软件消抖 三 程序设计 1 设计思路 2 程序代码 3 仿真验证 总结 一 按键消抖简介 按键在我们日常生活中是很常见的 xff0c 主要有机械按键和虚拟按键 在我们用来进行F
  • 运行npm install出现这种问题怎么解决

    npm ERR code 1 npm ERR path C end springbootdtjr3 master src main resources admin admin node modules node sass npm ERR c
  • java中求平方根

    案例2 求平方根 需求 输入一个大于等于2的整数x xff0c 计算并返回x的平方根 结果只保留整数部分 xff0c 小数部分将被舍去 分析 计算x的平方根 就是x进行开方 开平方的调用函数是Math sqrt 但是要注意的是指保留整数部分
  • 解决Maven配置本地仓库路径不生效问题多个方法详解。(已成功解决自己遇到的问题)

    首先我尝试了很多种方法 xff0c 就是这个方法让我成功 xff0c 和大家分享一下 xff01 xff08 我用方法二成功的 xff01 xff09 maven本地仓库默认值 xff1a 用户家目录 m2 repository 由于本地仓
  • JAVA编写程序,打印九九乘法表(涵盖三种表达形式)

    运用java写出九九乘法表可以概括为三种表达形式 一是长方型 二是正三角型 三是倒三角型 无论是那种 xff0c 用的都是for循环 思路 xff1a 用两个for循环嵌套循环出因子a乘因子b等于乘积 xff0c 外循环代表因子a xff0
  • 【路径规划】蚁群算法机器人栅格地图最短路径规划【含Matlab源码 1618期】

    一 蚁群算法及栅格地图简介 1 蚁群算法 1 1 蚁群算法的提出 蚁群算法 ant colony optimization ACO 又称蚂蚁算法 是一种用来寻找优化路径的机率型算法 它由Marco Dorigo于1992年在他的博士论文中提
  • 遇见Java

    Java是一门面向对象的编程语言 xff0c 不仅吸收了C 43 43 语言的各种优点 xff0c 还摒弃了C 43 43 里难以理解的多继承 指针等概念 xff0c 因此Java语言具有功能强大和简单易用两个特征 Java语言作为静态面向
  • CSS基础-17-拓展-标签居中

    拓展 标签水平居中方法总结 margin 0 auto 如果需要让div p h 大盒子 水平居中 可以通过margin 0 auto 实现 注意点 1 如果需要让 div p h 大盒子 水平居中 xff0c 直接给当前元素本身设置即可

随机推荐

  • 用HTML和css写一个简单地购物小票

    效果图 HTML代码 lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt 小票 lt title gt lt link
  • AJAX详解

    1 AJAX是什么 xff1f AJAX即 Asynchronous JavaScript and XML xff08 异步的JavaScript与XML技术 xff09 xff0c 指的是一套综合了多项技术的浏览器端网页开发技术 2 异步
  • 计算机一级必考的10个Excel函数,让我来告诉你

    计算机一级必考的10个Excel函数 xff0c 让我来告诉你 有同学问 xff1a 计算机一级Excel要考哪些函数啊 xff1f xff0c 下图的10个函数就是一级必考的 001 sum求和函数 定义 xff1a 对指定参数进行求和
  • 【一则文章带你了解JavaScript】

    前言 xff1a 想要入门JS xff0c 那我们必须首先了解一下JS的作用 xff0c 我们学习后可以做些什么呢 xff1f 一 首先 xff0c 网页中的表单动态校验以及密码强度的检测是会用到JS的 二 其次 xff0c 我们的网页高级
  • jQuery实现王者荣耀手风琴案例(知识块讲解+案例)

    前言 xff1a 这个案例是几年前的了 xff0c 现在的王者官网是没有这个手风琴模块的 xff0c 我了解到这个案例 xff0c 是受到了黑马程序员知名教师 pink老师的启发 xff0c 我相信大家也都不陌生 xff0c 同样也是我非常
  • 错误问题: Cannot read property ‘XXX‘ of undefined

    undefined不能读取属性XXX 说明定义变量里的值是undefined 查看报错的代码顺藤摸瓜 那打印console看一下 很关键 一定要学会打印 有可能是代码的书写错误了 xff08 大意写错了 xff09 当发现问题后 要学会顺腾
  • Node.js——fs的模块的读取文件-书写文件

    目录 一 fs模块的介绍与初始化 二 fs readFile 读取文件 第二种方法 xff1a 失败演示 xff1a 三 小结 四 fs writeFile 方法向指定文件中写入内容 五 案例 整理用户信息 一 fs模块的介绍与初始化 fs
  • MySQL卸载不干净-MySQL Connector Net xxx文件怎么也删除不了?一招解决它

    相信很多人都遇到过这个问题 xff0c MySQL手动总是卸载不干净 今天没想到让我遇到了 xff0c 那么它就是自讨苦吃 哈哈哈 xff08 这波感谢一下微软 xff0c 为什么 xff1f 大家往下看 xff09 绝招 xff1a 既然
  • uniapp -- 关于uni.navigateTo方法无法跳转的解决方法

    今天做页面跳转的时候遇到了一个问题 xff0c uni navigateTo 方法不是万能的 x1f914 我的需求是在一个component目录下的一个组件中点击遍历出来的组件进入另一个组件 xff0c 我觉得有点绕 xff0c 所以我把
  • Python入门第一章笔记 从安装到编写hello world

    1 下载Python安装包 xff1b 可以到官网下载 xff1a https www python org 但是如果没有翻墙的话 xff0c 下载会很慢 25M安装包 xff0c 需要1个小时以上 如果没有耐心等可以在csdn进行下载 x
  • 谈谈 《 JavaScript - DOM编程艺术 》这本书

    前言 好吧 xff0c 现在已经2023年了 xff0c 对于这本书 xff08 第二版 xff09 来说可能有点老了 xff0c 这本书不是很难理解 xff0c 但也不是很适合新手读 xff0c 当然 xff0c 这本书并不是百宝书 x1
  • 前端程序员 从学校到工作转变的学习历程

    今天是星期一 xff0c 美好而又不是那么美好的上班开始了 xff0c 从学校到职场也有几个月时间了 xff0c 整体来说体验一般般 x1f914 xff0c xff08 请原谅我 这篇文章不配一张图的话 xff0c 会显得文字密密麻麻的
  • 分享项目 - Vue3 + TS + element-ui-plus 项目 -- Table表格表单

    文章目录 前言项目地址以及怎么阅读别人的代码整体代码分页数据作者是怎么处理的 usePagination顺藤摸瓜找到 api 接口的封装api 接口再往底层找全局请求封装与请求拦截器 service ts 前言 今天看一个 ts 项目的 t
  • SpringBoot工程的创建流程

    文章目录 一 初始化时导入的几个基本依赖二 pom文件需要修改的几个地方三 pom文件需要再增加的几个依赖四 maven仓库记得改成自己电脑本地的 xff01 xff01 xff01 五 报错的关于test目录的两个包六 根据数据创建实体类
  • 在matlab中使用find()函数删选数据

    find xff08 xff09 函数 可以查找非零元素的索引和值 拿具体实例来讲 clear clc A 61 1 2 3 456 66 77 343 44 4 3 4 5 A find A 2 gt 61 50 61 删选出A矩阵中第二
  • 【数据结构】二叉树的构建(C语言实现)

    1 树概念及结构 1 1树的概念 树是一种非线性 的数据结构 xff0c 它是由n xff08 n gt 61 0 xff09 个有限结点组成一个具有层次关系的集合 把它叫做树是因 为它看起来像一棵倒挂的树 xff0c 也就是说它是根朝上
  • 解决resultMap报错

    发现问题是使用resultMap来指定类型封装结果的时候出现错误 错误如下 首先排除代码层面的错误 点开错误也没有发现原因 经过查找原来是数据库的字段名和实体的实体名不一致 resultMap则不能自动封装数据 使用reultType 也并
  • Linux防火墙——iptables以及firewalld的使用介绍

    本文基于Linux上CentOS 7版本配合iptables iptables services firewalld等服务进行演示 一 防火墙概念以及Netfilter机制介绍 1 概念 2 防火墙两大类型 3 Netfilter功能 二
  • AOP是什么?如何使用AOP?

    AOP 基本概念是什么 xff1f 什么是AOP xff1f AOP 就是面向切面编程 xff0c 或者叫面向方面编程 xff0c 或者开玩笑的说叫面向方便面编程 在软件业 xff0c AOP为Aspect Oriented Program
  • 情人节浪漫表白,程序员的专属浪漫-----烟花表白

    谁说程序员不懂浪漫 xff1f for birth death love 43 43 do love 43 43 while death 可执行的exe文件我放在文章后面了 xff01 直接双击点开就可以使用了 最终效果 xff1a 运行环