文章目录
春节十二响这个梗出自《流浪地球》电影中一个名为李一一(不是横线,是一二三的一,还是两个)的程序员在最后修改发动机喷射形式的时候提到的内容,因为背景及现场气氛的共同作用,这个内容成为这部电影令人印象深刻的情节之一
在电影播出后不久,由于电影中李一一程序员的身份,进而激起了现实众多程序员博主纷纷出动模拟春节十二响代码,其中一位博主在GitHub
中开源了C语言伪代码,不能编译运行,但是目前得到了 180+ 个star
(在GitHub中获得别人的star是非常困难的),下面一起分析这个 spring12
01 - Spring12下载
点击spring12-GitHub源码进入页面,点击clone or download就可以下载zip压缩包,解压后得到文件
因为是伪代码,所以只有一个.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 - 总结
- 可以看得出,这位博主的知识领域应该涉及到C、Python、Unix && Linux以及数学领域
- 虽然是简单的伪代码,但是提出了一个简易的框架,后面将会有扩展
04 - Spring12扩展
伪代码始终不能满足程序员的好奇心,于是基于此框架,在CSDN上的一位博主用C语言+windows库实现了春节十二响的CMD演示,【流浪地球】春节十二响程序开源代码,CMD效果如下,简直是1分钱特效…
这位博主的源码很简单,一堆的printf()
以及格式控制,调用图形库变颜色闪烁,一股非主流风扑鼻而来,有兴趣的伙伴可以读这位博主的源码,虽然写得一般,但是有个1分钱效果还算可以了
05 - 如何用Scratch动画显示Spring12
CDM没有动画显示,想要简单的动画显示,可以用Scratch,小白将使用Scratch实现spring12的动画效果,期待后续