目录
系列文章
|--------|------------------------------------------------------------------------------------------------------|
| 序号 | 直达链接 |
| 爱心系列 ||
| 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')
这里导入了turtle
、random
和math
库。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的图形编程和面向对象编程的基础知识。
写在后面
我是一只有趣的兔子,感谢你的喜欢!