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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356