美文网首页我爱编程儿童编程儿童编程
Python案例——喝墨水的小乌龟

Python案例——喝墨水的小乌龟

作者: 一石匠人 | 来源:发表于2018-11-09 10:29 被阅读10次

    (本文为前一篇文章《理解编程语言只需四个词-编程知识体系介绍(带python及scratch案例)》的说明案例之一)

    我们的这个案例要通过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进行的逻辑运算。其他的所有我们看得见的效果的实现语句就是“执行”部分,如移动距离,画直线、变颜色等。

    相关文章

      网友评论

        本文标题:Python案例——喝墨水的小乌龟

        本文链接:https://www.haomeiwen.com/subject/yysnxqtx.html