背景
最近看到很多機構在推動“青少年編程能力等級標準”的制定以及相關考試的測評,看樣子今年年底這個事情就能夠確定,明天上半年在一些大中城市就會全面鋪開。
我最近了解了一些關於“編程貓”和“學而思”在制定標準上的思路,其主要使用的語言爲 Scratch 和 Python。自己在培訓小孩子編程方面也有一些經驗,由於小孩子專注的時間有限,所以需要用直觀形象的方式引導他們理解編程思維。
Scratch 主要針對的是幼稚園大班以及一二年級的孩子,三年級以上就可以學習Python了,利用 Python 讓小孩子掌握編程思維最好圍繞 Turtle 庫來展開。
Turtle 最早來自於 LOGO 語言,是專門用於小孩子學習編程的,通過編程模擬一隻 turtle(海龜)在畫板上爬行繪製圖案,後來很多高級語言都移植了海龜繪圖,python 從2.6之後也將 turtle 庫加入了其內部庫中。
技術分析
利用 turtle 庫,即可以繪製簡單的圖形,也可以通過 分形幾何 的方式繪製非常複雜的圖案。我在網上找了幾段繪製櫻花樹的代碼,大家感覺一下。有基礎的家長可以在空閒的時候,學習一下來慢慢培養小孩子的編程思維。
動態生成櫻花
飄落效果
暗色效果
代碼實現
動態生成櫻花代碼
import turtle as T
import random
import time
# 畫櫻花的軀幹(60,t)
def Tree(branch, t):
time.sleep(0.0005)
if branch > 3:
if 8 <= branch <= 12:
if random.randint(0, 2) == 0:
t.color('snow') # 白
else:
t.color('lightcoral') # 淡珊瑚色
t.pensize(branch / 3)
elif branch < 8:
if random.randint(0, 1) == 0:
t.color('snow')
else:
t.color('lightcoral') # 淡珊瑚色
t.pensize(branch / 2)
else:
t.color('sienna') # 赭(zhě)色
t.pensize(branch / 10) # 6
t.forward(branch)
a = 1.5 * random.random()
t.right(20 * a)
b = 1.5 * random.random()
Tree(branch - 10 * b, t)
t.left(40 * a)
Tree(branch - 10 * b, t)
t.right(20 * a)
t.up()
t.backward(branch)
t.down()
# 掉落的花瓣
def Petal(m, t):
for i in range(m):
a = 200 - 400 * random.random()
b = 10 - 20 * random.random()
t.up()
t.forward(b)
t.left(90)
t.forward(a)
t.down()
t.color('lightcoral') # 淡珊瑚色
t.circle(1)
t.up()
t.backward(a)
t.right(90)
t.backward(b)
# 繪圖區域
t = T.Turtle()
# 畫布大小
w = T.Screen()
t.hideturtle() # 隱藏畫筆
t.getscreen().tracer(5, 0)
w.screensize(bg='wheat') # wheat小麥
t.left(90)
t.up()
t.backward(150)
t.down()
t.color('sienna')
# 畫櫻花的軀幹
Tree(60, t)
# 掉落的花瓣
Petal(200, t)
w.exitonclick()
飄落效果代碼
from turtle import *
from random import *
from math import *
def tree(n, l):
pd() # 下筆
# 陰影效果
t = cos(radians(heading() + 45)) / 8 + 0.25
pencolor(t, t, t)
pensize(n / 3)
forward(l) # 畫樹枝
if n > 0:
b = random() * 15 + 10 # 右分支偏轉角度
c = random() * 15 + 10 # 左分支偏轉角度
d = l * (random() * 0.25 + 0.7) # 下一個分支的長度
# 右轉一定角度,畫右分支
right(b)
tree(n - 1, d)
# 左轉一定角度,畫左分支
left(b + c)
tree(n - 1, d)
# 轉回來
right(c)
else:
# 畫葉子
right(90)
n = cos(radians(heading() - 45)) / 4 + 0.5
pencolor(n, n * 0.8, n * 0.8)
circle(3)
left(90)
# 添加0.3倍的飄落葉子
if (random() > 0.7):
pu()
# 飄落
t = heading()
an = -40 + random() * 40
setheading(an)
dis = int(800 * random() * 0.5 + 400 * random() * 0.3 + 200 * random() * 0.2)
forward(dis)
setheading(t)
# 畫葉子
pd()
right(90)
n = cos(radians(heading() - 45)) / 4 + 0.5
pencolor(n * 0.5 + 0.5, 0.4 + n * 0.4, 0.4 + n * 0.4)
circle(2)
left(90)
pu()
# 返回
t = heading()
setheading(an)
backward(dis)
setheading(t)
pu()
backward(l) # 退回
bgcolor(0.5, 0.5, 0.5) # 背景色
ht() # 隱藏turtle
speed(0) # 速度 1-10漸進,0 最快
tracer(0, 0)
pu() # 擡筆
backward(100)
left(90) # 左轉90度
pu() # 擡筆
backward(300) # 後退300
tree(12, 100) # 遞歸7層
done()
暗色效果代碼
from turtle import *
from random import *
from math import *
def tree(n, l):
pd()
t = cos(radians(heading() + 45)) / 8 + 0.25
pencolor(t, t, t)
pensize(n / 4)
forward(l)
if n > 0:
b = random() * 15 + 10
c = random() * 15 + 10
d = l * (random() * 0.35 + 0.6)
right(b)
tree(n - 1, d)
left(b + c)
tree(n - 1, d)
right(c)
else:
right(90)
n = cos(radians(heading() - 45)) / 4 + 0.5
pencolor(n, n, n)
circle(2)
left(90)
pu()
backward(l)
bgcolor(0.5, 0.5, 0.5)
ht()
speed(0)
tracer(0, 0)
left(90)
pu()
backward(300)
tree(13, 100)
done()
總結
是不是很有意思,簡單的代碼就可以繪製出很絢爛的圖形,讓小孩子感受到寫代碼的樂趣,家長們通過設計一道道進階的關卡,類似於我們玩遊戲過關的方式,讓小孩子們產生心流體驗。慢慢就會愛上編程。今天就到這裏吧!See You!
參考文獻
- https://blog.csdn.net/weixin_44078196/article/details/100656515
- https://blog.csdn.net/weixin_43943977/article/details/102691392
相關圖文: