IE盒子

帖子
查看: 154|回复: 15

阿瑟的C语言爱心代码(终于不是html的啦)

[复制链接]

4

主题

6

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2022-12-21 18:49:24 | 显示全部楼层 |阅读模式
1.前言

最近一部电视剧《点燃我,温暖你》可火啦,大家纷纷在搞男主阿瑟的同款爱心代码,但是虽然网上有它的源码,但都不是 C 语言的,看不懂。我看了一下这个视频,大致分析了一下它的运行过程。用语言描述一下,就是好多爱心,然后从内到外,从小到大的显示。
2.实现

对于这个程序的编写,我的思路是这样的。就如同将一头大象放到冰箱里。就是打开冰箱,放入大象,关上冰箱。编写程序也是如此。
首先就是计算坐标,更新坐标,绘制爱心,这样三步。重复调用,就可以实现。里面的具体细节,可以查看代码。
3.效果展示



4.编译环境:VS2019+easyx图形库插件
5.代码展示:
#include<graphics.h>
#include<conio.h>
#include<time.h>
#include<math.h>
#include<sys/timeb.h>

struct MyLove
{
    int NUMS;  //  编号
    double m;
    double n;
    double size;
    bool Is_show;
    int x;
    int y;
};

MyLove mylove[400];
int CenterX = 320;
int CenterY = 180;
double Size = 60;
void initdata();  // 初始化数据
void updata();    // 更新
void movedata();  // 平移
void showdata();  // 显示
int* GetRand(int* buf, int count, int range);  // 随机数的生成
void heart(int x0, int y0, int size, COLORREF C);
void HpSleep(int ms);

int main()
{
    initgraph(640, 480);
    initdata();
    BeginBatchDraw();
    while (true)
    {
        updata();
        showdata();
        HpSleep(30);    // 改为精确延时
        FlushBatchDraw();
        cleardevice();
    }
    EndBatchDraw();
    _getch();
    return 0;
}

void updata()
{
    int* buf = (int*)malloc(sizeof(int) * 20);
    buf = GetRand(buf, 20, (int)(2 * Size / 0.01));
    movedata();
    for (int i = 0; i < 20; i++)
    {
        mylove.m = buf * 0.01;
        mylove.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);
        mylove.size = Size;
        mylove.NUMS = i / 20;
        mylove.Is_show = true;
        mylove.x = (int)(-Size * mylove.n * cos(mylove.m) + CenterX);
        mylove.y = (int)(-Size * mylove.n * sin(mylove.m) + CenterY - mylove.size);
    }
    for (int i = 20; i < 400; i++)
    {
        mylove.size = mylove.size + 1;
        if (mylove.size > 80)
        {
            mylove.size = 80;
        }
        mylove.NUMS = i / 20;
        mylove.x = (int)(-mylove.size * mylove.n * cos(mylove.m) + CenterX);
        mylove.y = (int)(-mylove.size * mylove.n * sin(mylove.m) + CenterY - mylove.size);
    }
}

void movedata()
{
    for (int i = 399; i > 19; i--)
    {
        mylove = mylove[i - 20];
    }
}

void showdata()
{
    settextcolor(RED);
    wchar_t c = 0x59;    // 0x28 是电话机在 Wingdings 字体中的对应编码
    for (int i = 0; i < 400; i++)
    {
        settextstyle(mylove.NUMS + 10, 0, "Webdings");
        setbkmode(TRANSPARENT);
        outtextxy(mylove.x + 20, mylove.y + 20, c);
    }
}

int* GetRand(int* buf, int count, int range)
{
    struct timeb timeSeed;
    ftime(&timeSeed);
    srand(timeSeed.time * 1000 + timeSeed.millitm);  // milli time
    for (int i = 0; i < count; i++)
    {
        int randTmp = rand() % range;
        for (int j = 0; j < i; j++)
        {
            if (buf[j] == randTmp)
            {
                break;//检查重复。
            }
        }
        buf = randTmp;
    }
    return buf;
}

void initdata()
{
    for (int i = 0; i < 400; i++)
    {
        mylove.NUMS = 0;
        mylove.m = 0;
        mylove.n = 0;
        mylove.size = 0;
        mylove.Is_show = false;
        mylove.x = 0;
        mylove.y = 0;
    }
}

// 精确延时函数(可以精确到 1ms,精度 ±1ms)
// by yangw80<yw80@qq.com>, 2011-5-4
void HpSleep(int ms)
{
    static clock_t oldclock = clock();    // 静态变量,记录上一次 tick
    oldclock += ms * CLOCKS_PER_SEC / 1000;  // 更新 tick
    if (clock() > oldclock)          // 如果已经超时,无需延时
        oldclock = clock();
    else
        while (clock() < oldclock)      // 延时
            Sleep(1);            // 释放 CPU 控制权,降低 CPU 占用率,精度 10~16ms
          //      Sleep(0);            // 更高精度、更高 CPU 占用率,精度 1ms
}
END
<hr/>今天的分享到此结束了,如果在编程学习的路上遇到问题,不妨来我的编程学习交流基地一起来学习探讨,
自学编程不迷路~
回复

举报

2

主题

9

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2022-12-21 18:49:40 | 显示全部楼层
报错了啊
回复

举报

3

主题

6

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2022-12-21 18:50:21 | 显示全部楼层
报错的 不是正确的
回复

举报

3

主题

8

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2022-12-21 18:50:40 | 显示全部楼层
下easyx图形库了没
回复

举报

2

主题

8

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2022-12-21 18:51:09 | 显示全部楼层
怎么下载
回复

举报

3

主题

8

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-12-21 18:51:59 | 显示全部楼层
没有找到heart定义
回复

举报

1

主题

3

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2022-12-21 18:52:17 | 显示全部楼层
您好现在就一个问题了,settextstyle 没有与参数列表匹配的重载函数settlextstyle怎么解决[可怜]
回复

举报

2

主题

5

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2022-12-21 18:52:41 | 显示全部楼层
这个怎么下 ?
回复

举报

0

主题

5

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-12-21 18:52:52 | 显示全部楼层
直接给他删了可以过
回复

举报

1

主题

7

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2022-12-21 18:53:32 | 显示全部楼层
设置多字节字符集就好了,到属性那里改
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表