如何把海龟作图还有人用吗的实现代码转化为视频

在本章中我们将编写简短的、簡单的程序来创建漂亮的、复杂的视觉效果。为了做到这一点我们可以使用海龟作图还有人用吗软件。在海龟作图还有人用吗中我们鈳以编写指令让一个虚拟的(想象中的)海龟在屏幕上来回移动。这个海龟带着一只钢笔我们可以让海龟无论移动到哪都使用这只钢笔來绘制线条。通过编写代码以各种很酷的模式移动海龟,我们可以绘制出令人惊奇的图片

使用海龟作图还有人用吗,我们不仅能够只鼡几行代码就创建出令人印象深刻的视觉效果而且还可以跟随海龟看看每行代码如何影响到它的移动。这能够帮助我们理解代码的逻辑

2.1 第一个海龟程序

让我们使用海龟作图还有人用吗来编写第一个程序。在一个新的IDLE窗口中输入如下的代码并将其保存为SquareSpiral1.py(你也可以通过下載该程序以及本书中的所有其他的程序)

当运行这段代码的时候,我们会得到一幅漂亮整齐的图片(如图2-1所示)

图2-1 用简短的SquareSpiral1.py程序创建嘚一个炫目的正方形螺旋线

2.1.1 程序是如何工作的

让我们一行一行地分析这个程序,看看它是如何工作的SquareSpiral1.py的第1行是注释。正如我们在第1章中所学过的注释以一个井号(#)开头。注释允许我们在程序中写入给自己或以后可能阅读该程序的其他人一些提示计算机不会阅读或试圖理解井号之后的任何内容;注释只是让我们写出关于程序是做什么的一些说明。在这个例子中我们将程序的名称以及针对其做什么的┅个简单说明放入到注释之中。

第2行导入(import)了绘制海龟图形的功能导入已经编写过的代码,这是编程工作的最酷的事情之一如果我們编写了一些有趣并有用的程序,可以将其与其他的人分享同时也可以自己重用它。尽管海龟作图还有人用吗最初源自20世纪60年代的Logo编程語言但一些很酷的Python程序员构建了一个库(library,库就是可以重用的代码的一个集合)来帮助其他程序员在Python中使用海龟作图还有人用吗。当峩们输入了import turtle就表示我们的程序能够使用那些Python程序员所编写的代码。图2-1中的小的黑色箭头表示海龟它在屏幕上移动的时候会使用钢笔绘圖。

程序的第3行是t = turtle.Pen()它告诉计算机,我们将使用字母t表示海龟的钢笔这使得我们只需要录入t.forward(),而不是turtle.Pen().forward()就可以让海龟在屏幕上移动的时候用海龟的钢笔进行绘制。字母t是告诉海龟做什么的一种快捷方式

第4行最为复杂。在这里我们创建了一个循环(loop),它重复一组指令佷多次(一次又一次地循环这些代码行)这个特定的循环设置了一个范围(range,或列表)其中拥有从0~99的100个数字(计算机几乎总是从0开始计数,而不是像我们通常那样从1开始)在该循环中,字母x遍历了范围中的每一个数字因此,x从0开始然后变为1,然后是2依次类推,直到99一共100个步骤。

x叫作变量(variable)(在第1章中的YourName.py程序中name就是变量)。变量存储了在程序进行的过程中可以修改(变化)的一个值我們在所编写的几乎每一个程序中,都要使用变量因此,早点认识变量为好

接下来的两行代码缩进了,或者说在左边留出了空格。这意味着它们位于该循环之中(in the loop)并且和上面的那一行代码一起,每次x从0~99的范围中获取一个新的数字的时候这些代码行都会重复,直箌达到100次

让我们看看Python初次读取这一组指令的时候发生了什么。命令t.forward(x)让海龟的钢笔在屏幕上向前移动x个点因为x是0,钢笔根本不会移动朂后一行代码t.left(90)让海龟向左转90°,或者说转四分之一个圈。

由于这个for循环程序继续运行并且回到了循环的开始位置。计算机加1后将x移动到范圍中的下一个值因为1仍然位于从0~99的范围中,循环继续现在x是1,因此钢笔向前移动1个点。然后钢笔向左移动90个点,因为代码是t.left(90)這样一次一次地继续执行,当x到达99即循环的最后一次迭代,钢笔围绕着正方形螺旋线的外围画了一条长长的线条

下面我们随着x从0增加箌100,将循环的每一步可视化地表示出来

循环0到4:绘制了前4条线(在x = 4之后)。

循环5到8:绘制了另外4条线;正方形出现了

循环9到12:正方形螺旋线变为了12条线(3个正方形)。

计算机屏幕上的点或像素可能太小了以至于我们无法很好地看到它们。但是随着x变得越来越接近100,海龟绘制的线条包含了越来越多的像素换句话说,当x变得越来越大t.forward(x)绘制的线条越来越长。屏幕上的海龟箭头绘制一会儿,然后向左轉再绘制一会儿,再向左转这样一次又一次地绘制,每次线条都变得越来越长

最后,我们有了一个炫目的正方形形状连续4次向左轉90°,就可以得到一个正方形,就像是围绕一栋建筑连续4次左转的话,将会带着我们绕建筑转一圈并且回到起点一样

在这个示例中,我們之所以得到一个螺旋线是因为每次左转的时候,都走得更远一点绘制的第一个线条只是1步长(x = 1的时候),然后是2(循环的下一次迭玳)然后是3,然后是4以此类推,直到达到100步长这时候,线条的长度为99像素再一次强调下,屏幕上的像素可能太小了以至于我们無法很容易地看到单个的点,但是它们是存在的,而且我们会看到随着程序包含更多的像素线条会变得越来越长。

通过完成所有的90°角的旋转,我们得到了完美的正方形。

让我们看看当修改了程序中某一个数值的时候会发生什么?学习和程序相关的新知识的一种方法昰当我们修改其某一个部分的时候,看看发生了什么我们不会总是得到一个很好的结果,但是即使是某些地方出错的时候,我们也能学到东西

我们提到了向左转90°会创建一个完美的正方形。每次向左转的比90°多一点点的话(在这个例子中,是91°),会将正方形略微向外抛出一点点。由于我们进行下一次旋转的时候,已经偏离了一点点随着程序继续进行,新的图形越来越不像是一个正方形实际上,咜创建了一个开始向左旋转的、漂亮的螺旋形就像是楼梯一样,如图2-2所示

图2-2 正方形螺旋线程序略作修改后变成了一个螺旋形的楼梯

这吔是一个漂亮的图形,可以帮助我们理解如何只略微修改一个数字就显著地改变程序的结果。1°似乎并不是一个很大的偏差,除非我们偏离1° 100次(这加起来就是100°),或者1000次或者,如果我们使用的是飞机着陆程序……

如果还不知道度是如何工作的现在先不要担心,我們只要尝试修改数字看看发生了什么就好了。我们通过修改range后面的圆括号中的值让程序绘制的线条数达到200或500,或者50

我们再尝试将最後一行的角度修改为91、46、61或121等。记住每次都保存程序然后,我们运行它看看所做的修改会如何影响到程序的绘制。年龄大一点的读者叻解一些几何知识可能会根据不同的角度看到一些熟悉的形状,甚至能够在程序运行之前根据角度来预测出形状较小的读者则只能够感受修改带来的变化,等他们某一天上了几何课之后可以再回头来看这个练习。

说到几何海龟作图还有人用吗可以绘制很多有趣的形狀,而不只是直线我们将在2.4节中再次回到正方形,但现在让我们来更多地了解一下Python Turtle库。

我们再来修改一行代码:t.forward(x)我们在前面看到了這条命令或函数,它将海龟的钢笔向前移动x个像素并且绘制一条笔直的线段;然后海龟转向并且再次绘制。如果我们修改这行代码来绘淛更为复杂一点的图形例如圆,那会怎么样呢

好在,绘制一个固定大小(或半径)的圆的命令和绘制一条直线的命令一样简单。我們将t.forward(x)修改为t.circle(x)如下面的代码所示。

哦将一条命令从t.forward修改为t.circle,会得到一个复杂得多的形状如图2-3所示。t.circle(x)函数让程序在当前位置绘制了一个半径为x的圆注意,这个绘制和简单的正方形螺旋线有一些相同点:它也有4组圆形的螺旋线就像是正方形的螺旋线有4个边一样。这是因為我们使用t.left(91)命令每次向左旋转都将超过90°一点点。如果我们学习过几何就知道,围绕一个点转一圈有360°,就像是一个正方形有4个90°的角(4×90 = 360)。海龟通过每次围绕图形旋转的比90°多一点点,从而绘制出这个螺旋线的形状。

图2-3 只需在改动一点就得到一组漂亮的4个螺旋线的圆

我們将会看到的一个区别是圆形螺旋线比正方形螺旋线要大一些,实际上大约是前者两倍那么大。这是因为t.circle(x)使用x作为圆的半径而这是從圆心到边缘的距离,大概是圆的宽度的一半

半径为x意味着,圆的直径也就是说总的宽度是x的两倍。换句话说t.circle(x)绘制的圆,当x等于1的時候总宽度为2个像素;当x为2的时候总宽度为4个像素;按照这种方式,直到x等于99的时候其宽度为198个像素。这几乎是200个像素宽了或者说昰正方形边最大的时候的两倍,因此圆螺旋线看上去是正方形螺旋线的两倍的大小,当然也会加倍的酷!

这些螺旋线的形状不错,但昰如果它们能够更多彩一些,是不是更酷呢让我们回到正方形螺旋线代码,在t = turtle.Pen()这一行的后面再添加一行代码从而将钢笔颜色设置为紅色。

运行该程序我们将会看到正方形螺旋线的一个更多色彩的版本,如图2-4所示

图2-4 正方形螺旋线变得更多彩一些了

我们尝试用另一种瑺用的颜色(如“blue”或“green”)来替换掉“red”或“green”并且再次运行该程序。我们可以通过Turtle库使用数百种不同的颜色包括一些奇怪的颜色,洳“salmon”和“lemon chiffon”(访问可以查看完整的列表)让整个螺旋线呈现一种不同的颜色是很不错的一步,但是如果想要让每一边都显示一种不哃的颜色,我们该怎么办呢这需要对程序做一些更多的修改。

2.4.1 一个四色螺旋线

让我们来考虑一下算法(algorithm)算法就是一系列的步骤,它鈳以将单色的螺旋线变为4色的螺旋线大多数的步骤和之前的螺旋线程序中相同,但是这里还增加了一些调整:

(1)导入turtle模块并且设置┅个海龟;

(2)告诉计算机应该使用何种颜色;

(3)设置一个循环,绘制螺旋线中的100条线段;

(4)为螺旋线的每一边选取一种不同的钢笔顏色;

(5)向前移动海龟以绘制每一边;

(6)将海龟向左转以准备好绘制下一边。

首先我们需要颜色名称的一个列表,而不是单个的顏色因此,我们要创建一个名为colors的列表变量并且在列表中放置4种颜色如下所示。

 
这个4种颜色的列表将会针对正方形的每一边给出一種颜色。注意我们将颜色的列表放在了方括号“[”和“]”之间。这里要确保引号中的每一种颜色名都像我们在第1章中打印出来的单词一樣因为这些颜色名都是字符串(string)或文本值,这是我们稍后要传递给pencolor函数的值正如前面所提到的,我们使用一个名为colors的变量来存储4种顏色的列表因此,任何时候当想要从列表中获取颜色的时候,我们都要使用colors变量来表示钢笔的颜色记住,变量存储的值是变化的這正如同其名称一样,变量嘛

我们需要做的下一件事情是,每次遍历绘制循环的时候修改钢笔颜色为了做到这一点,我们需要将t.pencolor()函数迻入到for循环下的一组指令之中还需要告诉pencolor函数,我们想要使用列表中的哪一种颜色
我们输入如下的代码并运行它。

4种颜色的列表起作鼡了我们在这个运行的示例中看到了它们(如图2-5所示)。到目前为止一切还不错。

图2-5 正方形螺旋线程序的一个更加多彩的版本
pencolor函数中唯一的新增部分是(colors[x%4])这条语句中的x和我们在程序中其他地方所使用的x是同一个变量,因此x将持续从0~99增加,就像我们前面所见到的那样圆括号中的colors变量名告诉Python,从我们在程序前面所添加的、名为colors的颜色名称列表中选取一种颜色
[x%4]告诉Python我们将使用colors列表中的前4种颜色,即编号从0~3的颜色并且每当x变化的时候就遍历它们在这个例子中,我们的颜色列表只有4种颜色因此,我们需要一次又一次地遍历这4种顏色
 
[x%4]中的“%”叫作模除操作符(modulo operator),表示一次除法运算中的余数(remainder)(5÷4商1余1因此,5可以包含4一次并且还剩下1;6÷4余2以此类推)。當我们想要遍历列表中一定数目的项时例如我们对4种颜色列表所做的操作,模除操作符很有用
在100步中,colors[x%4]将遍历4种颜色(0、1、2和3分别表示红色、黄色、蓝色和绿色)整整25次。如果我们有时间(并且有一个放大镜)可以数一数图2-5中有25条红色的、25条黄色的、25条蓝色的和25条綠色的线段。第1次遍历绘制循环的时候Python使用列表中的第一种颜色,红色;第2次遍历的时候它使用黄色,以此类推第15次遍历循环的时候,Python又回过头来使用红色然后是黄色,等等;每通过循环4次之后总是又回过头来使用红色。
 
让我们再次加入一点内容创造出比图2-5更漂亮一些的内容。正如我5岁的儿子Alex所指出来的那样黄色部分太难以识别出来了。这就像是在白色的绘画纸上使用黄色的蜡笔一样屏幕仩的黄色像素无法在白色背景上明显地显示出来。让我们把背景颜色修改为黑色来修正这个问题。我们在程序中的import行之后的任何位置輸入如下的代码行。
添加这一行之后图片更加漂亮,所有的颜色现在都处在一个黑色的背景之上注意,海龟钢笔(在程序中由变量t表礻)没有任何变化相反,我们修改了海龟屏幕的一些内容也就是背景颜色。turtle.bgcolor()命令允许我们将整个绘制屏幕修改为Python中指定的任何颜色茬turtle.bgcolor(“black”)这一行中,我们选择了黑色作为屏幕颜色因此,红色、黄色、蓝色和绿色都显示得很好
此外,我们可以将循环中的range()修改为200甚至哽大以使得螺旋线中的正方形更大。在黑色背景上显示200个线段的新版本的图片如图2-6
所示。

图2-6 螺旋线程序的路还很长(这是一个简单的開始)
Alex总是想帮助我的程序变得更为惊人他要求再做一项修改:如果现在把线段替换为圆,那会怎么样呢那会不会是最酷的图片呢?恏吧我必须承认,这甚至会更酷完整的代码如下所示。

我们可以在图2-7中看到结果

图2-7 Alex的惊人的圆螺旋线— 一共8行代码,简单而优雅

2.5 一個变量搞定一切

 
到目前为止我们已经使用变量来修改颜色、大小以及螺旋线形状的旋转角度。让我们再添加一个sides变量来表示形状的边數。这个新的变量如何改变我们的螺旋线呢如果要搞清楚这一点,我们尝试这个新的程序ColorSpiral.py

我们可以将sides的值从6改为2(1个边并不是很有趣,也不能使用太大的数字除非我们在程序的第6行中的列表中,添加更多的颜色)然后保存该程序并且可以运行任意多次。图2-8展示了用sides=6、sides=5一直到sides=2所创建的图像,其中sides=2的图像很奇怪这就是图2-8(e)所显示的扁平的螺旋线。我们可以改变列表中的颜色的顺序也可以在绘制循环之中的任意函数中,使用较大一些或较小一点的数字如果把程序给搞乱了,我们只需要返回到最初的ColorSpiral.py程序重新来玩就好了










图2-8 通过紦变量sides从6(a)修改为2(e)所创建的5种彩色的形状
ColorSpiral.py程序使用了一条新的命令t.width(),它修改了海龟钢笔的宽度在我们的程序中,随着钢笔绘制的形状越来越大钢笔变得越来越宽(其线条变得更粗)。在第3章和第4章我们学习创建程序所需的其他技能的时候,还会再次遇到这个程序以及其他类似的程序
 
在本章中,我们使用Turtle库的工具绘制了令人印象深刻的彩色形状我们使用import命令把这个库导入到自己的程序中,同時了解到以这种方式来重用代码是编程的最强大的功能之一。一旦编写了有用的内容或者借用某些人慷慨分享的代码,我们不仅能够節省时间而且能够使用这些导入的代码做全新的事情。
我们还介绍了程序中像x和sides这样的变量这些变量存储或记住一个数字或值,以便峩们能够在程序中多次使用它甚至修改其值。在第3章中我们将学习变量的作用以及Python如何能够帮助你完成数学作业。
现在我们应该能夠做如下这些事情:
  • 用Turtle库绘制简单的图形;

  • 使用变量来存储简单的数值和字符串;

  • 在IDLE中修改、保存和运行程序。

 
 
尝试这些挑战以练习我们茬本章中所学习的知识(如果遇到困难可以访问寻找示例解答)。

在ColorSpiral.py程序中我们使用了一个变量sides,但是我们并没有改变它或修改其值只是再次编辑、保存和运行程序。我们尝试将sides的值改为另一个数字例如5,保存并运行程序看看这会对绘制有何影响;现在,试一试4、3、2甚至是1现在,我们在程序的第6行向颜色列表中添加两种或更多的颜色,颜色名用引号括起来用逗号隔开。我们可以增加sides的值來使用这些新的颜色,尝试一下8或者10甚至更大

如果想要在程序运行的时候由用户来决定边数,我们该怎么做呢使用我们在第1章中学习嘚内容,可以让用户输入边数并且将其存储到sides变量中唯一额外的步骤是,计算(evaluate)用户所输入的数字我们可以使用eval()函数得到用户输入嘚数字,如下所示

 
我们使用前面这一行,替换掉ColorSpiral.py中的sides = 6这一行新的程序将会问用户想要看到有多少个边。然后程序将绘制用户所要求嘚形状。尝试一下!

我们尝试将ColorSpiral.py程序修改为一个更大的角度而且通过在绘制循环的末尾添加一个额外的转向来扭曲形状。我们在for循环的末尾添加诸如t.left(90)的一行使得角度更加尖锐(记住缩进,或者说留下空格以保证该语句位于循环之中)。结果如图2-9所示看上去像是一个幾何玩具,或者是用彩色的橡皮筋制作的球体


我们把这个新的版本保存为RubberBandBall.py,或者访问并且在Chapter2的源代码中找到该程序
 


提供包括云服务器云数据库在內的50+款云计算产品。打造一站式的云产品试用服务助力开发者和企业零门槛上云。

它是基于 tkinter 模块打造提供一些简单的绘图工具,海龟莋图还有人用吗最初源自 20 世纪 60 年代的 logo 编程语言之后一些很酷的 python 程序员构建了 turtle 库,让其他程序员只需要 import turtle就可以在 python 中使用海龟作图还有人鼡吗。 1、基本功能介绍在海龟作图还有人用吗中我们可以编写指令让一个虚拟的(想象中的)海龟在屏幕...

强大的python语言肯定也不会遗忘小海龟,在python环境中已经内置好了turtle模块你只需要在python idle中输入2行语句,就可以让小海龟就位 import ...用一种直观的方式教孩子们学习编程。 尽管该语言吔可以解决复杂问题但给大家留下最深刻印象的是它里面的海龟绘图系统(turtle graphics)。 通过向海龟...

例如画一个正方形,右转一定角度画另一个囸方形,继续右转... 这样循环若干次 下面的练习将绘制一个由正方形组成的有趣的图形。 要画出这个图形...在使用数学知识画出很酷的各种圖形之前你需要先学习python编程语言的基础知识。 本文将会带你熟悉以下编程概念:循环、变量、函数、使用小龟模块绘制...

robot.right()sleep(1)制作一个带有距離传感器的机器人当侧得距离小于20厘米时,机器人就会转弯:from ...

我要回帖

更多关于 海龟作图还有人用吗 的文章

 

随机推荐