飞道的博客

【520表白】C语言开发《浪漫流星雨》表白程序,源码来了!

200人阅读  评论(0)

今天是520告白节,特意为大家准备了我去年用C语言表白成功的浪漫表白流星雨项目源码,把这个发给你喜欢的女生,你还害怕520找不到对象,要一个人过吗?

话不多说,直接上效果:

开发环境:Visual Studio 2019 + EasyX图形库插件即可

接下来我们看看源码:


  
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<time.h>
  4. #include<conio.h>
  5. #include<graphics.h> //自己安装了才有
  6. #include<mmsystem.h>
  7. #pragma comment(lib,"winmm.lib")//多媒体设备接口库文件
  8. #define PI 3.1415
  9. #define NUM 13 //烟花弹数量
  10. #define WIDTH 960
  11. #define HEIGHT 640
  12. struct Fire
  13. {
  14. int x, y;
  15. int cen_x, cen_y; //中心点坐标
  16. int r; //当前绽放半径
  17. int max_r; //最大绽放半径
  18. int width, height;
  19. DWORD pixel[ 240][ 240]; //图片像素数组
  20. bool isShow; //烟花是否准备好了
  21. bool isDraw; //是否绘制烟花
  22. }fire[NUM];
  23. struct Jet //烟花弹
  24. {
  25. int x, y; //坐标
  26. int hx, hy; //最高点的坐标
  27. bool isLaunch; //烟花弹是否在发射中
  28. IMAGE img[ 2];
  29. byte n : 1; //位段 0 1 0 1 0 1 0 1 0 1
  30. }jet[NUM];
  31. void welcome()
  32. {
  33. mciSendString( L"open ./res/小幸运.mp3", 0, 0, 0);
  34. mciSendString( L"play ./res/小幸运.mp3", 0, 0, 0);
  35. for ( int i = 0; i < 50; i++)
  36. {
  37. //清除屏幕
  38. cleardevice();
  39. int x = 500 + 180 * sin( 2 * PI / 60 * i);
  40. int y = 200 + 180 * cos( 2 * PI / 60 * i);
  41. //设置字体样式
  42. settextstyle(i, 0, L"楷体");
  43. settextcolor(RGB( 0, 202, 0));
  44. setbkmode(TRANSPARENT);
  45. outtextxy(x, y, L"浪漫表白程序");
  46. Sleep( 20);
  47. }
  48. _getch(); //按任意键继续
  49. cleardevice();
  50. settextstyle( 25, 0, L"楷体");
  51. outtextxy( 350, 100, L"亲爱的XXX");
  52. outtextxy( 350, 150, L"自从第一天看见你");
  53. outtextxy( 350, 200, L"我的心就不能自已");
  54. outtextxy( 350, 250, L"不管天上地下都想看见你");
  55. outtextxy( 350, 300, L"...");
  56. outtextxy( 350, 350, L"...");
  57. outtextxy( 450, 400, L"--爱你的XXX");
  58. }
  59. void InitData(int i);
  60. void loadImg()
  61. {
  62. //初始化绽放效果
  63. IMAGE bloomImg,tImg;
  64. loadimage(&bloomImg, L"./res/flower.jpg", 3120, 240);
  65. for ( int i = 0; i < NUM; i++)
  66. {
  67. InitData(i);
  68. SetWorkingImage(&bloomImg);
  69. getimage(&tImg, i * 240, 0, 240, 240);
  70. SetWorkingImage(&tImg);
  71. for ( int a = 0; a < 240; a++)
  72. {
  73. for ( int b = 0; b < 240; b++)
  74. {
  75. fire[i].pixel[a][b] = getpixel(a, b);
  76. }
  77. }
  78. }
  79. //初始化烟花弹
  80. IMAGE jetImg;
  81. loadimage(&jetImg, L"./res/launch.jpg", 200, 50);
  82. SetWorkingImage(&jetImg);
  83. for ( int i = 0; i < NUM; i++)
  84. {
  85. int n = rand() % 5;
  86. getimage(&jet[i].img[ 0], n* 20, 0, 20, 50);
  87. getimage(&jet[i].img[ 1], n* 20 + 100, 0, 20, 50);
  88. jet[i].isLaunch = false;
  89. }
  90. SetWorkingImage();
  91. }
  92. void InitData(int i)
  93. {
  94. fire[i].cen_x = 120;
  95. fire[i].cen_y = 120;
  96. fire[i].max_r = 120;
  97. fire[i].r = 0;
  98. fire[i].width = 240;
  99. fire[i].height = 240;
  100. fire[i].isDraw = false;
  101. fire[i].isShow = false;
  102. }
  103. //产生烟花弹
  104. void createJet()
  105. {
  106. int i = rand() % NUM; //[0~13)
  107. if (jet[i].isLaunch == false)
  108. {
  109. jet[i].x = rand() % (WIDTH -20);
  110. jet[i].y = rand() % 100 + HEIGHT;
  111. jet[i].hx = jet[i].x;
  112. jet[i].hy = rand() % (HEIGHT / 3 * 2);
  113. jet[i].isLaunch = true;
  114. }
  115. }
  116. //发射烟花弹
  117. void launch()
  118. {
  119. for ( int i = 0; i < NUM; i++)
  120. {
  121. if (jet[i].isLaunch)
  122. {
  123. putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n],SRCINVERT);
  124. //判断是否达到最高点了
  125. if (jet[i].y > jet[i].hy)
  126. {
  127. jet[i].y -= 5;
  128. jet[i].n++;
  129. }
  130. putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);
  131. if (jet[i].y <= jet[i].hy)
  132. {
  133. jet[i].isLaunch = false;
  134. //可以开始放烟花了
  135. fire[i].x = jet[i].x;
  136. fire[i].y = jet[i].y;
  137. fire[i].isShow = true;
  138. }
  139. }
  140. }
  141. }
  142. void bloom(DWORD *pMem)
  143. {
  144. for ( int i = 0; i < NUM; i++)
  145. {
  146. if (fire[i].isShow)
  147. {
  148. if (fire[i].r < fire[i].max_r)
  149. {
  150. fire[i].r++;
  151. fire[i].isDraw = true; //可以开始绘制烟花了
  152. }
  153. if (fire[i].r >= fire[i].max_r)
  154. {
  155. InitData(i);
  156. }
  157. }
  158. if (fire[i].isDraw)
  159. {
  160. //求当前半径下,圆上的每个点对于的弧度
  161. for ( double a = 0; a <= 2 * PI; a += 0.01)
  162. {
  163. int img_x = fire[i].cen_x + fire[i].r * cos(a); //求出圆上的每个点的坐标
  164. int img_y = fire[i].cen_y + fire[i].r * sin(a);
  165. if (img_x > 0 && img_x < fire[i].width && img_y> 0 && img_y < fire[i].height)
  166. {
  167. //针对现在的绽放点,对应的屏幕坐标
  168. int win_x= fire[i].x + fire[i].r * cos(a);
  169. int win_y = fire[i].y + fire[i].r * sin(a);
  170. if (win_x > 0 && win_x < WIDTH && win_y> 0 && win_y < WIDTH)
  171. {
  172. pMem[win_y * WIDTH + win_x] = BGR(fire[i].pixel[img_x][img_y]);
  173. }
  174. }
  175. }
  176. }
  177. }
  178. }
  179. int main()
  180. {
  181. //创建窗口
  182. initgraph( 960, 640);
  183. //设置随机数种子
  184. srand(( unsigned)time( NULL)+clock());
  185. welcome();
  186. loadImg();
  187. DWORD* pMem = GetImageBuffer(); //获取窗口的内存指针
  188. while ( 1)
  189. {
  190. for ( int i = 0; i < WIDTH; i++)
  191. {
  192. for ( int k = 0; k < 4; k++)
  193. {
  194. int x = rand() % WIDTH;
  195. int y = rand() % HEIGHT;
  196. if (y < HEIGHT)
  197. {
  198. pMem[y * WIDTH + x] = BLACK;
  199. }
  200. }
  201. }
  202. createJet();
  203. launch();
  204. bloom(pMem);
  205. Sleep( 10);
  206. }
  207. closegraph();
  208. return 0;
  209. }

以上就是我们表白程序的源码了!最后祝大家都能和喜欢的人在一起哦~

对于学习编程的小伙伴或者在工作想升职的程序员,如果你想更好的提升你的编程能力帮助你提升水平!笔者这里或许可以帮到你~

C语言C++编程学习交流圈子,QQ群:765803539点击进入】微信公众号:C语言编程学习基地

分享(源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习视频分享:

 


转载:https://blog.csdn.net/qq_42366672/article/details/117077450
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场