C语言实战之浪漫烟花表白程序代码
更新时间:2021年4月24日 20:01 点击:1864
创建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。
今天直播到此结束!!!三黑之毅!
相关文章
- 这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
- 本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
- 这篇文章主要介绍了Python绘制的爱心树与表白代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-06
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- 这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
详解C语言中的rename()函数和remove()函数的使用方法
这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25- 这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
- 本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
- 这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
- 今天小编就为大家分享一篇C语言实现从文件读入一个3*3数组,并计算每行的平均值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
- 这篇文章主要介绍了使用C语言操作文件的基本函数整理,包括创建和打开以及关闭文件的操作方法,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C语言中memcpy 函数的用法详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C语言中查找字符在字符串中出现的位置的方法,分别是strchr()函数和strrchr()函数的使用,需要的朋友可以参考下...2020-04-25
- 很多同学在学习c语言的时候是不是会碰到a++和++a都有甚么作用啊。今天我们就来探讨下...2020-04-25
- 下面小编就为大家带来一篇C语言实现时间戳转日期的算法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
- 这篇文章主要对C语言中const关键字的用法进行了详细的分析介绍,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C语言之整数划分问题(递归法)实例代码的相关资料,需要的朋友可以参考下...2020-04-25
- 本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。...2020-04-25