电视剧里的代码真能运行吗?

news2024/10/6 16:27:24

大家好,欢迎来到 Crossin的编程教室 !

前几天,后台老有小伙伴留言“爱心代码”。这不是Crossin很早之前发过的内容嘛,怎么最近突然又被人翻出来了?后来才知道,原来是一部有关程序员的青春偶像剧《点燃我,温暖你》在热播,而剧中有一段关于期中考试要用程序画一个爱心的桥段。

于是出于好奇,Crossin就去看了这一集(第5集,不用谢)。这一看不要紧,差点把刚吃的鸡腿给喷出来--槽点实在太多了!

忍不住做了个欢乐吐槽向的代码解读视频,在某平台上被顶到了20个w的浏览,也算蹭了一波人家电视剧的热度吧……

看剧学编程:你用程序画爱心是认真的吗?

下面是图文版,给大家分析下剧中出现的“爱心”代码,并且来复刻一下最后男主完成的酷炫跳动爱心。

剧中代码赏析

1. 首先是路人同学的代码:

虽然剧中说是“C语言期中考试”,但这位同学的代码名叫 draw2.py,一个典型的 Python 文件,再结合截图中的 pen.forward、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()
t.done()

而不是剧中那个命令行下用1组成的不规则的图形。

2. 然后是课代表向路人同学展示的优秀代码:

及所谓的效果:

这确实是C语言代码了,但文件依然是以 .py 为后缀,并且 include 前面没有加上 #,这显然是没法运行的。

里面的内容是可以画出爱心的,用是这个爱心曲线公式:

然后遍历一个15*17的方阵,计算每个坐标是在曲线内还是曲线外,在内部就输出#或*,外部就是-

用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=' ')
    print()

​​​​​​效果:

稍微改一下输出,还能做出前面那个全是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=' ')
    print()

但跟剧中所谓的效果相去甚远。

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=' ')
    print()

运行效果:

第二段代码用的是基于极坐标的爱心曲线,是遍历角度来计算点的位置。公式是:

计算出不同角度对应的点坐标,然后把它们连起来,就是一个爱心。

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 <= 2*pi:
    vx.append(16*sin(t)**3)
    vy.append(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t))
    t += dt
plt.plot(vx, vy)
plt.show()

效果:

代码中循环时用到的2π是为了保证曲线长度足够绕一个圈,但其实长一点也无所谓,即使 π=100 也不影响显示效果,只是相当于同一条曲线画了很多遍。所以剧中代码里写下35位小数的π,还被女主用纸笔一字不落地抄写下来,实在是让程序员无法理解的迷惑行为。

但不管写再多位的π,上述两段代码都和最终那个跳动的效果差了五百只羊了个羊。

跳动爱心实现

作为一个总是在写一些没什么乱用的代码的编程博主,Crossin当然也不会放过这个机会,下面就来挑战一下用 Python 实现最终的那个效果。

1. 想要绘制动态的效果,必定要借助一些库的帮助,不然代码量肯定会让你感动得想哭。这里我们将使用之前 羊了个羊游戏 里用过的 pgzero 库。然后结合最后那个极坐标爱心曲线代码,先绘制出曲线上离散的点。

import pgzrun
from math import pi, sin, cos

no_p = 100
dt = 2*3/no_p
t = 0
x = []
y = []
while t <= 2*3:
    x.append(16*sin(t)**3)
    y.append(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t))
    t += dt

def draw():
    screen.clear()
    for i in range(len(x)):
        screen.draw.filled_rect(Rect((x[i]*10+400, -y[i]*10+300), (4, 4)), 'pink')

pgzrun.go()

2. 把点的数量增加,同时沿着原点到每个点的径向加一个随机数,并且这个随机数是按照正态分布来的(半个正态分布),大概率分布在曲线上,向曲线内部递减。这样,就得到这样一个随机分布的爱心效果。

...
no_p = 20000
...
while t <= 2*pi:
    l = 10 - abs(random.gauss(10, 2) - 10)
    x.append(l*16*sin(t)**3)
    y.append(l*(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)))
    t += dt
...

3. 下面就是让点动起来,这步是关键,也有一点点复杂。为了方便对于每个点进行控制,这里将每个点自定义成了一个Particle类的实例。

从原理上来说,就是给每个点加一个缩放系数,这个系数是根据时间变化的正弦函数,看起来就会像呼吸的节律一样。

