Bootstrap

Python飞舞蝙蝠

目录

系列文章

写在前面

完整代码

代码分析

写在后面


系列文章

序号直达链接
爱心系列
1Python制作一个无法拒绝的表白界面
2Python满屏飘字表白代码
3Python无限弹窗满屏表白代码
4Python李峋同款可写字版跳动的爱心
5Python流星雨代码
6Python漂浮爱心代码
7Python爱心光波代码
8Python普通的玫瑰花代码
9Python炫酷的玫瑰花代码
10Python多彩的玫瑰花代码
节日系列
1Python动漫风烟花秀代码
2Python新年烟花秀代码
3Python圣诞礼物代码
4Python画圣诞树代码
5Python可爱版圣诞树丨绿色
6Python可爱版圣诞树丨粉色
7Python大雪纷飞代码
8Python生日蛋糕代码
9Python五彩气球代码
10Python国庆祝福代码
11Python万圣礼物代码
12Python愚人节礼物代码
13Python浪漫星空代码
14Python樱花树代码
动漫系列
1Python名侦探柯南
2Python喜羊羊
3Python懒羊羊
4Python沸羊羊
5Python小灰灰
6Python小香香
7Python灰太狼
8Python海绵宝宝
9Python哆啦A梦
10Python凯蒂猫
11Python猫和老鼠
12Python草莓熊
13Python迷你皮卡丘
14Python高级皮卡丘
15Python豪华皮卡丘
16Python史迪仔
17Python小熊猫
18Python蜘蛛侠
19Python可爱版蜡笔小新
20Python萌萌的蜡笔小新
21Python罗小黑
22Python猪猪侠
炫酷系列
1  Python张万森下雪了
2Python一闪一闪亮晶晶
3Python黑客帝国代码雨
4Python七彩花朵
5Python模拟3D星空
6Python金榜题名
7Python满天星

写在前面

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

写在后面

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

;