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

2023-05-16

文章目录

      • 一条条金龙鱼
      • 雨景

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

turtle模块还能这样玩?(一条条金龙鱼、雨景) 的相关文章

  • Linux(Ubuntu)下升级Nginx服务器软件至nginx-1.17.6

    Linux下升级Nginx服务器软件nginx 1 17 6 Nginx 音engine X 是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器 也是一个 IMAP POP3 SMTP 代理服务器
  • 通过SnmpWalk获取服务器状态信息

    简单网络管理协议SNMP xff08 Simple Network Management Protocol xff09 是网络监控和网络设备管理的统一 协议 xff0c 并被所有主流的操作系统和大量网络应用程序所支持 SNMP广泛用于管理和
  • 聊聊几款文件同步备份工具,你更喜欢哪一款呢?

    文件备份对企业的价值 对于绝大多数人而言 xff0c 电脑中的不少文件对于我们来说都非常重要 xff0c 一旦丢失 xff0c 损失将会难以估量 随着网络威胁的不断发展和变得越来越复杂 xff0c 文件传输和托管文件传输之间的区别对于企业来
  • 5分钟学会本地Pypi源搭建

    前言 通常我们在下载 python 包时都会选择清华源或者阿里源 但是当我们的开发环境无法访问外网的时候 xff0c 就需要搭建私有源 今天我们就一起花 5 分钟时间学习如何搭建一个本地私有源 工具选择 搭建本地私有源有很多种方案 xff0
  • Linux基础第十一章:日志文件及如何使用rsyslog搭建小型日志服务器

    一 日志文件 1 日志作用 将系统和应用发生的事件记录至日志中 xff0c 以助于排错和分析使用 记录的内容包括 xff1a 时间 xff0c 地点 xff0c 人物 xff0c 事件 2 常用日志 日志文件位置日志文件说明 var log
  • Linux parted 分区命令详解

    一 概述 通常我们用的比较多的分区工具是fdisk命令 xff0c 但由于fdisk只支持MBR分区 xff0c MBR分区表最大支撑2T的磁盘 xff0c 所以无法划分大于2T的分区 而parted工具可以划分单个分区大于2T的GPT格式
  • 配置docker pull代理

    Dockerd 代理 在执行docker pull时 xff0c 是由守护进程dockerd来执行 因此 xff0c 代理需要配在dockerd的环境中 而这个环境 xff0c 则是受systemd所管控 xff0c 因此实际是system
  • 使用 VaultWarden 搭建个人密码管理器 原先Bitwarden

    0 背景 超过 10 年网龄的我 xff0c 注册过很多网站帐号 xff0c 而出于安全方面的考量 xff08 避免脱库 xff09 xff0c 每个网站的密码都用不同的复杂的随机密码 xff0c 这时候一个密码管理器就显得十分有必要 xf

随机推荐