class Particle():
    def __init__(self, pos, size, f):
        self.pos = pos
        self.pos0 = pos
        self.size = size
        self.f = f

    def draw(self):
        screen.draw.filled_rect(Rect((10*self.f*self.pos[0] + 400, -10*self.f*self.pos[1] + 300), self.size), 'hot pink')

    def update(self, t):
        df = 1 + (2 - 1.5) * sin(t * 3) / 8
        self.pos = self.pos0[0] * df, self.pos0[1] * df

...

t = 0
def draw():
    screen.clear()
    for p in particles:
        p.draw()

def update(dt):
    global t
    t += dt
    for p in particles:
        p.update(t)

4. 剧中爱心跳动时,靠中间的点波动的幅度更大,有一种扩张的效果。所以再根据每个点距离原点的远近,再加上一个系数,离得越近,系数越大。

class Particle():
    ...
    def update(self, t):
        df = 1 + (2 - 1.5 * self.f) * sin(t * 3) / 8
        self.pos = self.pos0[0] * df, self.pos0[1] * df

5. 最后再用同样的方法画一个更大一点的爱心,这个爱心不需要跳动,只要每一帧随机绘制就可以了。

def draw():
    ...
    t = 0
    while t < 2*pi:
        f = random.gauss(1.1, 0.1)
        x = 16*sin(t)**3
        y = 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)
        size = (random.uniform(0.5,2.5), random.uniform(0.5,2.5))
        screen.draw.filled_rect(Rect((10*f*x + 400, -10*f*y + 300), size), 'hot pink')
        t += dt * 3

合在一起,搞定!

总结一下,就是在原本的基础爱心曲线上加上一个正态分布的随机量、一个随时间变化的正弦函数和一个跟距离成反比的系数,外面再套一层更大的随机爱心,就得到类似剧中的跳动爱心效果。

但话说回来,真有人会在考场上这么干吗?

除非真的是超级大学霸,不然就是食堂伙食太好--

吃太饱撑的……

代码已开源:python666.cn/c/9

如二创发布请注明代码来源:Crossin的编程教室

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

022_SSS_Novel View Synthesis with Diffusion Models

Novel View Synthesis with Diffusion Models 1. Introduction 本文利用diffusion模型&#xff0c;在给定参考图的条件下&#xff0c;生成指定pose的图像&#xff0c;作者称为3DiM。并且可以在给定一张特定视角的图的条件下&#xff0c;生成其他所有视角的图。 本文的主要贡…

Treap 原理详解和实战

一 点睛 Treap 指 Tree heap&#xff0c;又叫作树堆&#xff0c;同时满足二叉搜索树和堆两种性质。二叉搜索树满足中序有序性&#xff0c;输入序列不同&#xff0c;创建的二叉搜索树也不同&#xff0c;在最坏的情况下&#xff08;只有左子树或只有右子树&#xff09;会退化为…

CMCT-FA修饰阿霉素纳米脂质体/ADR-HAS-MS单抗Hab18偶联阿霉素人血清白蛋白微球的制备方法

瑞禧生物这里整理的内容是CMCT-FA修饰阿霉素纳米脂质体/ADR-HAS-MS单抗Hab18偶联阿霉素人血清白蛋白微球的相关制备方法&#xff0c;来学习&#xff01; MCT-FA修饰阿霉素纳米脂质体的研究&#xff1a; 利用1-乙基-3-(3-二甲基丙基)-碳二亚胺(EDC)介导 反应合成了叶酸偶联的羧甲…

LeetCode刷题---160. 相交链表(双指针-对撞指针)

文章目录一、编程题&#xff1a;160. 相交链表&#xff08;双指针-对撞指针&#xff09;1.题目描述2.示例1&#xff1a;3.示例2&#xff1a;4.示例3&#xff1a;5.提示&#xff1a;6.提示&#xff1a;二、解题思路1.思路2.复杂度分析&#xff1a;3.算法图解三、代码实现总结一、…

CSS——图标字体

为什么需要图标字体&#xff1f; 在网页中经常会有需要使用一些图标的地方&#xff0c;比如&#x1f6d2; &#xff0c; &#x1f464;&#xff0c;⏫等等&#xff0c;虽然我们可以通过图片来引入图标&#xff0c;但是图片本身比较大&#xff0c;页面刷新加载图片耗时不说&…

[附源码]java毕业设计小区疫情防控系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

知乎乱码、b站首页乱码、蓝奏云网盘打不开都是DNS惹的祸!修改设备的DNS

