Python飞舞蝙蝠

目录
系列文章
写在前面
完整代码
代码分析
写在后面
系列文章
| 序号 | 直达链接 | 
| 爱心系列 | |
| 1 | Python制作一个无法拒绝的表白界面 | 
| 2 | Python满屏飘字表白代码 | 
| 3 | Python无限弹窗满屏表白代码 | 
| 4 | Python李峋同款可写字版跳动的爱心 | 
| 5 | Python流星雨代码 | 
| 6 | Python漂浮爱心代码 | 
| 7 | Python爱心光波代码 | 
| 8 | Python普通的玫瑰花代码 | 
| 9 | Python炫酷的玫瑰花代码 | 
| 10 | Python多彩的玫瑰花代码 | 
| 节日系列 | |
| 1 | Python动漫风烟花秀代码 | 
| 2 | Python新年烟花秀代码 | 
| 3 | Python圣诞礼物代码 | 
| 4 | Python画圣诞树代码 | 
| 5 | Python可爱版圣诞树丨绿色 | 
| 6 | Python可爱版圣诞树丨粉色 | 
| 7 | Python大雪纷飞代码 | 
| 8 | Python生日蛋糕代码 | 
| 9 | Python五彩气球代码 | 
| 10 | Python国庆祝福代码 | 
| 11 | Python万圣礼物代码 | 
| 12 | Python愚人节礼物代码 | 
| 13 | Python浪漫星空代码 | 
| 14 | Python樱花树代码 | 
| 动漫系列 | |
| 1 | Python名侦探柯南 | 
| 2 | Python喜羊羊 | 
| 3 | Python懒羊羊 | 
| 4 | Python沸羊羊 | 
| 5 | Python小灰灰 | 
| 6 | Python小香香 | 
| 7 | Python灰太狼 | 
| 8 | Python海绵宝宝 | 
| 9 | Python哆啦A梦 | 
| 10 | Python凯蒂猫 | 
| 11 | Python猫和老鼠 | 
| 12 | Python草莓熊 | 
| 13 | Python迷你皮卡丘 | 
| 14 | Python高级皮卡丘 | 
| 15 | Python豪华皮卡丘 | 
| 16 | Python史迪仔 | 
| 17 | Python小熊猫 | 
| 18 | Python蜘蛛侠 | 
| 19 | Python可爱版蜡笔小新 | 
| 20 | Python萌萌的蜡笔小新 | 
| 21 | Python罗小黑 | 
| 22 | Python猪猪侠 | 
| 炫酷系列 | |
| 1 | Python张万森下雪了 | 
| 2 | Python一闪一闪亮晶晶 | 
| 3 | Python黑客帝国代码雨 | 
| 4 | Python七彩花朵 | 
| 5 | Python模拟3D星空 | 
| 6 | Python金榜题名 | 
| 7 | Python满天星 | 
写在前面
Python实现万圣节蝙蝠的完整代码。
- PyCharm
 - python3.11.4
 - pyinstaller6.2.0
 
完整代码 
 
