目录

系列文章

写在前面

完整代码

代码分析

写在后面


系列文章

序号 直达链接
爱心系列
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 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 库的导入与设置
    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类的定义
    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.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方法控制蝙蝠的上下左右移动,通过正弦函数实现左右晃动的效果。蝙蝠一旦超出画布范围,就会重置其位置和属性,继续在画布内随机漂浮。

    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的图形编程和面向对象编程的基础知识。

    写在后面

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

    作者:Want595

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python飞舞蝙蝠

    发表回复