原来可以用Python代码画出这么漂亮有仙境感的樱花树 樱花

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

樱花树

在这里插入图片描述
在这里插入图片描述
了解命令说明,有利于了解源码是怎么运行的

screensize(width, height, bg=color) 设置画幕大小及颜色
setup(p1, p2) 设置画幕大小,当 p1、p2 为小数表示屏幕占比;当 p1、p2 为整数表示像素
tracer(speed) 设置绘制速度,speed越大表示绘制速度越快
penup() 起笔(可以想象成画画的时候沾墨之后提笔)
forward() 向前移动
backward() 向后移动
left(degree) 逆时针旋转 degree 度
right(degree) 顺时针旋转 degree 度
pendown() 落笔
pencolor(color) 笔墨颜色为 color
circle(r) 画一个半径为 r 的圆

源码分享

可以直接复制下面的源码去运行,不会出错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
python复制代码import turtle

from random import random
from random import randint


def draw_petal(turtle_obj, flower):
# 绘制掉落的花瓣
for i in range(int(flower)):
# 有正有负就可以让画笔往二个方向走
x = flower - 4 * flower * random()

# 花瓣整体宽度(-10, 10)
y = 10 - 20 * random()

# 提笔,向前y,左转90,走x,落笔
turtle_obj.penup()
turtle_obj.forward(y)
turtle_obj.left(90)
turtle_obj.forward(x)
turtle_obj.pendown()

# 珊瑚色
turtle_obj.pencolor("lightcoral")
# 画圆
turtle_obj.circle(1)

# 回到起点
# 提笔,后退x,右转90,后退y,落笔
turtle_obj.penup()
turtle_obj.backward(x)
turtle_obj.right(90)
turtle_obj.backward(y)
turtle_obj.pendown()


# 画树枝部分
def draw_tree(turtle_obj, branch, tree_color):
# 设置一个最小分支长度
min_branch = 4

if branch > min_branch:
if branch < 8:
# 以0.5的概率,向左、右分支
if randint(0, 1) == 0:
# 左为白色
turtle_obj.pencolor("snow")
else:
# 右为珊瑚色
turtle_obj.pencolor("lightcoral")
# 枝干
turtle_obj.pensize(branch / 2)
elif 8 <= branch <= 16:
# 以0.33的概率,分为左、中、右分支
if randint(0, 2) == 0:
# 左为白色
turtle_obj.pencolor("snow")
else:
# 中、右为珊瑚色
turtle_obj.pencolor("lightcoral")
# 树枝
turtle_obj.pensize(branch / 4)
else:
# 褐色
turtle_obj.pencolor(tree_color)
# 细枝
turtle_obj.pensize(branch / 10)

# 最开始的树干长度
turtle_obj.forward(branch)

# 随机度数因子
a = 1.5 * random()
# 顺时针旋转随机角度(0~30度)
turtle_obj.right(20 * a)

# 随机长度因子
b = 1.5 * random()
# 往右画,直到画不动为止
draw_tree(turtle_obj, branch - 10 * b, tree_color)

# 左转随机角度
turtle_obj.left(40 * a)
# 往左画,直到画不动位置
draw_tree(turtle_obj, branch - 10 * b, tree_color)

# 右转一定角度
turtle_obj.right(20 * a)
# 提笔
turtle_obj.penup()

# 递归结束回到起点
turtle_obj.backward(branch)
turtle_obj.pendown()


def get_screen(width, height, color, speed):
# 创建画幕
screen_obj = turtle.Screen()
# 画布大小:(width, height),颜色:color
screen_obj.screensize(width, height, bg=color)
screen_obj.setup(1.0, 1.0)
# speed倍加速
screen_obj.tracer(speed)

return screen_obj

# 绘制多棵树
def trees(tree_num):
# 颜色
color = ['brown', 'tan', 'black']

for j in range(tree_num):
# 树干颜色
tree_color = color[randint(0, len(color) - 1)]

# 画笔大小
pensize = randint(2, 5)
# 前进像素
forward = ((-1) ** pensize) * pensize * randint(20, 50)
# 后退像素
if pensize <= 3:
backward = ((-1) ** pensize) * (5 - pensize) * randint(10, 15)
else:
backward = pensize * randint(45, 50)

# 创建画笔
turtle_obj = turtle.Turtle()
# 画笔粗细
turtle_obj.pensize(pensize)
# 提笔,向前forward,左转90,backward,落笔
turtle_obj.penup()
turtle_obj.forward(forward)
turtle_obj.left(90)
turtle_obj.backward(backward)
turtle_obj.pendown()
# 画笔颜色:褐色
turtle_obj.pencolor(tree_color)

# 枝干粗细
branch = pensize * 15
# 落花数
flowers = branch
# 第j棵树
draw_tree(turtle_obj, branch, tree_color)
# 花瓣
draw_petal(turtle_obj, flowers)


if __name__ == '__main__':

# 创建画幕
my_screen_width = 800
my_screen_height = 600
my_screen_color = 'wheat'
my_screen_speed = 5
my_screen_obj = get_screen(my_screen_width, my_screen_height,
my_screen_color, my_screen_speed)

# 樱花树
# 棵数
my_tree_num = 5
trees(my_tree_num)

# 点击关闭画布
my_screen_obj.exitonclick()

更多有趣源码分享,可以关注我。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%