import turtle as tu
import random as ra
import mathtu.setup(1.0, 1.0)
tu.screensize(1.0, 1.0)
tu.title("万圣节快乐")
tu.bgcolor('darkblue')
t = tu.Pen()
t.ht()
colors = ['black']class Bat():  # 每个蝙蝠(蝙蝠类)def __init__(self):self.k = ra.uniform(0.1, 0.3)  # 蝙蝠的半径self.r = 1  # 南瓜的半径self.x = ra.randint(-1000, 1000)  # 蝙蝠的横坐标self.y = ra.randint(-500, 500)  # 蝙蝠的纵坐标self.f = ra.uniform(-3.14, 3.14)  # 蝙蝠左右移动呈正弦函数self.speed = ra.randint(5, 10)  # 蝙蝠移动速度self.color = ra.choice(colors)  # 蝙蝠的颜色self.outline = 1  # 蝙蝠的外框大小(可不要)def move(self):  # 蝙蝠移动函数if self.y <= 500:  # 当蝙蝠还在画布中时self.y += self.speed  # 设置上下移动速度self.x += self.speed * math.sin(self.f)  # 设置左右移动速度self.f += 0.1  # 可以理解成标志,改变左右移动的方向else:  # 当蝙蝠漂出了画布时,重新生成一个蝙蝠self.k = ra.uniform(0.1, 0.3)self.r = 1  # 南瓜的半径self.x = ra.randint(-1000, 1000)self.y = -500self.f = ra.uniform(-3.14, 3.14)self.speed = ra.randint(5, 10)self.color = ra.choice(colors)self.outline = 1def bat(self):  # 画蝙蝠函数,就是用turtle画蝙蝠t.penup()t.goto(self.x, self.y)t.pendown()t.pencolor(self.color)t.pensize(1)t.begin_fill()t.fillcolor(self.color)t.forward(self.k * 10)t.setheading(75)t.forward(self.k * 35)t.setheading(-75)t.forward(self.k * 55)t.setheading(0)t.circle(self.k * 40, 90)t.right(90)t.forward(self.k * 100)t.left(180)t.circle(self.k * 100, 90)t.setheading(180)t.circle(self.k * 70, 90)t.left(180)t.circle(self.k * 70, 90)t.right(90)t.circle(self.k * 100, 90)t.right(180)t.forward(self.k * 100)t.right(90)t.circle(self.k * 40, 90)t.setheading(75)t.forward(self.k * 55)t.setheading(-75)t.forward(self.k * 35)t.setheading(0)t.forward(self.k * 10)t.end_fill()def pumpkin(self):# 画南瓜t.penup()t.goto(250 * self.r, 30 * self.r)t.pendown()t.seth(90)t.begin_fill()for j in range(25):t.fd(j * self.r)t.left(3.6)for j in range(25, 0, -1):t.fd(j * self.r)t.left(3.6)t.seth(-90)t.circle(254 * self.r, 180)t.end_fill()# 眼睛eyes_items = [(-60, 230, 0), (60, -50, 1)]for items in eyes_items:position, angle, direction = itemst.pensize(6)t.penup()t.goto(position * self.r, 0)t.pendown()t.color('yellow', 'yellow')t.begin_fill()t.seth(angle)for j in range(55):t.fd(3 * self.r)if direction:t.left(3)  # 左转3度else:t.right(3)  # 右转3度t.goto(position * self.r, 0)t.end_fill()# 鼻子t.penup()t.goto(0, 0)t.seth(180)t.pendown()t.begin_fill()t.circle(50 * self.r, steps=3)t.end_fill()# 嘴巴t.color('#F9D503', '#F9D503')t.pensize(6)t.penup()t.goto(-150 * self.r, -100 * self.r)t.pendown()t.begin_fill()t.seth(-30)t.fd(100 * self.r)t.left(90)t.fd(30 * self.r)t.right(90)t.fd(60 * self.r)t.left(60)t.fd(60 * self.r)t.right(90)t.fd(30 * self.r)t.left(90)t.fd(100 * self.r)t.end_fill()# 南瓜枝t.penup()t.goto(0, 180 * self.r)t.pendown()t.color('#2E3C01')t.seth(100)t.pensize(25)t.circle(60 * self.r, 100)Bats = []  # 用列表保存所有蝙蝠
for i in range(100):Bats.append(Bat())while True:  # 开始漂浮tu.tracer(0)t.clear()# Bats[0].pumpkin()for i in range(50):  # 在画布中设置50个漂浮的蝙蝠Bats[i].move()Bats[i].bat()tu.update()
 
代码分析
这段代码是用Python的turtle模块绘制一个万圣节主题的动画效果:漂浮的蝙蝠和南瓜。
代码第1-4行导入了必要的模块。turtle模块用于绘图,random模块用于生成随机数,math模块用于数学计算。
第6-8行设置了绘图窗口的大小和标题,以及背景颜色。
第10行创建了一个画笔对象t。
第11行定义了一个颜色列表colors,用于随机选择蝙蝠的颜色。
第13-39行定义了一个蝙蝠类Bat。该类具有以下属性和方法:
-  
初始化方法__init__():初始化蝙蝠的半径、南瓜半径、坐标、移动速度、颜色等属性。
 -  
