使用Python的turtle模块实现简单的烟花效果

news2024/12/24 11:39:24
import turtle
import random
import math

# 设置窗口大小
width, height = 800, 600
screen = turtle.Screen()
screen.title("Fireworks Explosion")
screen.bgcolor("black")
screen.setup(width, height)

# 定义烟花粒子类
class Particle(turtle.Turtle):
    def __init__(self, x, y, color):
        super().__init__()
        self.penup()
        self.goto(x, y)
        self.color(color)
        self.shape("circle")
        self.shapesize(0.2)  # 粒子大小
        self.angle = random.uniform(0, 2 * math.pi)
        self.speed = random.uniform(2, 5)
        self.setheading(self.angle * 180 / math.pi)
        self.showturtle()

    def move(self):
        self.speed *= 0.97  # 添加速度衰减效果
        x, y = self.position()
        self.goto(x + self.speed * math.cos(self.angle), y + self.speed * math.sin(self.angle))

def create_firework_explosion():
    explosion_color = random.choice(colors)
    x = 0  # 将烟花放在屏幕中央的水平位置
    y = 0  # 将烟花放在屏幕中央的垂直位置
    for _ in range(100):
        particles.append(Particle(x, y, explosion_color))

# 主循环
particles = []
colors = ["red", "green", "blue", "yellow", "purple", "cyan"]
screen.tracer(0)  # 关闭自动更新屏幕

