本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。
圣诞节马上来临了,程序猿也可以有自己的圣诞树,今天我们100行python代码绘制一个圣诞树,请接收这份独属于程序猿的浪漫。
创建屏幕对象并设置背景颜色
screen = turtle.Screen()
screen.bgcolor("#000")
t = turtle.Turtle()
t.speed(0)
首先导入了 turtle 库用于绘图操作,以及 random 库用于生成随机数,这在后续绘制各种随机元素(如雪花大小、位置等)时会用到。
通过 turtle.Screen() 创建了一个屏幕对象 screen,并将其背景颜色设置为黑色("#000"),为圣诞树营造出夜晚的背景氛围。
接着创建了一个 turtle 画笔对象 t,并设置其绘制速度为最快speed(0),这样在绘图过程中可以快速呈现出完整的图形。
2. 图形绘制函数定义部分
这部分代码定义了几个用于绘制不同图形的函数,方便后续在绘制圣诞树及其装饰时调用。
2.1 box1 函数
def box1(turtle_obj, color, x, y, width, height):
"""
绘制矩形的函数
:param turtle_obj: turtle对象
:param color: 填充颜色
:param x: 矩形左上角x坐标
:param y: 矩形左上角y坐标
:param width: 矩形宽度
:param height: 矩形高度
"""
turtle_obj.penup()
turtle_obj.color(color)
turtle_obj.fillcolor(color)
turtle_obj.goto(x, y)
turtle_obj.pendown()
turtle_obj.begin_fill()
for _ in range(2):
turtle_obj.forward(width)
turtle_obj.left(90)
turtle_obj.forward(height)
turtle_obj.left(90)
turtle_obj.end_fill()
turtle_obj.setheading(0)
此函数用于绘制矩形,接受一个 turtle 对象、填充颜色以及矩形的左上角坐标、宽度和高度作为参数。
函数内部先抬起画笔 (penup),设置画笔颜色和填充颜色,移动到指定的坐标位置(goto)后再放下画笔(pendown),接着开始填充图形(begin_fill),通过循环两次来绘制矩形的四条边(每次向前移动 width 或 height 的长度,并向左旋转 90 度),绘制完成后结束填充(end_fill),最后将画笔的方向重置为默认的 0 度(朝右)。这个函数在绘制树干和树叶层时会被调用。
2.2 star 函数
def star(turtle_obj, color, x, y, size):
"""
绘制五角星的函数
:param turtle_obj: turtle对象
:param color: 填充颜色
:param x: 五角星中心x坐标
:param y: 五角星中心y坐标
:param size: 五角星边长相关尺寸
"""
turtle_obj.penup()
turtle_obj.color(color) # 设置画笔颜色和填充颜色
turtle_obj.fillcolor(color)
turtle_obj.goto(x, y)
turtle_obj.pendown()
turtle_obj.begin_fill() # 开始填充
for _ in range(5):
turtle_obj.forward(size)
turtle_obj.right(144)
turtle_obj.forward(size)
turtle_obj.end_fill() # 结束填充
turtle_obj.setheading(0) # 重置方向
该函数用于绘制五角星,参数包括 turtle 对象、填充颜色、五角星中心的坐标以及边长相关尺寸。
同样先抬起画笔,设置颜色后移动到指定坐标放下画笔,开始填充图形,然后按照五角星的绘制逻辑,通过循环五次(每次前进 size 的长度,右转 144 度,再前进 size 的长度)来绘制五角星,绘制完毕后结束填充并重置画笔方向,用于在树顶绘制星星装饰。
2.3 balls 函数
def balls(turtle_obj, color, x, y, radius):
"""
绘制圆形(装饰球)的函数
:param turtle_obj: turtle对象
:param color: 填充颜色
:param x: 圆心x坐标
:param y: 圆心y坐标
:param radius: 圆半径
"""
turtle_obj.penup()
turtle_obj.color(color)
turtle_obj.fillcolor(color)
turtle_obj.goto(x, y)
turtle_obj.pendown()
turtle_obj.begin_fill()
turtle_obj.circle(radius)
turtle_obj.end_fill()
turtle_obj.setheading(0)
这个函数用于绘制圆形,也就是圣诞树的装饰球,接收 turtle 对象、填充颜色、圆心坐标以及半径作为参数。
先进行画笔的抬起、颜色设置以及移动到圆心位置等操作,放下画笔后开始填充,使用 circle 方法绘制指定半径的圆形,填充完成后重置画笔方向,在绘制树的树叶层时会配合调用该函数来添加装饰球。
2.4 drawsnow 函数
def drawsnow():
"""
在画面中绘制雪花的函数
"""
t.hideturtle()
t.pensize(2)
for _ in range(30): # 绘制30片雪花,可根据喜好调整数量
t.pencolor("white")
t.penup()
t.setx(random.randint(-350, 350))
t.sety(random.randint(-100, 350))
t.pendown()
dens = 6
snowsize = random.randint(2, 8)
for _ in range(dens):
t.forward(int(snowsize))
t.backward(int(snowsize))
t.right(int(360 / dens))
此函数用于在画面中绘制雪花,首先隐藏画笔(hideturtle),设置画笔的粗细为 2 像素,然后通过循环来绘制多片雪花(默认绘制 30 片,可根据需要调整循环次数)。
对于每一片雪花,先将画笔颜色设置为白色(pencolor("white")),抬起画笔并随机设置其在屏幕内的 x 和 y 坐标(模拟雪花随机飘落的位置),放下画笔后,设定雪花的分支密度(dens)以及随机生成雪花分支的长度(snowsize),再通过内层循环来绘制雪花的形状,即每个分支先向前绘制一段长度,再向后退回相同长度,然后右转一定角度(根据分支密度确定角度),重复这个过程来绘制出类似雪花的形状。
3. 绘制圣诞树主体部分
# 初始化变量,用于控制树的绘制位置等
y = -100
width = 240
# 绘制树干
box1(t, "#4F4553", -15, y - 40, 30, 40)
# 构建树的主体(多层树叶和装饰球)
layer_count = 0 # 初始化层数计数器
while width > 20:
width = width - 20
height = random.randint(20, 30)
x = 0 - width / 2
# 根据层数的奇偶性选择颜色
if layer_count % 2 == 0:
ball_color = "orange"
else:
ball_color = "#fc045b"
box1(t, "#05A167", x, y, width, height)
balls(t, ball_color, x, y, 5)
balls(t, ball_color, -x, y, 5)
y = y + height
layer_count += 1 # 增加层数计数器
首先初始化了两个变量 y 和 width,y 用于控制树各部分在垂直方向上的位置,初始值为 -100,width 用于控制每层树叶的宽度,初始值为 240。
通过调用 box1 函数,使用特定的颜色和坐标、尺寸参数绘制了树干部分,树干呈现为一个矩形形状。
接着使用 while 循环来构建树的主体,即多层树叶和装饰球的部分。在每次循环中:
width 的值会减少 20,以实现每层树叶宽度逐渐递减的效果,模拟出圣诞树的层次感。
随机生成一个 height 值(范围在 20 到 30 之间)作为每层树叶的高度,计算出每层树叶的起始 x坐标(通过 0 - width / 2 来保证每层树叶在水平方向上居中)。
先后调用 box1 函数绘制绿色("#05A167")的树叶层矩形,再在该层树叶的左右两侧(通过 x 和 -x 坐标)调用 balls 函数绘制红色("#fc045b")的装饰球,最后更新 y 的值(加上当前层树叶的高度),以便下一层树叶能在正确的位置上绘制。
4. 添加装饰与文字部分
# 绘制树顶的星星
star(t, "orange", 0, y, 20)
# 写文字
t.penup()
t.color("red", "red")
t.goto(0, -250) # 调整文字位置到合适的地方,可按需修改
t.write("Merry Christmas", align="center", font=("Comic Sans MS", 40, "bold"))
t.color("white", "white")
t.goto(0, -300)
t.write("by ruzhila.cn", align="center", font=("Arial", 20,"normal"))
# 绘制雪花
drawsnow()
调用 star 函数在树顶(坐标为 (0, y),y 是经过前面绘制树叶层后到达的树顶位置)绘制一个橙色("orange")的五角星作为装饰,使圣诞树更加美观。
通过移动画笔到合适的坐标位置(goto(0, -250)),设置文字颜色为红色(color("red", "red")),使用 write 方法在画面中写上 “Merry Christmas” 的圣诞祝福语,字体设置为 Comic Sans MS,字号为 40,加粗显示,表达节日祝福。然后再移动画笔到另一个位置(goto(0, -300)),设置白色颜色,写上 “by ruzhila.cn” 字样(可能是创作者相关标识),字体为 Arial,字号为 20,正常显示,用于标注来源等信息。
最后调用 drawsnow 函数在整个画面上绘制雪花,让整个画面更具冬日氛围,仿佛雪花飘落在圣诞树上,丰富了画面的整体效果。
5. 图形展示部分
turtle.done()
这行代码用于保持图形窗口显示,使得绘制好的圣诞树以及所有装饰、文字等内容能够完整地展示在屏幕上,方便用户查看最终的绘制效果,直到手动关闭窗口为止。
大家还可以根据自己的喜好对颜色、尺寸、文字内容以及各种绘制参数进行进一步的调整和优化。
这份圣诞礼物已发放,大家快来运行一下吧
完整代码展示
import turtle
import random
# 创建屏幕对象并设置背景颜色
screen = turtle.Screen()
screen.bgcolor("#000")
t = turtle.Turtle()
t.speed(0)
# 定义绘制矩形的函数(用于绘制树干、树叶层等)
def box1(turtle_obj, color, x, y, width, height):
turtle_obj.penup()
turtle_obj.color(color)
turtle_obj.fillcolor(color)
turtle_obj.goto(x, y)
turtle_obj.pendown()
turtle_obj.begin_fill()
for _ in range(2):
turtle_obj.forward(width)
turtle_obj.left(90)
turtle_obj.forward(height)
turtle_obj.left(90)
turtle_obj.end_fill()
turtle_obj.setheading(0)
def star(turtle_obj, color, x, y, size):
turtle_obj.penup()
turtle_obj.color(color) # 设置画笔颜色和填充颜色
turtle_obj.fillcolor(color)
turtle_obj.goto(x, y)
turtle_obj.pendown()
turtle_obj.begin_fill() # 开始填充
for _ in range(5):
turtle_obj.forward(size)
turtle_obj.right(144)
turtle_obj.forward(size)
turtle_obj.end_fill() # 结束填充
turtle_obj.setheading(0) # 重置方向
# 定义绘制圆形(装饰球)的函数
def balls(turtle_obj, color, x, y, radius):
turtle_obj.penup()
turtle_obj.color(color)
turtle_obj.fillcolor(color)
turtle_obj.goto(x, y)
turtle_obj.pendown()
turtle_obj.begin_fill()
turtle_obj.circle(radius)
turtle_obj.end_fill()
turtle_obj.setheading(0)
# 定义画雪花的函数
def drawsnow():
t.hideturtle()
t.pensize(2)
for _ in range(30): # 绘制30片雪花,可根据喜好调整数量
t.pencolor("white")
t.penup()
t.setx(random.randint(-350, 350))
t.sety(random.randint(-100, 350))
t.pendown()
dens = 6
snowsize = random.randint(2, 8)
for _ in range(dens):
t.forward(int(snowsize))
t.backward(int(snowsize))
t.right(int(360 / dens))
# 初始化变量,用于控制树的绘制位置等
y = -100
width = 240
# 绘制树干
box1(t, "#4F4553", -15, y - 40, 30, 40)
# 构建树的主体(多层树叶和装饰球)
layer_count = 0 # 初始化层数计数器
while width > 20:
width = width - 20
height = random.randint(20, 30)
x = 0 - width / 2
# 根据层数的奇偶性选择颜色
if layer_count % 2 == 0:
ball_color = "orange"
else:
ball_color = "#fc045b"
box1(t, "#05A167", x, y, width, height)
balls(t, ball_color, x, y, 5)
balls(t, ball_color, -x, y, 5)
y = y + height
layer_count += 1 # 增加层数计数器
# 绘制树顶的星星
star(t, "#D9A52D", 0, y+10,20)
# 写文字
t.penup()
t.color("red", "red")
t.goto(0, -250) # 调整文字位置到合适的地方,可按需修改
t.write("Merry Christmas", align="center", font=("Comic Sans MS", 40, "bold"))
t.color("white", "white")
t.goto(0, -300)
t.write("by ruzhila.cn", align="center", font=("Arial", 20,"normal"))
# 绘制雪花
drawsnow()
turtle.done()
欢迎大家关注 入职啦 (公众号: ruzhila) ,获取更多有趣的编程挑战题和技术干货!