杂谈
小卡在刚学习编程的时候,就非常喜欢鼓捣一些字符相关的代码。因为还没学会如何写 GUI,因此只能用字符来实现界面的一些内容。
一来,能够快速学习编程技巧,二来至少字符是能够看得到的东西,至少做的东西可以让别人看到。
今天我们来实现一个比较有趣的代码,让一个字符实现物理引擎的下落,并在落地后进行弹跳,模拟真实场景,咱们让字符也感受一下物理世界!
一、实现效果
我们首先来看看今天实现的代码,它的效果如何:
下落动画
因为是字符,我们甚至可以用一句话来模拟下落:
字符串下落动画
怎么样,非常有趣吧!如果你刚刚开始学,把这个东西拿出去给你的同学看,这不得走路都带风!
二、理清思路
首先,我们要让字符来到物理世界,那么必须实现一些算法。我们知道地球的重力加速度是 9.8m/s^2,所以在代码中我们也将延续使用它:
GRAVITY = 9.8
我们将一个字符的高度作为 1m,这样就能够直接和9.8挂上钩,更方便计算。
另外为了能够更新我们的位置信息,我们需要一个 速度和更新位置信息的公式,我们将使用 匀变速运动位移公式 来实现更新:
修改为代码则为:
def update_pos(y, v, t):
return y + v * t + 0.5 * GRAVITY * t ** 2
我们还需要一个底线,不然会一直下坠,变成一个无底洞:
BOTTOM_HEIGHT = 20
现在我们仅需要设置一个初始的速度,进行下落,然后通过 重力加速度 修正速度,再通过 update_pos() 来更新位置,当触底后,我们将速度相反,并削减速度,即可实现真实的物理下落的动画了。
三、完整代码
import time
import os
INIT_Y = 0
VELOCITY = 0
GRAVITY = 9.8
BOTTOM_HEIGHT = 20
def update_pos(y, v, t):
return y + v * t + 0.5 * GRAVITY * t ** 2
def simulate():
global INIT_Y, VELOCITY
dt = 0.1
min_velocity = 0.5# 速度停止阈值
while True:
new_y = update_pos(INIT_Y, VELOCITY, dt) # 更新位置
VELOCITY += GRAVITY * dt # 更新速度
# 如果新的位置超过底部高度了,则表示触底
if new_y >= BOTTOM_HEIGHT:
new_y = BOTTOM_HEIGHT
VELOCITY = -VELOCITY * 0.5# 碰撞阻尼,速度相反并减小速度
# 速度过小时停止运动
if abs(VELOCITY) < min_velocity:
VELOCITY = 0
new_y = BOTTOM_HEIGHT # 强制锁定位置
# 清空控制台
os.system('cls' if os.name == 'nt' else 'clear')
print('\n' * int(new_y) + 'Python拉皮巴拉')
INIT_Y = new_y
time.sleep(dt)
simulate()
四、总结
通过编程我们可以实现很多数学和物理公式,通过这些公式我们可以实现很多非常有趣的效果,当然包括今天的字符下落动画。
如果你把今天的内容,改成gui可视的,那么你可能会实现一个效果非常不错的等待动画,所以还不赶紧去试试!