在本教程中,你将会学习到以下内容:
本教程来源于Real Python,一个风趣幽默的Python学习社区,强烈推荐大家关注。
turtle
是一个预安装的Python库,它允许用户通过提供的虚拟画布来创建图片和形状。其中,用于屏幕上绘图的笔叫做海龟笔
,这便是该库名称的由来。简而言之,Python海龟库可以帮助新程序员以一种有趣和交互式的方式感受用Python编程是什么样子的。
使用海龟库,人们可以绘制和创建各种类型的形状和图像。
这似乎看起来很酷,对吧?其实这仅是Python海龟库可以绘制的众多不同图像之一,大多数开发人员使用海龟库来绘制形状、创建设计和制作图像。此外,还可以用于创建迷你游戏和动画。
在正式开始之前,我们需要预先配置和安装Python环境,教程如下。
在开始Python编程之前,大家需要了解什么是库
。在现实世界中,图书馆是一个储存不同类型书籍的地方。你可以在任何时候访问这些书,并从中获取任何你需要的信息,随后再将它们归还到同一个地方。
在计算机世界中,库的工作原理与此类似。根据定义,库是一组重要的函数和方法,您可以通过访问这些函数和方法来简化编程。例如,Python内置的海龟库中便包含了创建映像所需的所有方法和函数。要访问Python库之前,我们可以利用Python内置的关键字import
将其导入到本地的Python环境中。
import turtle
是不是非常简洁?更多关键字信息感兴趣的可以进入此文了解。
Turtle
是一个图形库,这意味着我们需要创建一个单独的窗口(屏幕)来执行每个绘图命令。这里,我们可以通过为它初始化一个变量来创建这个屏幕。
在Python中,变量可以用来存储程序中使用的信息。在为变量赋值时初始化变量。不同于常量,变量可以在程序执行期间多次更改。
现在,让我们正式开始海龟绘画!首先,你需要按以下方法为它初始化一个变量:
s = turtle.getscreen()
不出意外的话,你应该会看到一个单独的窗口打开。
这个窗口便是绘画屏幕,在这里可以查看代码的输出,屏幕中间的黑色小三角形便叫做turtle
,后续的所有操作几乎都是靠它实现。
注意:请记住,当我们为变量命名时,需要选择一个任何正在查看你所编写程序的人都能容易理解的名称。但是,您还必须选择一个便于使用的名称,特别是那些需要我们在整个程序中经常调用它的变量名称!
例如,选择像 my_turtle_screen_name 这样的名称将是冗长乏味的,而像Joe或a这样的名称将显得非常随意。使用单个字母字符,比如本例中的s,可能会更合适,因为它简短易记,s指的是屏幕(screen)。
接下来,初始化变量t。其中Turtle()
是turtle
库所封装的一个类,提供了许多有用的接口,这里我们对其进行实例化。
t = turtle.Turtle()
就像屏幕一样,您也可以给这个变量另一个名称,如a或Jane,甚至my_turtle,但在本教程中,我们采用字母t代替。
现在我们已经具备了一块屏幕和一只海龟画笔。想象一下,屏幕好比是一块画布,而海龟就是一支笔,我们可以让海龟在屏幕上移动。此处的海龟拥有一些可变的特征,如画笔粗细、颜色和移动速度。它总是指向一个特定的方向,并且会朝我们所指定的方向移动:
在下一节中,我们将继续探索使用海龟库进行编程的不同方法。
在使用Python海龟库进行编程时,我们将首先学习的第一件事是如何让海龟按照期望的方向进行移动。接下来,我们将学习如何自定义海龟及其环境。最后,你将学习到一些可以执行一些特殊任务的增强型命令。
海龟笔可以朝四个方向移动,对应的编程指令对应如下:
指令 编程 等价缩写
-------------------------------------------
前进(Forward) —— t.right(dist) —— t.rt(dist)
后退(Backward) —— t.forward(dist) —— t.fd(dist)
向左(Left) —— t.left(dist) —— t.lt(dist)
向右(Right) —— t.backward(dist) —— t.bk(dist)
这里
dist
指的是移动距离(distance).
我们还可以从当前位置到屏幕上的任何其他任意位置画一条线:
如上所示,屏幕分为四个象限。海龟在程序开始时的初始位置为(0,0)
,这里定义为原点。当我们要将海龟移动到屏幕上的任何其他区域,我们可以使用t.goto(x, y)
进行移动,如:
此时,如果我们想要回到原点,只需输入t.home()
即可,当然你也可以直接以坐标的形式输入t.goto(0, 0)
.
上一小节,我们学会了如何控制海龟前进,下面将教大家绘制实际的形状样式。首先,我们先从一个简单的多边形入手。可以思考一下,一个多边形主要由什么组成?没错,多边形是由多条边和角度所构成,假设我们输入以下的代码:
t.fd(100)
t.rt(90)
t.fd(100)
t.rt(90)
t.fd(100)
t.rt(90)
t.fd(100)
那么,我们便能画出一个简单的正方形出来,大家可以逐行理解下。
Well done! 我们刚刚成功画了一个正方形,虽然还比较基础,但是举一反三,通过这种方式,我们可以利用海龟来创建不同的形状和图像。
现在,尝试使用这段代码作为模板绘制一个矩形。记住,在矩形中,四条边不相等,所以需要你相应地修改代码。一旦你掌握了海龟的绘画技巧,你甚至可以尝试通过增加边的数量和改变角度来创建更多的形状。
假设你想画一个圆,如果你试图用同样的方法画它就像你画正方形一样,那么这将是非常乏味的,你将不得不花很多时间仅仅为了得到一个圆的形状。值得庆幸的是,海龟库为此提供了一个解决方案t.circle(radius)
:
括号内的数字是圆的半径,我们可以通过改变圆的半径值来改变圆的大小。基于类似的方法t.dot(radius)
,我们也可以画出一个点,它只是一个经过填充的圆:
到目前为止,我们已经学习了如何移动海龟,并使用它创建不同的形状。在接下来的几节中,我们将了解到如何根据特定的需求定制属于你自己的图案。
默认情况下,turtle总是打开一个白色背景的屏幕。但是,你可以用下面的命令随时改变屏幕的颜色:
你可以用其他颜色代替blue
,例如试试green
或red
,我们会得到如上的结果。你可以为你的屏幕使用各种颜色,只需要输入相应的十六进制码即可,如#285078
。要了解关于使用不同颜色的更多信息,请查看Python-turtle库对应的官方文档。
有时,我们可能想要更改屏幕的标题,这样可以让它更个性化。你可以使用下面的命令改变屏幕的标题:
通过这种方式,我们便可以根据自己的喜好随意更改屏幕标题。
除了改变画笔的颜色和屏幕标题外,我们还可以增加或减少屏幕上海龟的大小。注意,这只会改变形状的大小,而不会影响海龟在屏幕上绘制时的输出。尝试输入以下命令:
t.shapesize(1,5,10)
t.shapesize(10,5,1)
t.shapesize(1,10,5)
t.shapesize(10,1,5)
你将会得到以下输出:
t.shapesize()
所提供的三个参数分别为:
我们可以根据自己的喜好更改这些设置。在上面的例子中,你可以看到海龟的外观有明显的不同。有关如何更改海龟大小的更多信息,请查看Python-turtle库对应的官方文档。
前面的命令只改变了海龟形状的大小。然而,有时我们可能需要增加或减少画笔的厚度,此时我们可以使用以下命令来完成此操作:
t.pensize(5)
t.forward(100)
如上所示,现在画笔的大小是原来的5倍。大家可以尝试多画一些不同尺寸的线,以比较它们之间的粗细差别。
当我们第一次打开一个新屏幕时,海龟开始是一个黑色的图形,并用黑色墨水绘制。为此,我们可以做两件事情:
如果你愿意,你甚至可以选择这两种。在改变颜色之前,增大海龟的大小,以帮助您更清楚地看到颜色差异。输入以下代码:
t.shapesize(3,3,3)
现在,要改变海龟(或填充)的颜色,只需调用fillcolor
:
要更改钢笔(或轮廓线)的颜色,只需调用pencolor
:
要同时更改两者的颜色,只需调用color
:
其中,第一个颜色参数是画笔的颜色,第二个颜色参数是指填充的颜色。注意,改变钢笔和填充的颜色也会相应地改变屏幕上乌龟的颜色。
给图像上色通常会使它看起来更好看。Python海龟库为大家提供了绘图填充颜色的功能。试着输入下面的代码,看看会发生什么:
t.begin_fill()
t.fd(100)
t.lt(120)
t.fd(100)
t.lt(120)
t.fd(100)
t.end_fill()
当您使用t.begin_fill()时,你是在告诉计算机程序,你将绘制一个需要填充的封闭形状。然后,使用t.end_fill()表示你已经完成了形状的创建,然后告诉计算机你可以填充它了。
Trutle
最初的形状并不是真正的乌龟,而是一个类似于鼠标箭头的三角形图形。但是,我们可以简单的指令来改变海龟的外观:
t.shape("turtle")
t.shape("arrow")
t.shape("circle")
除此之外,还支持正方形square
、三角形triangle
以及默认格式classic
。
海龟通常以常规的速度移动。当我们想减少或增加速度以使海龟移动得更慢或更快,那么便可以通过输入以下命令来实现:
t.speed(1)
t.forward(100)
t.speed(10)
t.forward(100)
这段代码会先降低速度,让乌龟向前移动,然后提高速度,让乌龟再次向前移动,如下所示:
速度可以是从0(最慢的速度)到10(最高的速度)的任何数字。你可以操纵你的代码,看看乌龟会走多快或多慢。
假设你想设置海龟的特征如下:
>>> t.pencolor("purple")
>>> t.fillcolor("orange")
>>> t.pensize(10)
>>> t.speed(9)
>>> t.begin_fill()
>>> t.circle(90)
>>> t.end_fill()
很长,但也没那么糟糕,对吧?现在,想象一下如果你有10只不同的乌龟。改变他们所有的特征对你来说是非常无聊的!好消息是,这些操作我们可以集成在一条指令,就像这样:
>>> t.pen(pencolor="purple", fillcolor="orange", pensize=10, speed=9)
>>> t.begin_fill()
>>> t.circle(90)
>>> t.end_fill()
这一行代码改变了整支笔,而不需要单独改变每一个特征。要了解关于该命令的更多信息,请查看Python-turtle库官方文档。非常棒!现在,你已经学会了如何自定义你的海龟和屏幕,看看在使用Python海龟库绘图时需要的其他一些重要命令。
有时,你可能希望将你的海龟移动到屏幕上的另一个点,而不在屏幕上连续画任何东西。为此,我们可以使用penup()
。然后,当你想再次开始绘图时,可以使用pendown()
。现在,让我们尝试使用你之前用来画正方形的代码来尝试一下:
>>> t.fd(100)
>>> t.rt(90)
>>> t.penup()
>>> t.fd(100)
>>> t.rt(90)
>>> t.pendown()
>>> t.fd(100)
>>> t.rt(90)
>>> t.penup()
>>> t.fd(100)
>>> t.pendown()
在这里,通过在原始程序之间添加一些额外的命令,我们获得了两条平行线而不是一个正方形。
无论你多么小心,总是有可能犯错误。不过,别担心~~~海龟库为您提供了撤销所做操作的选项。如果你想撤销你所做的最后一件事,那么输入这条命令t.undo()
即可。
这条命令的作用是将你运行的最后一个命令撤消。假如你想撤消最后N
个命令,那么需要输入对应的N
次t.undo()
命令。
现在,从开始学习本教程以来,你的屏幕上可能有很多内容。为了腾出更多的空间,只需输入以下命令t.clear()
,将会清理当前的屏幕,以便我们可以继续绘图。注意,这里的变量不会被改变,海龟将保持在相同的位置。如果你的屏幕上有其他海龟而不是原来的海龟,那么它们的图画将不会被清除,除非你在代码中特别调用它们。
当然,我们也可以选择使用重置命令reset()
重新开始。届时屏幕将被清除,海龟的设置将全部恢复到默认参数。
现在我们已经学习了使用Python turtle库进行编程的基础知识,接下来将了解在编程时可能会用到的一些附加特性。
你可以选择在屏幕上留下海龟的印记,这只是海龟的印记。试着输入这段代码,看看它是如何工作的:
>>> t.stamp()
8
>>> t.fd(100)
>>> t.stamp()
9
>>> t.fd(100)
出现的数字是海龟的位置或Stamp ID。现在,如果你想删除一个特定的戳,只需使用该方法t.clearstamp(8)
即可。
有时,我们可能需要在屏幕上有多个海龟:
>>> c = t.clone()
>>> t.color("magenta")
>>> c.color("red")
>>> t.circle(100)
>>> c.circle(60)
Awesome!
现在你已经了解了Python turtle
库中的一些重要命令,可以继续学习更多需要理解的概念了。
到目前为止,我们已经学习了如何自定义海龟环境,并且通过命令使海龟在屏幕上移动以及一些附加属性。现在是进行编程过程中最重要的部分的时候了。在本节中,您将通过创建一个可以与朋友一起玩的有趣游戏,将你在本文中所学到的所有内容实现到一个程序中。
在我们正式开始之前,以下是关于你需要了解到的这款游戏中的内容:
目标
看谁跑得快
玩法
结构
OK! 了解完游戏规则后,让我们正式开始!首先,我们需要设置环境。
首先导入Python海龟库。其次,让我们导入Python内置的随机库,它可以帮助我们从列表中随机选择一个数字:
>>> import turtle
>>> import random
一旦这些库被成功调用到你的环境中没有抛出任何的异常,您就可以继续处理程序的其余部分。
现在让我们来创建两个代表玩家的海龟。每个海龟都有不同的颜色,对应不同的玩家。这里我们设置路人甲的海龟为绿色
,路人乙的海龟为蓝色
:
>>> player_one = turtle.Turtle()
>>> player_one.color("green")
>>> player_one.shape("turtle")
>>> player_one.penup()
>>> player_one.goto(-200,100)
>>> player_two = player_one.clone()
>>> player_two.color("blue")
>>> player_two.penup()
>>> player_two.goto(-200,-100)
当我们创建完海龟之后,需要确保两只龟龟的起始位置相同。现在,让我们一起为这两只海龟建立一个家,这个家将成为每只海龟的归(终)宿(点)。这里,我们用圆圈来表示每只海龟的家:
>>> player_one.goto(300,60)
>>> player_one.pendown()
>>> player_one.circle(40)
>>> player_one.penup()
>>> player_one.goto(-200,100)
>>> player_two.goto(300,-140)
>>> player_two.pendown()
>>> player_two.circle(40)
>>> player_two.penup()
>>> player_two.goto(-200,-100)
绘制完各自的家园后,将海龟送回它们的起始位置,如图所示:
太棒了!目前为止游戏的视觉元素已经完成,现在我们可以继续创建用来玩游戏的骰子。
我们可以用列表
为游戏创建一个虚拟骰子,这是一个有序的序列。在现实生活中,你可能会准备购物清单和待办事项清单来帮助你保持条理。在Python中,列表以类似的方式工作。
在这种情况下,我们将使用一个列表来创建骰子。首先,按照从1
到6
的升序定义数字列表。你可以定义一个列表,给它一个名(变)字(量),然后把它的item
用方括号括起来,如下所示:
>>> die = [1,2,3,4,5,6]
现在,让我们开始掷骰子吧!
是时候为剩下的游戏内容开发代码了。这里我们将使用循环和条件语句,初学者需要小心缩进和空格。首先,让我们先梳理下程序运行游戏所需的步骤:
Step1
首先告诉程序检查是否有一只海龟抵达终点;
Step2
如果没有,那么我们将告诉计算机程序允许玩家继续游戏;
Step3
在每个循环中,我们将告诉程序从列表中随机选择一个数字来掷骰子。
Step4
然后根据随机选择的结果将海龟移动相应的距离。
程序不断重复这个过程,一旦其中一只乌龟达到目标,程序就会停止:
>>> for i in range(20):
... if player_one.pos() >= (300,100):
... print("Player One Wins!")
... break
... elif player_two.pos() >= (300,-100):
... print("Player Two Wins!")
... break
... else:
... player_one_turn = input("Press 'Enter' to roll the die ")
... die_outcome = random.choice(die)
... print("The result of the die roll is: ")
... print(die_outcome)
... print("The number of steps will be: ")
... print(20*die_outcome)
... player_one.fd(20*die_outcome)
... player_two_turn = input("Press 'Enter' to roll the die ")
... die_outcome = random.choice(die)
... print("The result of the die roll is: ")
... print(die_outcome)
... print("The number of steps will be: ")
... print(20*die_outcome)
... player_two.fd(20*die_outcome)
最终输出看起来会像这样子:
好了,到这里我们已经尝试开发了一个非常简单的小游戏。当然,如果你熟悉更多的Python语法,你可以为该项目添加更多有趣的东西,例如添加更多的海龟,改变颜色,改变速度,甚至创造一些障碍来挑战玩家。这完全取决于身为游戏开发者的你!
在本教程中,我们学习了如何使用Python turtle
库进行编程,并掌握了一些非常重要的编程概念。您知道如何处理变量初始化、循环、条件语句、缩进、列表和操作符。这对你来说是一个很好的开始,特别是对于初学者来说!
学完本节课程,你掌握了以下知识点:
现在,如果你已经准备好进入一些更高级的Python
编程。要在你的Python
之旅中取得进一步的进展,请继续跟随Pytrick
的步伐。只要记住努力学习并坚持练习,你渐渐就会发现你很快就会成为一名Pythoner
!