知乎乱码、b站首页乱码、蓝奏云网盘打不开等问题&#xff0c;常常是连接WiFi的时候会出现&#xff0c;一旦将手机切换为蜂窝、或者给电脑用蜂窝热点这个问题就能解决&#xff1a; 接下来教一下大家如何修改自己设备的DNS,从而 修复知乎乱码、b站首页乱码、蓝奏云网盘打不开 0.…

八环氧环己基乙基笼状聚倍半硅氧|八苯胺丙基poss

八环氧环己基乙基笼状聚倍半硅氧 外观&#xff1a;透明&#xff0c;淡黄色半固体状物 黏度&#xff1a;50000cps&#xff08;60℃&#xff09; 密度&#xff1a;1.25g/ml 分子量&#xff1a;1418 环氧当量&#xff1a;177 折射率&#xff1a;1.52 溶解性&#xff1a;溶于…

所见即所得的3D打印建模设计

3D打印机安装好后&#xff0c;需要的软件环境&#xff1a; 1. Cura 这类切片软件&#xff1b; 用于将STL等模型文件转换成3D打印的执行指令集&#xff0c;其实就是G-CODE的组合&#xff0c;有些还支持在线调试。 Simplify3D https://download.csdn.net/download/pocean2012…

深度剖析数据在内存中的存储

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C/C】 目录1.数据类型详细介绍1.1数据类型介绍1.2类型的基本归类2.整型在内存中的存储3.大小端字节序介绍及判断什么是大端小端&#x…

[附源码]Python计算机毕业设计茶叶产品质量安全可追溯系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

尚医通 (二十八) --------- 医院管理相关 (引入注册中心、远程调用)

目录一、医院管理医院管理效果展示二、注册中心与服务调用1. Nacos 概述2. 注册服务三、医院管理实现1. 医院列表2. service-cmn 模块提供接口3. 封装 Feign 服务调用4. 医院接口远程调用数据字典5. 添加数据字典显示接口6. 医院列表前端一、医院管理 目前我们把医院、科室和排…

函数栈帧的创建和销毁

“总有人间一两风&#xff0c; 填我十万八千梦” &#x1f351;作者&#xff1a;小赛毛 &#x1f495;文章初次日期&#xff1a;2022/11/21 目录 函数栈帧解决了什么问题&#xff1f; 什么是栈&#xff1f; 什么是寄存器&#xff1f; 函数栈帧的创建和销毁 预热知识准备&a…

Flink DataStream API 介绍

Flink DataStream API 介绍 StreamExecutionEnvironment #mermaid-svg-JKeWa22W2vWA4zBS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JKeWa22W2vWA4zBS .error-icon{fill:#552222;}#mermaid-svg-JKeWa22W2vWA4z…

使用element-ui实现树形穿梭框

<template><div class"transferTreeBox"><!-- 左侧待选内容 --><div class"SelectBox"><div class"boxTitle" click"clickAllSelect">全选 ></div><div class"boxCenter"><…

【Hack The Box】Linux练习-- Frolic

HTB 学习笔记 【Hack The Box】Linux练习-- Frolic &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月7日&#x1f334; &#x1f36d…

dumi 2,它来了它来了它来了

dumi 1.0 在 2020 年 3 月 2 日正式发布&#xff0c;到今天一共有 80 位 Contributor、提交 1100 Commit、为近 4000 个开源项目提供了组件库/站点的文档方案&#xff1b;dumi 作为一个 GitHub 数亿开源项目中的渺小一粒&#xff0c;能有这么多人共同参与、能为这么多项目提供价…

【JAVA程序设计】(C00097) 基于SSM的果树溯源可视化管理系统

基于SSM的果树溯源可视化管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架的果树溯源可视化管理系统&#xff0c;本系统分为二种用户&#xff1a;管理员、农户 管理员角色包含以下功能&#xff1a; 登录、农户管理、商家管理、果树管理、地块管理、农资…

马上2023年了,终于发现一款颜值爆表的记账软件

不知道大家平时有没有记账的习惯&#xff0c;我是在疫情之后&#xff0c;才开始记账的。 记账之后&#xff0c;的确发现了很多问题。尤其是自己花钱大手大脚没有规划的毛病。 后来&#xff0c;在每个月第1周&#xff0c;我都会分析一下上一个月的账目&#xff0c;看看自己的收…

同花顺_代码解析_交易系统_J09_18

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 J_09 抛物线转向系统 J_10 均线系统 J_11 随机指标专家 J_12 顺势指标 J_15 动量线 J_16 心理线 J_17 变动速率 J_18 相对强弱指标 J_09 抛物线转向系统 指标标识由绿变红时为买…