大家好,欢迎来到 的编程教室 !
前几天,后台老有小伙伴留言“爱心代码”。这不是很早之前发过的内容嘛,怎么最近突然又被人翻出来了?后来才知道,原来是一部有关程序员的青春偶像剧《点燃我,温暖你》在热播,而剧中有一段关于期中考试要用程序画一个爱心的桥段。
于是出于好奇,就去看了这一集(第5集,不用谢)。这一看不要紧,差点把刚吃的鸡腿给喷出来--槽点实在太多了!
忍不住做了个欢乐吐槽向的代码解读视频,在某平台上被顶到了20个w的浏览,也算蹭了一波人家电视剧的热度吧……
看剧学编程:你用程序画爱心是认真的吗?
下面是图文版,给大家分析下剧中出现的“爱心”代码,并且来复刻一下最后男主完成的酷炫跳动爱心。
剧中代码赏析
1. 首先是路人同学的代码:
虽然剧中说是“C语言期中考试”,但这位同学的代码名叫 draw2.py,一个典型的 Python 文件,再结合截图中的 pen.、pen.setpos 等方法来看,应该是用 turtle 海龟作图库来画爱心。那效果通常是这样的:
import turtle as t
t.color('red')
t.setheading(50)
t.begin_fill()
t.circle(-100, 170)
t.circle(-300, 40)
t.right(38)
t.circle(-300, 40)
t.circle(-100, 170)
t.end_fill()
而不是剧中那个命令行下用1组成的不规则的图形。
2. 然后是课代表向路人同学展示的优秀代码:
及所谓的效果:
这确实是C语言代码了,但文件依然是以 .py 为后缀,并且 前面没有加上#,这显然是没法运行的。
里面的内容是可以画出爱心的,用是这个爱心曲线公式:
然后遍历一个1517的方阵,计算每个坐标是在曲线内还是曲线外,在内部就输出#或,外部就是-
用python改写一下是这样的:
for y in range(9, -6, -1):
for x in range(-8, 9):
print('*##*'[(x+10)%4] if (x*x+y*y-25)**3 < 25*x*x*y*y*y else '-', end=' ')
效果:
稍微改一下输出,还能做出前面那个全是1的效果:
for y in range(9, -6, -1):
for x in range(-8, 9):
print('1' if (x*x+y*y-25)**3 < 25*x*x*y*y*y else ' ', end=' ')
但跟剧中所谓的效果相去甚远。
3. 最后是主角狂拽酷炫D炸天的跳动爱心:
代码有两个片段:
但这两个片段也不C语言,而是C++,且两段并不是同一个程序,用的方法也完全不一样。
第一段代码跟前面一种思路差不多,只不过没有直接用一条曲线,而是上半部用两个圆形,下半部用两条直线,围出一个爱心。
改写成 Python 代码:
size = 10
for x in range(size):
for y in range(4*size+1):
dist1 = ((x-size)**2 + (y-size)**2) ** 0.5
dist2 = ((x-size)**2 + (y-3*size)**2) ** 0.5
if dist1 < size + 0.5 or dist2 < size + 0.5:
print('V', end=' ')
else:
print(' ', end=' ')
print()
for x in range(1, 2*size):
for y in range(x):
print(' ', end=' ')
for y in range(4*size+1-2*x):
print('V', end=' ')
运行效果:
第二段代码用的是基于极坐标的爱心曲线,是遍历角度来计算点的位置。公式是:
计算出不同角度对应的点坐标,然后把它们连起来,就是一个爱心。
from math import pi, sin, cos
import matplotlib.pyplot as plt
no_pieces = 100
dt = 2*pi/no_pieces
t = 0
vx = []
vy = []
while t
[1]: https://xuan.ddwoo.top/index.php/archives/424/
本文共 694 个字数,平均阅读时长 ≈ 2分钟