This paste brought to you by Code666 (代码贴、代码片段). View Raw

  1.  
  2. #include<graphics.h>
  3. #include<conio.h>
  4. #include<time.h>
  5. #include<math.h>
  6. #include<sys/timeb.h>
  7.  
  8. struct MyLove
  9. {
  10.     int NUMS;  //  编号
  11.     double m;
  12.     double n;
  13.     double size;
  14.     bool Is_show;
  15.     int x;
  16.     int y;
  17. };
  18.  
  19. MyLove mylove[400];
  20. int CenterX = 320;
  21. int CenterY = 180;
  22. double Size = 60;
  23. void initdata();  // 初始化数据
  24. void updata();    // 更新
  25. void movedata();  // 平移
  26. void showdata();  // 显示
  27. int* GetRand(int* buf, int count, int range);  // 随机数的生成
  28. void heart(int x0, int y0, int size, COLORREF C);
  29. void HpSleep(int ms);
  30.  
  31. int main()
  32. {
  33.     initgraph(640, 480);
  34.     initdata();
  35.     BeginBatchDraw();
  36.     while (true)
  37.     {
  38.         updata();
  39.         showdata();
  40.         HpSleep(30);    // 改为精确延时
  41.         FlushBatchDraw();
  42.         cleardevice();
  43.     }
  44.     EndBatchDraw();
  45.     _getch();
  46.     return 0;
  47. }
  48.  
  49. void updata()
  50. {
  51.     int* buf = (int*)malloc(sizeof(int) * 20);
  52.     buf = GetRand(buf, 20, (int)(2 * Size / 0.01));
  53.     movedata();
  54.     for (int i = 0; i < 20; i++)
  55.     {
  56.         mylove[i].m = buf[i] * 0.01;
  57.         mylove[i].n = (((sin(buf[(int)i] * 0.01) * sqrt(fabs(cos(buf[(int)i] * 0.01)))) / (sin(buf[(int)i] * 0.01) + 1.4142)) - 2 * sin(buf[(int)i] * 0.01) + 2);
  58.         mylove[i].size = Size;
  59.         mylove[i].NUMS = i / 20;
  60.         mylove[i].Is_show = true;
  61.         mylove[i].x = (int)(-Size * mylove[i].n * cos(mylove[i].m) + CenterX);
  62.         mylove[i].y = (int)(-Size * mylove[i].n * sin(mylove[i].m) + CenterY - mylove[i].size);
  63.     }
  64.     for (int i = 20; i < 400; i++)
  65.     {
  66.         mylove[i].size = mylove[i].size + 1;
  67.         if (mylove[i].size > 80)
  68.         {
  69.             mylove[i].size = 80;
  70.         }
  71.         mylove[i].NUMS = i / 20;
  72.         mylove[i].x = (int)(-mylove[i].size * mylove[i].n * cos(mylove[i].m) + CenterX);
  73.         mylove[i].y = (int)(-mylove[i].size * mylove[i].n * sin(mylove[i].m) + CenterY - mylove[i].size);
  74.     }
  75. }
  76.  
  77. void movedata()
  78. {
  79.     for (int i = 399; i > 19; i--)
  80.     {
  81.         mylove[i] = mylove[i - 20];
  82.     }
  83. }
  84.  
  85. void showdata()
  86. {
  87.     settextcolor(RED);
  88.     wchar_t c = 0x59;    // 0x28 是电话机在 Wingdings 字体中的对应编码
  89.     for (int i = 0; i < 400; i++)
  90.     {
  91.         settextstyle(mylove[i].NUMS + 10, 0, "Webdings");
  92.         setbkmode(TRANSPARENT);
  93.         outtextxy(mylove[i].x + 20, mylove[i].y + 20, c);
  94.     }
  95. }
  96.  
  97. int* GetRand(int* buf, int count, int range)
  98. {
  99.     struct timeb timeSeed;
  100.     ftime(&timeSeed);
  101.     srand(timeSeed.time * 1000 + timeSeed.millitm);  // milli time
  102.     for (int i = 0; i < count; i++)
  103.     {
  104.         int randTmp = rand() % range;
  105.         for (int j = 0; j < i; j++)
  106.         {
  107.             if (buf[j] == randTmp)
  108.             {
  109.                 break;//检查重复。
  110.             }
  111.         }
  112.         buf[i] = randTmp;
  113.     }
  114.     return buf;
  115. }
  116.  
  117. void initdata()
  118. {
  119.     for (int i = 0; i < 400; i++)
  120.     {
  121.         mylove[i].NUMS = 0;
  122.         mylove[i].m = 0;
  123.         mylove[i].n = 0;
  124.         mylove[i].size = 0;
  125.         mylove[i].Is_show = false;
  126.         mylove[i].x = 0;
  127.         mylove[i].y = 0;
  128.     }
  129. }
  130.  
  131. // 精确延时函数(可以精确到 1ms,精度 ±1ms)
  132. // by yangw80<yw80@qq.com>, 2011-5-4
  133. void HpSleep(int ms)
  134. {
  135.     static clock_t oldclock = clock();    // 静态变量,记录上一次 tick
  136.     oldclock += ms * CLOCKS_PER_SEC / 1000;  // 更新 tick
  137.     if (clock() > oldclock)          // 如果已经超时,无需延时
  138.         oldclock = clock();
  139.     else
  140.         while (clock() < oldclock)      // 延时
  141.             Sleep(1);            // 释放 CPU 控制权,降低 CPU 占用率,精度 10~16ms
  142.           //      Sleep(0);            // 更高精度、更高 CPU 占用率,精度 1ms
  143. }
  144.  END