【应用C】一本正经分析有趣的C语言代码《流浪地球Spring12春节十二响》


代码千万条,注释第一条

  春节十二响这个梗出自《流浪地球》电影中一个名为李一一(不是横线,是一二三的一,还是两个)的程序员在最后修改发动机喷射形式的时候提到的内容,因为背景及现场气氛的共同作用,这个内容成为这部电影令人印象深刻的情节之一
  在电影播出后不久,由于电影中李一一程序员的身份,进而激起了现实众多程序员博主纷纷出动模拟春节十二响代码,其中一位博主在GitHub中开源了C语言伪代码,不能编译运行,但是目前得到了 180+star(在GitHub中获得别人的star是非常困难的),下面一起分析这个 spring12
Alt

01 - Spring12下载

  点击spring12-GitHub源码进入页面,点击clone or download就可以下载zip压缩包,解压后得到文件
Alt
  因为是伪代码,所以只有一个.c程序,这个程序的名字很搞笑,还引来众多程序员一本正经地讨论,具体可以看issues

02 - Spring12分析

  在查看spring12的时候,很多人都想去编译运行,但是发现编译器报出一堆错误,因为这个spring12只是伪代码,打开spring12 ,代码量非常少

#env "planet_engine"

int init() {
    set_engine_number_mask(ENGINE_ALL);
    set_funeral_level(FUNERAL_FULL);
    // 允许误差10秒以内
    if (unix_time() < make_unix_time(2082, 1, 28, 23, 59, 60-10)) return ERR_ENGIN_ENV;
    return engine_check_init(); // after compile and before real run
}
int main() {
    set_curve(CURVE_NATURAL); // 自然曲线耗费燃料最少
    for (int i :range(0, 12, 1)) {
        engine_start();
        wait_engine(ENGINE_STATE_CHAGNE);
        sleep(2000);
        engin_stop();
        wait_engine(ENGINE_STATE_CHAGNE);
        sleep(4000); // 这个时长在模拟器里听起来更像心跳
    }
    return 0;
}
int final() {
    engine_ensure_shutdown();
}

  这位博主在必要的地方写了注释,整段代码看下来,更像是看了一篇短文一样:声明环境、初始化发动机、开启发动机12响、关闭发动机,有趣的是,代码中还混了Python的语法

2.1 - 声明环境

#env "planet_engine"

  从这一句就可以看出这段代码是伪代码,这里声明程序运行环境位于"行星发动机"内,于是程序中所有的API都应该来自行星发动机SDK,所以如果你想编译运行,就请先找到SDK(做梦吧)

2.2 - 初始化发动机

int init() {
    set_engine_number_mask(ENGINE_ALL);
    set_funeral_level(FUNERAL_FULL);
    // 允许误差10秒以内
    if (unix_time() < make_unix_time(2082, 1, 28, 23, 59, 60-10)) return ERR_ENGIN_ENV;
    return engine_check_init(); // after compile and before real run
}

  程序并不是严格按照C语言风格从main()开始,而是按照Python从init()开始,因为main()中没有显式调用init(),所以接下来运行init(),进行的步骤有:

  • 设置发动机掩码,准备开启所有发动机
  • 设置危险级别,所有发送机危险级别置为最高
  • 检查当前时间,发动机将在2082年1月28日23小时59分钟第50~60秒内开启,当前时间的误差必须在此范围内
  • 检查发动机状态,即将开启发动机

2.3 - 启动发动机12响

int main() {
    set_curve(CURVE_NATURAL); // 自然曲线耗费燃料最少
    for (int i :range(0, 12, 1)) {
        engine_start();
        wait_engine(ENGINE_STATE_CHAGNE);
        sleep(2000);
        engin_stop();
        wait_engine(ENGINE_STATE_CHAGNE);
        sleep(4000); // 这个时长在模拟器里听起来更像心跳
    }
    return 0;
}

  到C语言的main()函数了,先是设置燃料耗费曲线为自然曲线(这是外国一个超高效冷冻站控制系统设备的功耗曲线,确保效率最大的情况下功耗最低),接下来进行类似单片机LED灯的打开、延迟、关闭、延迟的闪烁操作,连续闪烁12次,就是模拟春节十二响了,只是代码中的开启停止还需要等待一段时间,延迟的时间分别是2s和4s,打开发动机2s,再停止发动机4s,一快一慢,就类似于心跳的频率

2.4 - 关闭发动机

int final() {
    engine_ensure_shutdown();
}

  最后在行星环境SDK中调用API关闭所有发动机,春节十二响模拟完成

03 - 总结

开始
init
1-设置发动机掩码
2-设置危险级别
3-检查当前时间
4-检查发动机状态
main
1-设置功耗曲线
2-发动机闪烁12次
final
关闭发动机
结束
  • 可以看得出,这位博主的知识领域应该涉及到C、Python、Unix && Linux以及数学领域
  • 虽然是简单的伪代码,但是提出了一个简易的框架,后面将会有扩展

04 - Spring12扩展

  伪代码始终不能满足程序员的好奇心,于是基于此框架,在CSDN上的一位博主用C语言+windows库实现了春节十二响的CMD演示,【流浪地球】春节十二响程序开源代码,CMD效果如下,简直是1分钱特效…
在这里插入图片描述
  这位博主的源码很简单,一堆的printf()以及格式控制,调用图形库变颜色闪烁,一股非主流风扑鼻而来,有兴趣的伙伴可以读这位博主的源码,虽然写得一般,但是有个1分钱效果还算可以了

05 - 如何用Scratch动画显示Spring12

  CDM没有动画显示,想要简单的动画显示,可以用Scratch,小白将使用Scratch实现spring12的动画效果,期待后续

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值