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

(本文为前一篇文章《理解编程语言只需四个词-编程知识体系介绍(带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进行的逻辑运算。其他的所有我们看得见的效果的实现语句就是“执行”部分,如移动距离,画直线、变颜色等。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

资源 | 像「花书」一样排版:Ian Goodfellow「亲授」的高级LaTex教程

机器之心整理 作者: Ian Goodfellow 参与:邱陆陆 当地时间 3 月 1 号,深度学习知名同名教材《Deep Learning》的第一作者 Ian...

44410
来自专栏前端小吉米

现在做 Web 全景合适吗?

1684
来自专栏天天P图攻城狮

Android 音视频系列:H264视频编码介绍

H264视频编码技术,是对序列帧图像进行压缩的技术。压缩之所以可能,是因为存在冗余数据。

6156
来自专栏绿巨人专栏

蒙特卡洛树搜索算法(UCT): 一个程序猿进化的故事

4756
来自专栏MixLab科技+设计实验室

人工智能Logo设计师Brandmark

封面由ARKie智能设计赞助 早在去年 mixlab 的一篇案例报告里,就介绍过 Brandmark 了,当时 Brandmark 还是 v1 的版本,现在已...

3323
来自专栏北京马哥教育

掌握这7种Python数据图表的区别,你就是大牛数据分析师!

Python 的科学栈相当成熟,各种应用场景都有相关的模块,包括机器学习和数据分析。数据可视化是发现数据和展示结果的重要一环,只不过过去以来,相对于 R 这样的...

53813
来自专栏数据结构与算法

CDQZ 0003:jubeeeeeat

总时间限制: 1000ms 内存限制: 256000kB描述 众所周知,LZF很喜欢打一个叫Jubeat的游戏。这是个音乐游戏,游戏界面是4×4的方阵,会根...

3246
来自专栏数据小魔方

ggplot2都有哪些使用不多但是却异常强大的图层函数

要说ggplot2中那些使用不多但是却功能强大的图层函数,我首先想到的就是geom_rect、geom_linerange、geom_segment、geom_...

2083
来自专栏阿凯的Excel

统计函数与通配符相爱,不是意外!

首插入音乐,功放党请慎点。 海鸟跟鱼相爱,只是一场意外! 但是统计函数和通配符相爱,却是一种必然! 统计函数何许人也:Sumif、Countif、Average...

3056
来自专栏机器之心

教程 | 如何优雅而高效地使用Matplotlib实现数据可视化

2925

扫码关注云+社区

领取腾讯云代金券