目录
系列文章
写在前面
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')
这里导入了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.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的图形编程和面向对象编程的基础知识。
写在后面
我是一只有趣的兔子,感谢你的喜欢!