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

完整代码

python 复制代码
import turtle as tu
import random as ra
import math

tu.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 = -500
            self.f = ra.uniform(-3.14, 3.14)
            self.speed = ra.randint(5, 10)
            self.color = ra.choice(colors)
            self.outline = 1

    def 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 = items
            t.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 库的导入与设置
python 复制代码
import turtle as tu
import random as ra
import math

tu.setup(1.0, 1.0)
tu.screensize(1.0, 1.0)
tu.title("万圣节快乐")
tu.bgcolor('darkblue')

这里导入了turtlerandommath库。turtle用于图形绘制,random用于生成随机数,math则用于数学计算。随后设置了窗口的大小、标题和背景颜色,为绘制氛围的营造打下基础。

2.2 Bat类的定义
python 复制代码
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 移动与绘制方法
python 复制代码
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.x = ra.randint(-1000, 1000)
        self.y = -500
        self.f = ra.uniform(-3.14, 3.14)
        self.speed = ra.randint(5, 10)
        self.color = ra.choice(colors)

move方法控制蝙蝠的上下左右移动,通过正弦函数实现左右晃动的效果。蝙蝠一旦超出画布范围,就会重置其位置和属性,继续在画布内随机漂浮。

python 复制代码
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 南瓜的绘制
python 复制代码
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 动画循环
python 复制代码
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的图形编程和面向对象编程的基础知识。

写在后面

我是一只有趣的兔子,感谢你的喜欢!

相关推荐
不去幼儿园34 分钟前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
Ajiang28247353042 小时前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
幽兰的天空2 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
Theodore_10225 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou5 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
安静读书5 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
----云烟----7 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024067 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
小二·7 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic7 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端