turtle模块还能这样玩?(一条条金龙鱼、雨景)


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的快感了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章