移动方法move():根据蝙蝠的速度和方向,更新蝙蝠的坐标。
 -  
画蝙蝠方法bat():根据蝙蝠的属性,使用turtle模块绘制一个蝙蝠的图形。
 -  
画南瓜方法pumpkin():使用turtle模块绘制一个南瓜的图形。
 
第41行创建一个空的列表Bats用于保存所有蝙蝠。
第42-47行使用循环创建100个蝙蝠对象,并将它们添加到列表Bats中。
第49行开始一个无限循环,用于让蝙蝠漂浮:
-  
使用tu.tracer(0)关闭绘图的动画效果,加快绘图速度。
 -  
使用t.clear()清空画布。
 -  
使用循环依次调用每个蝙蝠对象的move()和bat()方法,实现蝙蝠的移动和绘制。
 -  
使用tu.update()更新画布,显示最新的绘图结果。
 
通过以上代码,可以实现一个漂浮的蝙蝠和南瓜的动画效果,以下是对这段代码的详细分析。
1. 代码结构概述
这段代码使用了类和对象的概念来创建蝙蝠,具体实现了蝙蝠的移动和绘制功能,并通过无限循环持续更新画面。主要分为以下几个部分:
-  
库的导入和基本设置:导入Turtle和随机库,设置窗口标题、背景颜色及画布大小。
 -  
Bat类:定义了蝙蝠的属性和行为,包括初始化位置、速度、颜色等,以及绘制蝙蝠和南瓜的具体方法。
 -  
蝙蝠的移动和绘制:实现蝙蝠的上下左右运动,并绘制蝙蝠的形状。
 -  
动画循环:通过无限循环更新画面,展示蝙蝠的运动。
 
