乌龟编程精讲版-37

python玩与学 | 有你好看

公益教程 | 代码俱乐部 | 玩物励志

有的时候只要拓展下你的想象力,就能做出意想不到的效果。当然,最好的办法还是读别人的代码,然后总结经验,变成你的。

看一个国外网友所做的“Laser Beam”——就像激光灯一样的动画,如何实现呢?先看效果吧!

激光镭射灯效果动画

代码欣赏

代码及简单解释看下图:总体来说,代码量很小,难度一般,但是人家的思路是很独特的,需要仔细体会。

激光镭射效果Python完整代码

代码释义

那个函数draw_line()一点都不难理解:就是实现了一个从某个点(x1,y1)到另外一个点(x2,y2)画一条直线的功能。但是在双层嵌套的for循环里调用它是什么效果呢?这里教大家理解代码的一个方法:当你不知道某段代码的意思的时候,你把不明白的单独提出来,写一些简单的测试代码来执行下,就知道什么意思了。比如我们要弄明白双层for循环下draw_line()函数到底做了什么,我们把无关的代码剔除掉,仅留以下部分(测试代码):

注释掉三行代码,再加上一句pen.speed(0)以加速画画过程,我们就知道了上面的代码的运行结果是这样的:

测试代码执行的慢动作(图1)

测试代码的执行过程(图2)

测试代码的最终执行结果(图3)

从“慢动作”来看,双层for循环下draw_line()函数只不过是做了一些“画线”的动作:线的一点固定在(0,0)位置,线的另一个点呢?是从下到上、从左到右依次扫描,最终整体上看是画了一个黑黑的正方形(图3所示)。

激光灯扫描

那怎么实现“激光扫描”一样的效果呢?要干两件事:

1. 画画之前要写上:wn.tracer(False)

2.双层for循环的draw_line()函数之后写上wn.update()这个函数。

wn.update()函数实现:“update()实现乌龟屏幕的更新,当tracer关闭的时候用;用于快速展示画画过程的内容”。好了,意思就是快速的画画,而且还让你看到过程。

将我们最上面的完整代码注释掉最后两行然后再执行看下效果,是不是这个样子的?

五颜六色出来了,是因为这句

从颜色列表里每次随机选择一种颜色,执行的最终结果变成了一个绚烂的矩形,看下面(当然,由于while循环一直进行,所以不断的从左到右画线扫描):

五颜六色出来了,说好的“激光”呢?秘密就在代码的最后两句:

if y1 % 20 == 0:

pen.clear()

上面一个if选择结构:“求余运算%”表达式的意思:当y1是20的倍数的时候,也就是每隔20个线,清除一下clear前面画的图,这样最终的结果就变成“激光镭射灯”射出光线的效果了!

你还可以将20换成别的数试试,比如:5,40,100,这些数试试,看看还会变成什么效果呢?是不是很好玩?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180830G060YV00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券