while True:
    # 产生新的烟花爆炸
    if random.random() < 0.02:
        create_firework_explosion()

    # 更新烟花粒子位置
    for particle in particles:
        particle.move()

    # 移除离开屏幕的烟花粒子
    particles = [particle for particle in particles if -width//2 <= particle.xcor() <= width//2 and -height//2 <= particle.ycor() <= height//2]

    screen.update()  # 手动更新屏幕显示
    turtle.delay(10)  # 控制更新速度

注意,在turtle中,每个Particle实例都是一个turtle.Turtle()对象,这可能会在生成大量粒子时导致程序变慢。此外,由于turtle的事件循环机制,这个程序缺少一个简单的退出机制,可能需要添加一个按钮或者监听某个键盘事件来退出程序。

上述代码提供了一个基本框架,展示了如何使用turtle模块来模拟烟花效果。

要优化使用turtle模块的烟花效果代码,我们可以采取以下策略:

  1. 减少每次爆炸生成的粒子数量以提高性能。
  2. 使用ontimer方法代替死循环来控制动画的更新,这样可以避免程序无响应。
  3. 添加一个退出机制,让用户可以通过点击窗口来退出程序。

优化后代码:

import turtle
import random
import math

# 设置窗口大小
width, height = 800, 600
screen = turtle.Screen()
screen.title("Fireworks Explosion")
screen.bgcolor("black")
screen.setup(width, height)

# 定义烟花粒子类
class Particle(turtle.Turtle):
    def __init__(self, x, y, color):
        super().__init__()
        self.hideturtle()
        self.penup()
        self.goto(x, y)
        self.color(color)
        self.shape("circle")
        self.shapesize(0.2)  # 粒子大小
        self.angle = random.uniform(0, 2 * math.pi)
        self.speed = random.uniform(2, 5)
        self.setheading(self.angle * 180 / math.pi)
        self.showturtle()

    def move(self):
        self.speed *= 0.97  # 添加速度衰减效果
        x, y = self.position()
        self.goto(x + self.speed * math.cos(self.angle), y + self.speed * math.sin(self.angle))

def create_firework_explosion():
    explosion_color = random.choice(colors)
    x = 0  # 将烟花放在屏幕中央的水平位置
    y = 0  # 将烟花放在屏幕中央的垂直位置
    for _ in range(50):  # 减少粒子数量以提高性能
        particles.append(Particle(x, y, explosion_color))
    update_fireworks()

def update_fireworks():
    global particles
    screen.update()  # 手动更新屏幕显示
    # 更新烟花粒子位置
    for particle in particles:
        particle.move()

    # 移除离开屏幕的烟花粒子
    particles = [particle for particle in particles if -width//2 <= particle.xcor() <= width//2 and -height//2 <= particle.ycor() <= height//2]

    # 产生新的烟花爆炸
    if random.random() < 0.05:  # 调整概率以控制爆炸频率
        create_firework_explosion()
    else:
        screen.ontimer(update_fireworks, 50)  # 使用ontimer来递归调用更新函数

def exit_program(x, y):
    screen.bye()

# 主逻辑
particles = []
colors = ["red", "green", "blue", "yellow", "purple", "cyan"]
screen.tracer(0)  # 关闭自动更新屏幕

screen.onclick(exit_program)  # 点击窗口时退出程序

update_fireworks()  # 开始更新烟花

turtle.done()

上述代码通过减少每次爆炸生成的粒子数量来提高性能,并且使用screen.ontimer(update_fireworks, 50)代替了死循环来控制动画的更新。

这样做不仅提高了程序的响应性,也使得通过点击窗口就可以退出程序了。

注意,虽然这些优化可以提高程序的表现,但是当屏幕上有大量粒子时,turtle模块的性能限制可能仍然会导致动画变得不够流畅。进一步的优化可能需要减少动画复杂度或者考虑使用其他更适合动画制作的库,比如Pygame。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1430592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6-let

一、基本语法 ES6 中的 let 关键字用于声明变量&#xff0c;并且具有块级作用域。 - 语法&#xff1a;let 标识符;let 标识符初始值; - 规则&#xff1a;1.不能重复声明let不允许在相同作用域内重复声明同一个变量2.不存在变量提升在同一作用域内&#xff0c;必须先声明才能试…

论文阅读-一种用于大规模分布式文件系统中基于深度强化学习的自适应元数据管理方案

名称&#xff1a; An Adaptive Metadata Management Scheme Based on Deep Reinforcement Learning for Large-Scale Distributed File Systems I. 引言 如今&#xff0c;大型集群文件系统的规模已达到PB甚至EB级别&#xff0c;由此产生的数据呈指数级增长。系统架构师不断设…

算法学习——华为机考题库7(HJ41 - HJ45)

算法学习——华为机考题库7&#xff08;HJ41 - HJ45&#xff09; HJ41 称砝码 描述 现有n种砝码&#xff0c;重量互不相等&#xff0c;分别为 m1,m2,m3…mn &#xff1b; 每种砝码对应的数量为 x1,x2,x3…xn 。现在要用这些砝码去称物体的重量(放在同一侧)&#xff0c;问能称…

STM32--揭秘中断(简易土货版)

抢占优先级响应优先级 视频学习--中断​​​​​​​

数据结构----队列(Queue)的概念、队列的使用、模拟实现队列、循环队列、模拟实现循环队列、双端队列、模拟实现双端队列

文章目录 1 概念2 队列的使用3 队列模拟实现4 循环队列4.1 循环队列 概念4.1 循环队列模拟实现 5. 双端队列 (Deque)6 用队列实现栈7 用栈实现队列 1 概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有…

会计的记账凭证

目录 一. 记账凭证的填制与审核1.1 收付款凭证1.2 转账凭证1.3 单式记账凭证 二. 记账凭证的编号 \quad 一. 记账凭证的填制与审核 \quad \quad 1.1 收付款凭证 \quad 注意︰ 凡是涉及货币资金之间收付款的业务如将库存现金存入银行或从银行提取现金等类经济业务。在实际工作中…

macOS的设置与常用软件(含IntelliJ IDEA 2023.3.2 Ultimate安装,SIP的关闭与开启)

目录 1 系统设置1.1 触控板1.2 键盘 2 软件篇2.1 [科学上网](https://justmysocks5.net/members/)2.1 [安装Chrome浏览器](https://www.google.cn/chrome/index.html)2.2 [安装utools](https://www.u.tools)2.3 [安装搜狗输入法](https://shurufa.sogou.com/)2.4 [安装snipaste…

Qt多语言翻译

Qt多语言翻译概述 Qt提供了非常简单易用的多语言翻译机制&#xff0c;其核心类为QTranslator.概括来说就是利用Qt的lupdate工具将项目中所有tr函数包裹的字符串提取到.ts文件中&#xff0c;然后使用Qt Linguist由专门的翻译人员对提取的.ts文件进行逐个单词短语的翻译工作. 翻译…

MkDocs 部署指南

简介 MkDocs 可以同时编译多个 markdown 文件&#xff0c;形成书籍一样的文件。有多种主题供你选择&#xff0c;很适合项目使用。 MkDocs 是快速&#xff0c;简单和华丽的静态网站生成器&#xff0c;可以构建项目文档。文档源文件在 Markdown 编写&#xff0c;使用单个 YAML …

绝世唐门:霍挂六个十万年魂环,一穿七灭团再现,淘汰赛顺利晋级

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《斗罗大陆2绝世唐门》第32期超前爆料&#xff0c;霍雨浩开局便释放六个十万年魂环&#xff0c;以绝对的气场碾压天灵学院代表队。首次参与高级魂师大赛&#xff0c;霍雨浩便大放异彩秀出超级霍挂&#xff0c;此等操作就连当初的唐…

2023.12 淘天-数科 已offer

文章目录 岗位信息1面ld 12.17 1H2面 VP 12.18 40min3面 HR 12.2012.21offer薪资方案沟通 岗位信息 1面ld 12.17 1H &#xff08;是一个从业估计很长时间前辈&#xff0c;很平和&#xff0c;感觉能学到很多东西&#xff09; 自我介绍项目深究1.说下自己工作里最有成就感的事和…

【用Unity开发一款横板跳跃游戏部分需要学习的技术点指南】

*** 用Unity开发一款横板跳跃游戏部分需要学习的技术点指南 空洞骑士是一款基于横板平台跳跃的传统风格2D动作冒险游戏&#xff0c;庞大的游戏世界交错相通&#xff0c;玩家控制小虫子去探索幽深黑暗的洞穴&#xff0c;成为了一代人茶余饭后的惦念&#xff0c;深受玩家喜爱。 …

Peter算法小课堂—Dijkstra最短路算法

大家好&#xff0c;我们人见人爱、花见花开、车见车爆胎的Peter Pan来啦&#xff0c;hia~hia~hia。今天&#xff0c;我们今天来学习毒瘤的最短路算法啦。啊这……什么是Dijkstra算法&#xff1f;长文警告⚠ 正经点啊 手算样例 大家思考一下&#xff0c;你在手算样例的时候&am…

MATLAB实现随机森林(RF)回归与自变量影响程度分析

本文分为两部分&#xff0c;首先是对代码进行分段、详细讲解&#xff0c;方便大家理解&#xff1b;随后是完整代码&#xff0c;方便大家自行尝试。另外&#xff0c;关于基于MATLAB的神经网络&#xff08;ANN&#xff09;代码与详细解释&#xff0c;我们将在后期博客中介绍。 1…

Redis常用数据结构与应用场景

常用数据结构 StringHashListSetZset String常用操作 String应用场景 Hash常用操作 hash应用场景 Hash结构优缺点 优点 同类数据归类整合存储,方便数据管理相比String操作消耗内存与spu更小相比string更节省空间 缺点 过期功能不能使用在field上,只用用在key上Redis集群…

Navicate 连接云服务器MySQL

Navicate 连接云服务器MySQL 1.打开Navicate,点击左上角的连接,选择MySQL 第一步:第一个页面是常规,按照图上的标注填写 第二步,点击 SSH ,进入下面的页面 第三步&#xff0c;点击测试连接

FreeRTOS任务相关的API函数

本篇文章记录我学习FreeRTOS的任务相关的API函数。主要涉及FreeRTOS的任务创建和删除函数、任务挂起和恢复函数。希望我的分享对你有所帮助。 读者如果需要实战FreeRTOS动态/静态任务创建和删除&#xff0c;可以参考以下文章&#xff1a; FreeRTOS动态 / 静态创建和删除任务-CS…

C++初阶 内存管理和模板

目录 一、new 1.1什么是new&#xff1f; 1.2为什么要有new&#xff1f; 1.3使用new 1.4 new的超级好处 二、delete 2.1什么是delete&#xff1f; 2.2为什么要有delete&#xff1f; 2.3使用delete 三、 malloc / free和new / delete的共同点和区别 四、浅谈模板 4.1什…

嵌入式学习第三篇——51单片机

目录 1&#xff0c;嵌入式系统 1&#xff0c;嵌入式系统的定义 2&#xff0c;单片机的定义 2&#xff0c;51单片机 1&#xff0c;开发环境 2&#xff0c;开发板使用的基本思路 1&#xff0c;查看原理图&#xff0c;查看芯片手册 2&#xff0c;获得调用硬件的管…

使用Arcgis对欧洲雷达高分辨率降水数据重投影

当前需要使用欧洲高分辨雷达降水数据&#xff0c;但是这个数据的投影问题非常头疼。实际的投影应该长这样&#xff08;https://gist.github.com/kmuehlbauer/645e42a53b30752230c08c20a9c964f9?permalink_comment_id2954366https://gist.github.com/kmuehlbauer/645e42a53b307…