Python的turtle模块不仅可以用来绘制一些基本的图形,还有与图片结合,做出一些特殊的效果,还可以用来做二维小游戏。本篇是介绍用turtle模块做出的一幅动态的鱼儿游过的画面和动态的雨景图
一条条金龙鱼
1、先看一下效果图
2、创建屏幕对象
首先是导入实例化一个turtle屏幕对象,用setup()建立屏幕,并设置好屏幕的宽、高;然后注册我们需要用到的3张图片
#设置场景幕布(宽高,背景色, 飞船, 帧数)
s = Screen()
s.title('一条条金龙鱼@栀子') #设置标题
w, h = 1200, 700 #设置屏幕大小
s.setup(w, h) #建立屏幕
s.bgcolor('black') #设置颜色为黑色
s.register_shape('s0.gif')
s.register_shape('s1.gif')
s.register_shape('s2.gif')
#第一个参数为作图过程时长,第二个参数为刷新间隔时长(即帧数,单位毫秒)
s.tracer(0, 5) #为0表示禁用动画
注意,这里的register_shape()只能注册gif格式的图片。
3、画星空
我们的背景可以自定义一张图片,用对象名.bgpic(‘filename’)加入图片,也可以自己画一个,比如我画一个星空:
#创建星空
star = Turtle()
star.shape('circle') #新建一个画笔,设置为圆形
star.shapesize(0.05, 0.05) #改变圆形大小
star.color('white')
star.penup()
star.speed(0)
for i in range(100):
x = randint(-w/2, w/2) #w为开始定义的屏幕宽度,h为高度
y = randint(-h/2, h/2)
star.goto(x, y)
star.stamp() #使画笔留下痕迹
4、然后我们需要创建鱼群,并克隆鱼到鱼群里
#创建鱼群,用空列表来装鱼
mother_fishs = [
Turtle(shape='s0.gif', visible=False), #初始设置为不可见
Turtle(shape='s1.gif', visible=False),
Turtle(shape='s2.gif', visible=False)
]
#克隆鱼到鱼群里
space_fishs = []
for i in range(60): #60条鱼
idx = i % 3 #0,1,2
space_fish = mother_fishs[idx].clone() #克隆
space_fish._speed = random() * (idx+1) #1,2,3
space_fishs.append(space_fish) #把鱼加入到鱼群中
5、无限循环
我们最后一步就是通过无限循环来控制鱼群的移动,也就是改变一条条鱼的生成地点和它们的位置
在循环里,我们需要先遍历每一条鱼,设置它们的位置
for space_fish in space_fishs:
space_fish.setx(space_fish.xcor() - space_fish._speed)
然后我们需要判断一下这些鱼是否超出了边界,如果超出了,这条鱼就先隐藏,然后重新回到出发地,继续前进
if space_fish.xcor() < -w/2:
space_fish.hideturtle()
space_shuttle.goto(w/2+randint(0,w/2),randint(-h/2,h/2))
space_fish.showturtle()
这样,一条条金龙鱼游动的画面就做出来了,逻辑都很简单,操作也不难,都是turtle的基本操作,希望大家也能轻松做出来
6、完整代码
#导入库
from turtle import *
from random import *
#设置场景幕布(宽高,背景色, 飞船, 帧数)
s = Screen()
s.title('一条条金龙鱼@栀子') #设置标题
w, h = 1200, 700 #设置屏幕大小
s.setup(w, h) #建立屏幕
s.bgcolor('black') #设置颜色为黑色
s.register_shape('s0.gif')
s.register_shape('s1.gif')
s.register_shape('s2.gif')
#第一个参数为作图过程时长,第二个参数为刷新间隔时长(即帧数,单位毫秒)
s.tracer(0, 5) #为0表示禁用动画
#创建星空
star = Turtle()
star.shape('circle') #新建一个画笔,设置为圆形
star.shapesize(0.05, 0.05) #改变圆形大小
star.color('white')
star.penup()
star.speed(0)
for i in range(100):
x = randint(-w/2, w/2) #w为开始定义的屏幕宽度,h为高度
y = randint(-h/2, h/2)
star.goto(x, y)
star.stamp() #使画笔留下痕迹
#创建鱼群
mother_fishs = [
Turtle(shape='s0.gif', visible=False), #初始设置为不可见
Turtle(shape='s1.gif', visible=False),
Turtle(shape='s2.gif', visible=False)
]
#克隆鱼到鱼群里
space_fishs = []
for i in range(60): #60条鱼
idx = i % 3 #0,1,2
space_fish = mother_fishs[idx].clone() #克隆
space_fish._speed = random() * (idx+1) #1,2,3
space_fishs.append(space_fish) #把鱼加入到鱼群中
#设置舰队的初始状态
for space_fish in space_fishs:
space_fish.hideturtle() #让飞船先隐藏起来
space_fish.penup() #把画笔也隐藏
space_fish.goto(w/2+randint(0,w/2),randint(-h/2,h/2)) #设置出生位置,从最右边开始,高度随机
space_fish.showturtle() #让飞船显示出来
#无限循环,控制舰队的移动
while True:
for space_fish in space_fishs:
space_fish.setx(space_fish.xcor() - space_fish._speed)
if space_fish.xcor() < -w/2:
space_fish.hideturtle()
space_shuttle.goto(w/2+randint(0,w/2),randint(-h/2,h/2))
space_fish.showturtle()
s.update() #刷新屏幕
雨景
对应上面的游动金龙鱼案例,其实就是用turtle做了一个动态的处理,把我们加入的图片用一定的规则去改变位置,而且是简单的一维变化位置,就是从右到左,所以说逻辑并不复杂。
而且我们随便改一改,就可以实现另外一番效果,比如我想让它从上到下,并且换一张图片,就用雨滴图片;然后我不想用星空做背景,想用一张图片做背景,那就用turtle的bgpic()方法来设置背景。
这样,一幅雨景效果就实现了:
练习代码:
#导入库
from turtle import *
from random import *
#设置场景幕布
s = Screen()
s.title('雨景@栀子') #设置标题
w, h = 1200, 700 #设置屏幕大小
s.setup(w, h) #建立屏幕
s.bgcolor('black') #设置颜色为黑色
s.register_shape('s0.gif')
s.register_shape('s01.gif')
s.bgpic('s01.gif')
s.tracer(0, 5) #为0表示禁用动画
#创建雨滴群
mother_raindrops = [
Turtle(shape='s0.gif', visible=False), #设置为不可见
Turtle(shape='s0.gif', visible=False),
Turtle(shape='s0.gif', visible=False)
]
#克隆舰队
space_raindrops = []
for i in range(60):
idx = i % 3 #0,1,2
space_raindrop = mother_raindrops[idx].clone() #克隆
space_raindrop._speed = random() * (idx+1) #1,2,3
space_raindrops.append(space_raindrop)
#设置初始状态
for space_raindrop in space_raindrops:
space_raindrop.hideturtle()
space_raindrop.penup() #把画笔也隐藏
space_raindrop.goto(randint(-w/2,w/2),h/2) #设置出生位置,从最右边开始,高度随机
space_raindrop.showturtle()
#无限循环
while True:
for space_raindrop in space_raindrops:
space_raindrop.sety(space_raindrop.ycor() - space_raindrop._speed) #不断移动
if space_raindrop.ycor() < -h/2: #判断撞墙没有,撞墙就消失
space_raindrop.hideturtle()
space_raindrop.goto(randint(-w/2,w/2),h/2)
space_raindrop.showturtle()
s.update() #刷新屏幕
Python中的turtle真的非常有趣,有各种各样的玩法,只要我们去尝试就能切实体会到学Python的快感了