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的图形编程和面向对象编程的基础知识。
写在后面
我是一只有趣的兔子,感谢你的喜欢!