2. 细节分析
2.1 库的导入与设置
import turtle as tu
import random as ra
import mathtu.setup(1.0, 1.0)
tu.screensize(1.0, 1.0)
tu.title("万圣节快乐")
tu.bgcolor('darkblue') 
这里导入了turtle、random和math库。turtle用于图形绘制,random用于生成随机数,math则用于数学计算。随后设置了窗口的大小、标题和背景颜色,为绘制氛围的营造打下基础。
2.2 Bat类的定义
class Bat():def __init__(self):self.k = ra.uniform(0.1, 0.3)  # 蝙蝠的半径self.r = 1  # 南瓜的半径self.x = ra.randint(-1000, 1000)  # 蝙蝠的横坐标self.y = ra.randint(-500, 500)  # 蝙蝠的纵坐标self.f = ra.uniform(-3.14, 3.14)  # 蝙蝠左右移动呈正弦函数self.speed = ra.randint(5, 10)  # 蝙蝠移动速度self.color = ra.choice(colors)  # 蝙蝠的颜色self.outline = 1  # 蝙蝠的外框大小(可不要) 
构造函数__init__定义了蝙蝠的初始属性,包括随机生成的半径、位置、速度和颜色。这使得每只蝙蝠都有独特的外观和运动轨迹。
2.3 移动与绘制方法
def move(self):if self.y <= 500:self.y += self.speedself.x += self.speed * math.sin(self.f)self.f += 0.1else:self.k = ra.uniform(0.1, 0.3)self.x = ra.randint(-1000, 1000)self.y = -500self.f = ra.uniform(-3.14, 3.14)self.speed = ra.randint(5, 10)self.color = ra.choice(colors) 
move方法控制蝙蝠的上下左右移动,通过正弦函数实现左右晃动的效果。蝙蝠一旦超出画布范围,就会重置其位置和属性,继续在画布内随机漂浮。
def bat(self):t.penup()t.goto(self.x, self.y)t.pendown()t.pencolor(self.color)t.pensize(1)t.begin_fill()t.fillcolor(self.color)# 绘制蝙蝠的形状t.end_fill() 
bat方法绘制蝙蝠的形状,利用Turtle库的绘图功能,通过路径的设置和填充颜色,实现了蝙蝠的视觉效果。
2.4 南瓜的绘制
def pumpkin(self):t.penup()t.goto(250 * self.r, 30 * self.r)t.pendown()t.seth(90)t.begin_fill()# 绘制南瓜t.end_fill() 
pumpkin方法负责绘制南瓜的形状和特征(如眼睛、鼻子和嘴巴),使用循环和角度变化绘制出南瓜的圆滑形状,并通过不同的颜色和尺寸使南瓜显得更加生动。
2.5 动画循环
while True:tu.tracer(0)t.clear()for i in range(50):Bats[i].move()Bats[i].bat()tu.update() 
在无限循环中,首先关闭Turtle的自动绘图(tu.tracer(0)),然后清空之前的绘制,接着对前50只蝙蝠进行位置更新和绘制。tu.update()用于手动更新绘图,使得动画效果更加流畅。
3. 总结
这段代码通过类和对象的设计,有效地实现了蝙蝠和南瓜的绘制及动画效果。每只蝙蝠具有独特的随机属性,使得动画呈现出多样化的效果。代码结构清晰,逻辑分明,通过方法的划分,使得功能模块化,便于维护和扩展。总的来说,这段代码成功地展示了万圣节的主题,适合用于学习Python的图形编程和面向对象编程的基础知识。
写在后面
我是一只有趣的兔子,感谢你的喜欢!
相关文章:
Python飞舞蝙蝠
目录 系列文章 写在前面 完整代码 代码分析 写在后面 系列文章 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码…...
shodan搜索引擎——土豆片的网安之路
工作原理: 在服务器上部署了各种扫描器,如漏洞扫描器,硬件扫描器,目录扫描器等等,24小时不停的扫描,批量对IP地址扫描 优点:方便,很快得到最新扫描结果,漏洞信息 缺点…...
uniapp 报错Invalid Host header
前言 在本地使用 nginx 反向代理 uniapp 时,出现错误 Invalid Host header 错误原因 因项目对 hostname 进行检查,发现 hostname 不是预期的,所以,报错 Invalid Host header 。 解决办法 这样做是处于安全考虑。但࿰…...
删除 AzureArcSetup 安装程序及提示
删除 AzureArcSetup 安装程序及提示 文章目录 删除 AzureArcSetup 安装程序及提示一、基础环境二、适用场景三、过程和方法 版权声明:本文为CSDN博主「杨群」的原创文章,遵循 CC 4.0 BY-SA版权协议,于2024年10月31日首发于CSDN,转…...
NGPT:在超球面上进行表示学习的归一化 Transformer
在超球面上进行表示学习的归一化 Transformer 1. 研究背景2. nGPT 的核心贡献超球面上的网络参数优化作为超球面上的变度量优化器更快的收敛速度 3. 从 GPT 到 nGPT 的演变标记嵌入和输出逻辑 层和块自注意力块MLP 块有效学习率在 ADAM 中的应用总结 4. 实验结果训练加速网络参…...
云原生Istio基础
一.Service Mesh 架构 Service Mesh(服务网格)是一种用于处理服务到服务通信的专用基础设施层。它的主要目的是将微服务之间复杂的通信和治理逻辑从微服务代码中分离出来,放到一个独立的层中进行管理。传统的微服务架构中&#x…...
Word2Vec优化与提升技巧
随着自然语言处理领域的快速发展,Word2Vec 已成为常见的词向量生成工具。然而,单纯依赖默认设置往往不能在实际业务需求中取得最佳效果。通过调整模型的参数、优化算法以及合理处理大规模语料库,可以显著提升模型的表现和效率,适应复杂的应用场景。这篇文章将带你深入了解 …...
Java 开发——(下篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus
上篇速递 - Spring Boot 3 MybatisPlus 五、静态资源访问 1. 基础配置 在 Spring Boot 中访问静态资源非常方便。Spring Boot 默认支持从以下位置加载静态资源: /META-INF/resources//resources//static//public/ 这些目录下的文件可以直接通过 URL 访问。 例…...
Redis 线程控制 问题
前言 相关系列 《Redis & 目录》《Redis & 线程控制 & 源码》《Redis & 线程控制 & 总结》《Redis & 线程控制 & 问题》 参考文献 《Redis分布式锁》 Redis如何实现分布式锁? Redis是单进程单线程的,指令执行时不会…...
005 IP地址的分类
拓扑结构如下 两台主机处于同一个网关下,通过ping命令检测,可以连通 &nbps; 拓扑结构如下 使用ping 检查两台电脑是否相通, 因为网络号不一样,表示两台电脑不在同一个网络,因此无法连通 拓扑结构如下 不在同一网络的PC要相…...
Java 并发工具(12/30)
目录 Java 并发工具 1. Executor 框架 1.1 线程池 1.2 ExecutorService 和 Future 2. 同步辅助类 2.1 CountDownLatch 2.2 Semaphore 3. 并发集合 3.1 ConcurrentHashMap 总结与后续 Java 并发工具 在多线程编程中,高效管理线程和任务至关重要。Java 提供…...
filebeat+elasticsearch+kibana日志分析
1 默认配置 1.1 filebeat filebeat-7.17.yml,从网关中下载k8s的配置,指定es和kibana的配置 通过kibana查询可以查询到日志了,但此时还不知道具体怎么用。 1.2 kibana 在Discover中创建索引格式:filebeat-*,得到如下图…...
Google Recaptcha V2 简单使用
最新的版本是v3,但是一直习惯用v2,就记录一下v2 的简单用法,以免将来忘记了 首先在这里注册你域名,如果是本机可以直接直接填 localhost 或127.0.0.1 https://www.google.com/recaptcha/about/ 这是列子 网站密钥:是…...
Rust编程中的浮点数比较
缘由:在看Rust编写的代码,发现了一行浮点数等于比较的代码,于是编辑如下内容。 在Rust中,进行浮点数比较时需要特别小心,因为浮点数由于精度限制无法精确表示小数,可能会导致直接比较(如 &…...
java访问华为网管软件iMaster NCE的北向接口
最近做的一个项目,需要读取华为一个叫iMaster NCE的网管软件的北向接口。这个iMaster NCE(以下简称NCE)用于管理项目的整个网络,尤其是光网络。业主要求我们访问该软件提供的对外接口,读取一些网络信息,比如…...
UV紫外相机
在产业设备领域,运用相机进行检测的需求很大,应用也很多样,对于图像传感器性能的期望逐年提升。在这样的背景下,可拍摄紫外线(UV:Ultra Violet)图像的相机拥有越来越广泛的应用场景。将UV照明和…...
第十八届联合国世界旅游组织/亚太旅游协会旅游趋势与展望大会在广西桂林开幕
10月19日,第十八届联合国世界旅游组织/亚太旅游协会旅游趋势与展望大会(以下简称“大会”)在广西桂林开幕,来自美国、英国、德国、俄罗斯、柬埔寨等25个国家约120名政府官员、专家学者和旅游业界精英齐聚一堂,围绕“亚洲及太平洋地区旅游业&a…...
Effective Java(第三版) _ 创建和销毁对象
一、前言 《Effective Java》 这本书,在刚从事 Java 开发的时候就被老师推荐阅读过,当时囫囵吞枣的看了一部分,不是特别的理解,也就搁置了,现在已经更新到第三版了,简单翻阅了一下,发现有些条例…...
你的EA无法运行的几种常见原因
大多数情况下,EA正常运行是指其能够自动开仓交易,毕竟EA的主要目的是根据某种策略自动进行交易。如果从网上下载或其他途径获得的EA在开始时能够正常交易,但在修改参数后却不再交易,可能的问题是什么呢?下面列举了一些…...
通过自定义指令实现图片懒加载
前提:使用到了VueUse插件。 先创建自定义插件文件夹 // 定义懒加载插件 import { useIntersectionObserver } from vueuse/core // 这个是VueUse里的一个方法export const lazyPlugin {install(app) {// 懒加载指令逻辑 定义全局指令app.directive(img-lazy, {mo…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
