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

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 particlesscreen.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.mzph.cn/news/664846.shtml

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

相关文章

STM32控制DHT11温湿度传感器模块获取温湿度数据

时间记录&#xff1a;2024/1/29 一、DHT11引脚介绍 &#xff08;1&#xff09;VCC&#xff1a;电源引脚&#xff0c;3.3-5.5V &#xff08;2&#xff09;DATA&#xff1a;数据输入输出引脚 &#xff08;3&#xff09;NC&#xff1a;保留引脚&#xff0c;悬空即可 &#xff08;…

颐和园龙纹珍宝展亮相,文物预防保护科技护航

在皇家园林颐和园的深处&#xff0c;一场独特的文化盛宴正静静上演。2月1日&#xff0c;“祥龙贺岁—颐和园藏龙纹题材文物特展”在德和园华丽揭幕。此次特展汇聚了66件珍贵文物&#xff0c;包括玉器、瓷器、书画、珐琅、家具等&#xff0c;每一件都是颐和园园藏的瑰宝。这些文…

clickhouse如何清除多个分区数据 alter table drop partition操作

官网drop partition操作 官网链接&#xff1a;https://clickhouse.com/docs/zh/sql-reference/statements/alter/partition#drop-partitionpart 官网上之有清除单个分区的例子&#xff0c;并没有对清除多个分区的场景进行描述&#xff0c;之前清除分区时也是按照官网例子进行…

【Python】【完整代码】解析Excel文件内容,按每列首行元素名打印出某个字符串的统计占比(超详细)

目录 1.示例&#xff1a; 1.1 实现代码1&#xff1a;列数为常量 运行结果&#xff1a; 1.2 实现代码2&#xff1a;列数为变量 运行结果&#xff1a; 1.示例&#xff1a; 开发需求&#xff1a;读取Excel文件&#xff0c;统计第3列到第5列中每列的"False"字段占…

【新书推荐】5.1节 16位汇编语言学习环境

第五章 16位汇编学习环境 16位汇编语言的学习环境是建立在8086计算机的基础上的&#xff0c;我将借助于DosBox虚拟机来实现16位汇编语言学习环境的搭建。 5.1节 16位汇编语言学习环境 本节内容&#xff1a;16位汇编学习环境的搭建。 ■汇编语言程序设计编程调试过程&#xff1…

【React】react组件传参

【React】react组件传参 一、props&#xff1a;父组件向子组件传参1、将普通的参数作为props传递2、将jsx作为props传递&#xff08;组件插槽&#xff09; 二、自定义事件&#xff1a;子父组件向父组件传参三、context进行多级组件传参四、redux全局状态管理 一、props&#xf…

MySQL篇----第四篇

系列文章目录 文章目录 系列文章目录前言一、数据库的三范式是什么二、第一范式(1st NF - 列都是不可再分)三、第二范式(2nd NF- 每个表只描述一件事情)四、第三范式(3rd NF- 不存在对非主键列的传递依赖)五、数据库是事务前言 前些天发现了一个巨牛的人工智能学习网站,通…

C++迷宫游戏详解

个人主页&#xff1a;[PingdiGuo_guo] 收录专栏&#xff1a;[C干货专栏] 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习用C实现一个迷宫游戏。 目录 1.迷宫的具体步骤 1.1.迷宫的初始化 1.2.寻路算法 1.DFS算法 2.BFS算法 1.3.移动 2.总结 C迷宫游…

Javascript入门:第三个知识点:javascript里的数据类型、运算符

数字类型 123 //整数 123.1 //浮点数 1.123e3 //科学计数法 -10 //负数 NaN //not a number Infinity //无限大 以上的类型在javascript里都是数字类型 字符串类型 在开始之前&#xff0c;我需要先说明白两个知识点&#xff1a; console.log()是啥&#xff1f; let 与 v…

【C++初阶】C++入门(2)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、函数重载1.1 函数重载的概念1.2 函数重载的种类1.3 C支持函数重载的原理 二…

计算机网络——链路层(1)

计算机网络——链路层&#xff08;1&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c; [跳转到网站](https://www.captainbed.…

C语言第十七弹---指针(一)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1、内存和地址 1.1、内存 2、指针变量和地址 2.1、取地址操作符&#xff08;&&#xff09; 2.2、指针变量和解引用操作符&#xff08;*&#xff09;…

Tiktok东南亚商家如何通过直播活动提高直播流量和转化率?

一、什么是直播活动? 直播活动是帮助卖家在直播中有效推广商品和店铺的促销活动。 您报名参加直播活动后&#xff0c;您的直播将以活动品牌的形式突出展示。 您可以同时参与商品活动和直播活动&#xff0c;在直播中给买家提供超值优惠。 如何参加直播活动? 二、如何准备直…

[SWPUCTF 2021 新生赛]include

他让我们传入一个flag值 我们传入即可看到代码部分 传入一个php的伪类即可 得到经过Base64加密的flag&#xff0c;解密即可

Python基础知识:Python注释及print函数、input函数

在Python中&#xff0c;注释是对相应代码的解释&#xff0c;以增加代码的可读性&#xff0c;让用户能够更好地理解相应代码的含义。注释通过在相应代码后面加上“#”号来实现。比如以下代码 data.describe()#对数据集进行描述性分析 其中data.describe()为需要被执行的代码&a…

LED点阵屏(基于51单片机)

师从江科大 LED点阵屏 LED点阵屏由若干个独立的LED组成&#xff0c;LED以矩阵的形式排列&#xff0c;以灯珠亮灭来显示文字、图片、视频等。 LED点阵屏分类 按颜色&#xff1a;单色、双色、全彩 按像素&#xff1a;8*8、16*16等&#xff08;大规模的LED点阵通常由很多个…

MySQL原理(三)锁定机制(2)表锁行锁与页锁

前面提到&#xff0c;mysql锁按照操作颗粒分类&#xff0c;一般认为有表级锁、行级锁、页面锁三种。其实还有一种特殊的全局锁。 锁场景问题全局锁全库逻辑备份加了全局锁之后&#xff0c;整个数据库都是【只读状态】&#xff0c;如果数据库里有很多数据&#xff0c;备份就会花…

BUUCTF-Real-ThinkPHP]5.0.23-Rce

漏洞介绍 这个版本容易存在我们都喜欢的rce漏洞&#xff01; 网站为了提高访问效率往往会将用户访问过的页面存入缓存来减少开销。而Thinkphp 在使用缓存的时候是将数据序列化&#xff0c;然后存进一个 php 文件中&#xff0c;这使得命令执行等行为成为可能&#xff01; ThinkP…

Springboot 自定义参数配置化,密钥,密码,文件保存路径

application.properties 和 application.yml 都是一样的配置方法&#xff0c;只是格式不一样 定义配置文件 server.port8080 image.save.pathE:\ #自定义文件保存路径读取配置文件 Value("${image.save.path}")private String filePath;//E:\优化配置文件 如果我参…

HashMap的扩容机制

HashMap简介 HashMap在底层数据结构上采用了数组&#xff0b;链表&#xff0b;红黑树&#xff0c;通过散列映射来存储键值对数据因为在查询上使用散列码&#xff08;通过键生成一个数字作为数组下标&#xff0c;这个数字就是hash code&#xff09;所以在查询上的访问速度比较快…