我们的这个案例要通过Python实现,通过控制一只小乌龟喝不同颜色的墨水,当小乌龟爬行的时候,会在身后留下不同颜色的痕迹。
8.1 程序编写步骤
第一步:确定程序目标
一只爱喝墨水的小乌龟,爬的过程中留下痕迹,爬行的过程就是画线的过程。
第二步:目标分解
我们需要让小乌龟具备下面功能:
1.爬行到相应的位置;
2.更换爬行痕迹的颜色;
3.蘸不同颜色的墨水;
第三步:设计原型
设计一个能爬行能变颜色的小乌龟,作为原型。
第四步:完善程序
丰富墨水颜色数量,改变乌龟的外观
第五步:扩展程序
这个案例的进一步扩展,比如添加功能、以此为基础改成其他程序等。
8.2 原型设计
下面我们开始我们的原型制作,打开IDLE,输入以下代码:
from turtle import *
pencolor('red')
goto(100,100)
运行程序,我们看到了一个箭头在屏幕上移动,并在其身后留下来一条红色的线。这个箭头就是我们的小乌龟了,一会而我们会让它真的变成乌龟的形状的。解释下代码,第一行代码from turtle import *是引入turtle类,其实这个语言本身已经为我们转备好了很多已经完成的命令,我们只需要告诉电脑我们想使用它们就可以了,这行程序就是告诉电脑我们想使用“乌龟(turtle)”类了。第二行代码pencolor('red')是告诉电脑把乌龟看成一只钢笔,并把钢笔的颜色设置成红色。第三行代码goto(100,100)是告诉小乌龟爬到坐标(100,100)的位置。
这里说一下Python Turtle的坐标系,屏幕中央是原点(0,0),水平方向X轴向右方向为正方向,垂直方向Y轴向上为正方向。
8.3 听懂更多命令
其实小乌龟还能听懂很多命令,我们继续完善原型,输入以下代码:
from turtle import *
pencolor('red')
goto(100,100)
pencolor('green')
right(90)
forward(100)
left(45)
backward(100)
goto(100,-50)
运行程序之后,小乌龟爬出了新的花样,如下图所示,变了角度,变了颜色。他是怎么做到的?
乌龟爬行原型pencolor('green')这行代码我们很熟悉了,就是把颜色由红色变成了绿色,你也可以设置其他你喜欢的颜色。right(90)、left(45)这两行就是告诉乌龟向右或向右旋转,括号中的数值是旋转的角度数值。forward(100)、backward(100)是告诉小乌龟前进或后退,括号中的数值是前进或后退的距离。最后一行代码goto(100,-50)我们也熟悉了,爬到坐标(100,-50)的位置。这些命令我们以后会经常用到,这里我们知道他们的作用就可以了。
8.4 开始蘸墨水
现在我们对照一下前文的目标分解部分,基本上实现了三个分解目标。下面我们完善一下功能。当小乌龟停在X轴大于零的地方,让它蘸红色的墨水,当她停在X轴小于零的地方,它蘸上蓝色的墨水。添加的代码如下,其中xcor()用于获取小乌龟的X坐标,if语句用于条件判断,“If xcor()>0”就是告诉小乌龟当它的X坐标大于零的时候需要做什么。
If xcor()>0:
pencolor('red')
else:
pencolor('blue')
8.5 用函数实现自动蘸墨水
我们上面蘸墨水的代码加入到一个函数中,简化我们的操作步骤。关于函数的具体细节我们会在后面的章节讲解,这里我们只需要理解函数是一个能够把很多命令放在一块的程序块,只要写出程序块的名字,就能运行它所包含的所有程序。我们将goto命令与上述的蘸墨水命令集合在一个函数mgt(这个名字可以改变,这里是my_goto的简写)里面。
def mgt(myx,myy):
if xcor()>0:
pencolor('red')
else:
pencolor('blue')
goto(myx,myy)
我们让乌龟达到某一坐标,直接调用函数mgt就可以,并在括号里填上坐标值。例如myt(100,100)就是让乌龟爬到坐标(100,100)的位置,这个过程中,乌龟会自己判断该用什么颜色留下痕迹。
我们可以用同样的方式,对forward、backward进行处理,分别命名为mfw和mbw结果如下:
def mfd(num):
if xcor()>0:
pencolor('red')
else:
pencolor('blue')
forward(num)
def mbd(num):
if xcor()>0:
pencolor('red')
else:
pencolor('blue')
backward(num)
当我们用mfd(150)的时候,乌龟会向前爬行150,并选择相应的颜色。
8.6 添加墨水池
下面我们开始第四步完善程序的部分。为了让操作更直观,我们在舞台上放置两个墨水池。代码中大部分领命我们都熟悉,只有少数新的命令。其中penup()为抬起笔,乌龟爬行就不会划线,pendown()为落笔,乌龟爬下划线。begin_fill()与end_fill()用于填充颜色,在两个语句中间画上框架,就会用fillcolor命令设置的颜色进行填充。
#舞台布置
#画第一个墨水池
penup()
goto(-300,300)
pendown()
fillcolor('red')
begin_fill()
forward(100)
right(90)
forward(100)
right(90)
forward(100)
right(90)
forward(100)
end_fill()
#画第二个墨水池
penup()
right(90)
goto(100,300)
pendown()
fillcolor('blue')
begin_fill()
forward(100)
right(90)
forward(100)
right(90)
forward(100)
right(90)
forward(100)
end_fill()
8.7 在墨水池蘸上墨水的方法
乌龟需爬到墨水池中,爬行时候才会变为相应的颜色,这个主要通过坐标判断。
if xcor()>-300 and xcor()<-200 and ycor()<300 and ycor()>200:
pencolor('red')
if xcor()>100 and xcor()<200 and ycor()<300 and ycor()>200:
pencolor('blue')
这里的ycor()用于获取乌龟的Y坐标,与xcor()对应。 条件语句中and 属于逻辑运算中的“且”关系,表示前后两个语句都满足条件才可以执行相应的程序。这部分内容在后续章节中也有详细的讲解。我们需要将原型中mgt、mfd、mbd函数中用于设定颜色的语句改成现在的代码。
8.8 乌龟现身
下面我们让主角小乌龟变身,一行代码就可以实现。
shape('turtle')
现在的代码是这个样子的:
from turtle import *
#设置乌龟形状
shape('turtle')
#舞台布置
#画第一个墨水池
penup()
goto(-300,300)
pendown()
fillcolor('red')
begin_fill()
forward(100)
right(90)
forward(100)
right(90)
forward(100)
right(90)
forward(100)
end_fill()
#画第二个墨水池
penup()
right(90)
goto(100,300)
pendown()
fillcolor('blue')
begin_fill()
forward(100)
right(90)
forward(100)
right(90)
forward(100)
right(90)
forward(100)
end_fill()
def mgt(myx,myy):
if xcor()>-300 and xcor()<-200 and ycor()<300 and ycor()>200:
pencolor('red')
if xcor()>100 and xcor()<200 and ycor()<300 and ycor()>200:
pencolor('blue')
goto(myx,myy)
def mfd(num):
if xcor()>-300 and xcor()<-200 and ycor()<300 and ycor()>200:
pencolor('red')
if xcor()>100 and xcor()<200 and ycor()<300 and ycor()>200:
pencolor('blue')
forward(num)
def mbd(num):
if xcor()>-300 and xcor()<-200 and ycor()<300 and ycor()>200:
pencolor('red')
if xcor()>100 and xcor()<200 and ycor()<300 and ycor()>200:
pencolor('blue')
backward(num)
#看效果
mgt(-250,250)
mbd(200)
mgt(150,250)
mbd(200)
运行效果图如图4.12所示。
最终效果图.PNG
8.9 更多可能
我们可以尝试让小乌龟做出更多种可能,比如:让小乌龟画出一个对称的图形,如三角形、空心十字架、心形等;让小乌龟画出复杂的具体图形,比如笑脸;画一幅现代艺术的线条画等。
8.10 辅助工具
像上一个案例一样,为了编程方便,这里我们也用了一个辅助辅助工具:
print(xcor(),ycor())
这行代码可以输出乌龟的X坐标和Y坐标。
8.11 案例中的编程系统分析
我们来分析一下代码,所有涉及到数字、颜色的地方都属于“数据”部分。条件判断部分属于“控制”部分,比判断乌龟是否在墨水池的坐标范围内。而控制部分的条件则属于“运算”部分,如通过and进行的逻辑运算。其他的所有我们看得见的效果的实现语句就是“执行”部分,如移动距离,画直线、变颜色等。