接下来进入正题。在该部影片中,我印象最深的是男主角潘乘风(刘德华扮)因执行任务炸断腿后,在遭遇到警队不公正对待时与女主角(倪妮扮)的一句对话:"要不要我现在就做个炸弹拆给你看!"于是乎,我也有了这个想法,对呀,我也做个“炸弹”玩玩吧!当然,不用说你也知道,我这里的“炸弹”是用万能的Python做的。先来看一下我做的炸弹的威力吧!
整个定时炸弹的制作主要包含两个步骤:
1. 一是制作一个拥有倒计时功能的秒表。
2. 二是要制作秒表走完后的炸弹爆炸效果。
由于代码较长,接下来简单介绍一下具体的制作方法。
1. 制作倒计时秒表
秒表的制作主要利用Python的turtle库来完成。原理是每隔固定的时间(这里是每毫秒)就绘制出距离炸弹爆炸时间的时长。这里的时间主要包含时、分、秒和毫秒。如下图所示。
在绘制倒计时秒表时,原理其实就是用turtle绘制七段数码管。七段数码管的绘制如下图所示,其实就是要绘制以下七条线。
用turtle 绘制的方法如下:
def draw_digits(self,number):
# 从起点开始绘制
self.draw_line(True) if number in [2, 3, 4, 5, 6, 8, 9] else self.draw_line(False)
self.draw_line(True) if number in [0, 1, 3, 4, 5, 6, 7, 8, 9] else self.draw_line(False)
self.draw_line(True) if number in [0, 2, 3, 5, 6, 8, 9] else self.draw_line(False)
self.draw_line(True) if number in [0, 2, 6, 8] else self.draw_line(False)
self.left(90)
self.draw_line(True) if number in [0, 4, 5, 6, 8, 9] else self.draw_line(False)
self.draw_line(True) if number in [0, 2, 3, 5, 6, 7, 8, 9] else self.draw_line(False)
self.draw_line(True) if number in [0, 1, 2, 3, 4, 7, 8, 9] else self.draw_line(False)
self.left(180) # 调整指标,画完指标是
self.penup()
self.fd(20) # 浮空向前移动20像素(也就是两个数字间的距离是20像素)
以上代码中的‘draw_line’方法主要作用就是要去绘制七段数码管中的每一条线。具体代码如下。
def draw_gap(self):
self.up()
self.fd(6)
def draw_line(self,draw):
self.draw_gap()
self.down() if draw else self.up()
self.fd(40)
self.right(90)
现在已经可以绘制出不同的数字啦,接下来,我们只需要把倒计时的时间绘制出来就可以了。具体做法是:先利用“get_date”获得倒计时时长,然后,再利用“draw”将时长绘制出来。具体代码如下。
def get_date(self,tim):
str_time=time.strftime('%H-%M+%S',tim)
return str_time
def draw(self,str_time):
for i in str_time:
if i == '-':
self.write('::',font=('heiti',25,'bold'))
self.up()
self.fd(40)
elif i == '+':
self.write('::',font=('heiti',25,'bold'))
self.up()
self.fd(40)
elif i == '.':
self.write('::', font=('heiti', 25, 'bold'))
self.up()
self.fd(40)
else:
self.draw_digits(eval(i))
运行程序后,秒表计时器的效果如下:
2. 制作炸弹爆炸效果
接下来就该做炸弹啦。炸弹的做法很简单,有点类似于我今年在公众号里发布的用Python燃放烟花的那一篇文章中的做法(
过大年,用Python去绽放最绚丽的烟花)。具体方法如下:
首先在画布中央以1度为
间隔,放置360个画笔,画笔的形状都设置为“square”形状,并且让画笔在水平与竖直方面均做一定倍数的拉伸。这样做是想让这些画笔排列在一起,以模仿炸弹的引爆前的样子,具体代码如下:
def set_shapes(self):
shape = ['circle', 'classic', 'square', 'triangle', 'arrow', 'turtle']
for i in range(1,361):
newfirework = turtle.RawTurtle(self.screen)
newfirework.speed('fastest')
newfirework.up()
newfirework.pensize(5)
newfirework.seth(i)
newfirework.color('red')
newfirework.shape('square')
newfirework.shapesize(0.5, 5)
self.__shapes.append(newfirework)
self.screen.update()
接下来,做一个方法命名为“Boom”,不用说大家也知道,要做炸弹爆炸后的效果啦。方法是让刚刚的360个画笔同时开始在不同的方向上向外运动。代码如下:
def boom(self):
color='red'
width = self.screen._root.winfo_width()
height = self.screen._root.winfo_width()
min_radius = min([width,height])
number = min_radius//60
k=0
while True:
for firework in self.__shapes:
firework.color(color)
firework.down()
firework.showturtle()
for firework in self.__shapes:
firework.fd(60)
self.screen.update()
k+=1
if k>=number:
break
爆炸后,在屏幕上在打印出“Boom!!!”的字样,于是乎,就出现了爆炸后的效果啦。
怎么样,很简单吧