七段数码管的绘制与拓展:
先给出代码:
#七段数码管绘制
import turtle
def drawline(draw):
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
turtle.right(90)
def drawdigit(digit):
drawline(True) if digit in [2,3,4,5,6,8,9] else drawline(False)
drawline(True) if digit in [0,1,3,4,5,6,7,8,9] else drawline(False)
drawline(True) if digit in [0,2,3,5,6,8,9] else drawline(False)
drawline(True) if digit in [0,2,6,8] else drawline(False)
turtle.left(90)
drawline(True) if digit in [0,4,5,6,8,9] else drawline(False)
drawline(True) if digit in [0,2,3,5,6,7,8,9] else drawline(False)
drawline(True) if digit in [0,1,2,3,4,7,8,9] else drawline(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawdate(date):
for i in date:
drawdigit(eval(i))
def main():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawdate(‘20190518’)
turtle.hideturtle()
turtle.done
main()
其中drawline函数为画一条线的函数,我们使用turtle库来绘制一条直线,并在画完线之后右转90°。
drawdigit函数为输入一个0—9的数字,将这个数字转化成七段数码管来表示,采用的方式为逐个数码管来绘制。在画完下半个以后再转回左边90°,即可绘制上半个的三个数码管,最后将画笔右移一段距离,准备绘制下一个数字。
drawdate函数为将一段字符转化为数字的形式,以便绘制。
main函数为主函数,调用以上三个函数来完成主要的作用。
绘制结果如下:
我们发现,数字很简陋不美观,并且时间只是我们所输入的时间,所以我们需要改进一下函数。
下面是需要改进的部分:
def drawgap():
turtle.penup()
turtle.fd(5)
def drawline(draw):
drawgap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawgap()
turtle.right(90)
我们定义了一个drawgap函数,意义为希望每绘制一段数码管后,隔出一段距离后再绘制下一段数码管,再drawline函数中的第一行和第四行,我们再画线的前后都加一段空白距离,这样会使数字更加美观。
def drawdate(date):
#假设输入格式为"%Y-%M+%D@"可以识别年月日(符号为任意给定)
turtle.pencolor(“red”)
for i in date:
if i == ‘-’:
turtle.write(‘年’,font=(“Arial”,18,“normal”))
turtle.pencolor(“green”)
turtle.fd(40)
elif i == ‘+’:
turtle.write(‘月’,font=(“Arial”,18,“normal”))
turtle.pencolor(“blue”)
turtle.fd(40)
elif i == ‘@’:
turtle.write(‘日’,font=(“Arial”,18,“normal”))
else:
drawdigit(eval(i))
这里我们假设输入的格式为"%Y-%M+%D@",作用为判断哪个是年哪个是月哪个是日期,符号可以自己确定,但需要相应在主函数中改变,具体改变在后面介绍。我们在每一次出现年月日后改变一下颜色,可以使年月日的颜色都不一样,如果不出现这些字符,则用drawdigit函数画出代表数字的七段数码管。
def main():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawdate(time.strftime(’%Y-%m+%d@’,time.gmtime()))
turtle.hideturtle()
turtle.done
主函数中我们使用time库的strftime函数将当天的时间格式化,要注意的是,这里的每一个符号要与drawdate中的识别符号一致。
改进后的代码如下:
#七段数码管绘制的改进
import turtle,time
def drawgap():
turtle.penup()
turtle.fd(5)
def drawline(draw):
drawgap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawgap()
turtle.right(90)
def drawdigit(digit):
drawline(True) if digit in [2,3,4,5,6,8,9] else drawline(False)
drawline(True) if digit in [0,1,3,4,5,6,7,8,9] else drawline(False)
drawline(True) if digit in [0,2,3,5,6,8,9] else drawline(False)
drawline(True) if digit in [0,2,6,8] else drawline(False)
turtle.left(90)
drawline(True) if digit in [0,4,5,6,8,9] else drawline(False)
drawline(True) if digit in [0,2,3,5,6,7,8,9] else drawline(False)
drawline(True) if digit in [0,1,2,3,4,7,8,9] else drawline(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawdate(date):
#假设输入格式为"%Y-%M+%D@"可以识别年月日(符号为任意给定)
turtle.pencolor(“red”)
for i in date:
if i == ‘-’:
turtle.write(‘年’,font=(“Arial”,18,“normal”))
turtle.pencolor(“green”)
turtle.fd(40)
elif i == ‘+’:
turtle.write(‘月’,font=(“Arial”,18,“normal”))
turtle.pencolor(“blue”)
turtle.fd(40)
elif i == ‘@’:
turtle.write(‘日’,font=(“Arial”,18,“normal”))
else:
drawdigit(eval(i))
def main():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawdate(time.strftime(’%Y-%m+%d@’,time.gmtime()))
turtle.hideturtle()
turtle.done
main()
结果如下:
在这个问题中我们要有以下的思维:
1、模块化思维:确定出每一个模块的接口,封装的功能,利用定义函数来实现。
2、规则化思维:将整个过程抽箱出来,形成一个规则,如本例中,每一个数字都走过七个数码管,让计算机自己执行。简化了编码难度。
3、化简:将一个大的程序分为很多小程序的组合,每个功能由一部分代码实现。