1、表白程序C+菜鸟奉献你一个520表白神器爱情总是那么神圣,烂漫,每个人都会有无限的向往,即便是程序员(自我笑下),忽然我想起周星驰的那些话“曾经有一段爱情摆在我面前。我希望是一万年”,于是我试着做了表白程序。实现原理:原理比较的简单,主要是运用windows API来实现,程序初步实现的功能是显示文字,图像,歌曲(重复),燃放烟花(循环),程序的实现过程大概可以描述为烟花燃放的一个过程(初始化,上升,爆炸,循环),具体实现方法不再复述了,代码比较简单。工具:VS2013 Eaxy(冬至版)使用TC库,不是VC库,用Eaxy主要代码:#include graphics.h#include #in
2、clude #include #include #include #pragma comment ( lib, Winmm.lib )/* 宏定义区 */#define NUM 13 / 烟花种类数量宏定义/* 结构定义区 */ 烟花结构struct FIRE int r; / 当前爆炸半径 int max_r; / 爆炸中心距离边缘最大半径 int x, y; / 爆炸中心在窗口的坐标 int cen_x, cen_y; / 爆炸中心相对图片左上角的坐标 int width, height; / 图片的宽高 int xy240240; / 储存图片像素点 bool show; / 是否绽放
3、bool draw; / 开始输出像素点 DWORD t1, t2, dt; / 绽放速度FireNUM;/ 烟花弹结构struct JET int x, y; / 喷射点坐标 int hx, hy; / 最高点坐标-将赋值给 FIRE 里面的 x, y int height; / 烟花高度 bool shoot; / 是否可以发射 DWORD t1, t2, dt; / 发射速度 IMAGE img2; / 储存花弹一亮一暗图片 byte n : 1; / 图片下标JetNUM;/* 函数申明区 */void Init(int); / 初始化烟花void Load(); / 加载烟花图片vo
4、id Shoot(); / 发射烟花void Chose(DWORD&); / 筛选烟花void Style(DWORD&); / 发射样式void Show(DWORD*); / 绽放烟花/ 主函数void main() initgraph(1200, 800); srand(time(0); / 播放背景音乐 mciSendString(open ./fire/bk.mp3 alias bk, 0, 0, 0); mciSendString(play bk repeat, 0, 0, 0); /setfillstyle(0); settextstyle(50, 0, 楷体); setcol
5、or(YELLOW); outtextxy(480, 100, My Dear); outtextxy(400, 200, 愿你悲伤有人分担!); outtextxy(400, 280, 愿你孤独有人陪伴!); getchar(); cleardevice(); settextstyle(25, 0, 楷体); outtextxy(400, 250, 曾经); outtextxy(400, 300, 有一份真挚的爱情摆在我的面前); outtextxy(400, 350, 我没有珍惜); outtextxy(400, 400, 直到失去了才后悔莫及); outtextxy(400, 450,
6、世间最痛苦的事情莫过于此); outtextxy(400, 500, 如果上天能给我一个在来一次的机会); outtextxy(400, 550, 我会对那个女孩说); outtextxy(400, 600, 我爱你,一万年); outtextxy(700, 660, 谢新明); getchar(); DWORD t1 = timeGetTime(); / 筛选烟花计时 DWORD st1 = timeGetTime(); / 播放花样计时 DWORD* pMem = GetImageBuffer(); / 获取窗口显存指针 for (int i = 0; i NUM; i+) / 初始化烟花
7、 Init(i); Load(); / 将烟花图片信息加载进相应结构中 BeginBatchDraw(); / 开始批量绘图 while (!kbhit() Sleep(10); / 随机选择 4000 个像素点擦除 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) / 防止越界 pMempy1 * 1200 + px1 = pMempy1 * 1200 + px1 + 1 = BLACK; / 对显存赋
8、值擦出像素点 Chose(t1); / 筛选烟花 Shoot(); / 发射烟花 Show(pMem); / 绽放烟花 Style(st1); / 花样发射 FlushBatchDraw(); / 显示前面的所有绘图操作 / 初始化烟花参数void Init(int i) / 分别为:烟花中心到图片边缘的最远距离、烟花中心到图片左上角的距离 (x、y) 两个分量 int r13 = 120, 120, 155, 123, 130, 147, 138, 138, 130, 135, 140, 132, 155 ; int x13 = 120, 120, 110, 117, 110, 93, 10
9、2, 102, 110, 105, 100, 108, 110 ; int y13 = 120, 120, 85, 118, 120, 103, 105, 110, 110, 120, 120, 104, 85 ; /* 初始化烟花 */ Firei.x = 0; / 烟花中心坐标 Firei.y = 0; Firei.width = 240; / 图片宽 Firei.height = 240; / 图片高 Firei.max_r = ri; / 最大半径 Firei.cen_x = xi; / 中心距左上角距离 Firei.cen_y = yi; Firei.show = false; /
10、是否绽放 Firei.dt = 5; / 绽放时间间隔 Firei.t1 = timeGetTime(); Firei.r = 0; / 从 0 开始绽放 /* 初始化烟花弹 */ Jeti.x = -240; / 烟花弹左上角坐标 Jeti.y = -240; Jeti.hx = -240; / 烟花弹发射最高点坐标 Jeti.hy = -240; Jeti.height = 0; / 发射高度 Jeti.t1 = timeGetTime(); Jeti.dt = rand() % 10; / 发射速度时间间隔 Jeti.n = 0; / 烟花弹闪烁图片下标 Jeti.shoot = fal
11、se; / 是否发射/ 加载图片void Load() /* 储存烟花的像素点颜色 */ IMAGE fm, gm; loadimage(&fm, ./fire/flower.jpg, 3120, 240); 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+) Firei.xyab = getpixel(a, b); /* 加载
12、烟花弹 */ IMAGE sm; loadimage(&sm, ./fire/shoot.jpg, 200, 50); for (int i = 0; i 100) int n = rand() % 20; if (n 13 & Jetn.shoot = false & Firen.show = false) /* 重置烟花弹,预备发射 */ Jetn.x = rand() % 1200; Jetn.y = rand() % 100 + 600; Jetn.hx = Jetn.x; Jetn.hy = rand() % 400; Jetn.height = Jetn.y - Jetn.hy;
13、Jetn.shoot = true; putimage(Jetn.x, Jetn.y, &Jetn.imgJetn.n, SRCINVERT); /* 播放每个烟花弹的声音 */ char c150, c230, c330; sprintf(c1, open ./fire/shoot.mp3 alias s%d, n); sprintf(c2, play s%d, n); sprintf(c3, close n%d, n); mciSendString(c3, 0, 0, 0); mciSendString(c1, 0, 0, 0); mciSendString(c2, 0, 0, 0); t
14、1 = t2; / 扫描烟花弹并发射void Shoot() for (int i = 0; i Jeti.dt & Jeti.shoot = true) /* 烟花弹的上升 */ putimage(Jeti.x, Jeti.y, &Jeti.imgJeti.n, SRCINVERT); if (Jeti.y Jeti.hy) Jeti.n+; Jeti.y -= 5; putimage(Jeti.x, Jeti.y, &Jeti.imgJeti.n, SRCINVERT); /* 上升到高度的 3 / 4,减速 */ if (Jeti.y - Jeti.hy) * 4 Jeti.height
15、) Jeti.dt = rand() % 4 + 10; /* 上升到最大高度 */ if (Jeti.y 20000) / 一首歌的时间 / 心形坐标 int x13 = 60, 75, 91, 100, 95, 75, 60, 45, 25, 15, 25, 41, 60 ; int y13 = 65, 53, 40, 22, 5, 4, 20, 4, 5, 22, 40, 53, 65 ; for (int i = 0; i NUM; i+) /cleardevice(); /* 规律分布烟花弹 */ Jeti.x = xi * 10; Jeti.y = (yi + 75) * 10;
16、Jeti.hx = Jeti.x; Jeti.hy = yi * 10; Jeti.height = Jeti.y - Jeti.hy; Jeti.shoot = true; Jeti.dt = 7; putimage(Jeti.x, Jeti.y, &Jeti.imgJeti.n, SRCINVERT); / 显示烟花弹 /* 设置烟花参数 */ Firei.x = Jeti.x + 10; Firei.y = Jeti.hy; Firei.show = false; Firei.r = 0; /* 播放发射声音 */ char c150, c230, c330; sprintf(c1, o
17、pen ./fire/shoot.mp3 alias s%d, i); sprintf(c2, play s%d, i); sprintf(c3, close n%d, i); mciSendString(c3, 0, 0, 0); mciSendString(c1, 0, 0, 0); mciSendString(c2, 0, 0, 0); st1 = st2; / 绽放烟花void Show(DWORD* pMem) / 烟花个阶段绽放时间间隔,制作变速绽放效果 int drt16 = 5, 5, 5, 5, 5, 6, 25, 25, 25, 25, 55, 55, 55, 55, 55 ; for (int i = 0; i Firei.dt & Firei.show = true) if (Firei.r Firei.max_r)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1