1. 程式人生 > >用Python的Turtle庫繪製森林

用Python的Turtle庫繪製森林

這是由一個小作業引發的對Python的Turtle庫的學習

下面是官方手冊:

1.配置程式設計環境

由於現在的筆記本是臨時借的,程式設計環境不是熟悉的環境,又由於種種原因沒有安裝成功Anaconda,就嘗試了下其他的IDE:

最早接觸的Enthought Canopy跑示例程式時各種報錯無法解決(Python Kernal Crashed);

最著名的Python IDE時JetBeans的Pycharm,裝好以後啥都沒跑就佔了1G記憶體(雖然舍友電腦上的沒問題);

好在之前裝了Notepad++,可以結合原始版本的Python進行簡單的程式設計,具體配置方法參考了下面這篇博文:

PS:還嘗試了用pip安裝jupyter等,發現沒有VS2008的支援無法編譯一部分檔案,改變python的編譯器也沒效果,只好放棄 = =(反正不是自己電腦hhh)

2.Turtle繪製森林程式碼

這段程式碼結合了隨機函式來使森林更多樣化,同時設定了顏色的漸變。幾乎每句都有註釋,還有不懂的函式可以到官方手冊查 另外老師的示例中的yield語句和pass語句的用法非常精髓,可以再研究一下
# -*- coding: utf-8 -*-
from turtle import Turtle, mainloop
from time import clock
import random

def tree(plist, l, a, f):
    """ 
    plist 是turtle箭頭的列表
    l 是初始樹枝的長度
    a 是兩根樹枝之間夾角的一半
    f 是每層樹枝之間長度的因數.
    """
    r = random.randint(2,3)
    if l > 3:
        lst = []
        for p in plist:
            if l < 50:
                p.color(34,int(200-3*l),34)
                p.pensize(3)
            p.forward(l)
            #沿當前方向前進l
            q = p.clone()
            #建立一個副本
            if(r==3):
                m = p.clone()
                m.left(random.randint(-5,5))
                lst.append(m)
            p.left(a+random.randint(-10,10))
            #原本左轉a度
            q.right(a+random.randint(-10,10))
            #副本右轉a度
            lst.append(p)
            lst.append(q)
            #將p,q分別加到列表後
        for x in tree(lst, l*f, a, f):
            yield None
def maketree(l,a,f,x,y):
    '''這個函式用來初始化箭頭的引數
    l 是初始樹枝的長度
    a 是兩根樹枝之間夾角的一半
    f 是每層樹枝之間長度的因數
    x和y是樹根位置,(0,0)在螢幕中心
    '''
    p = Turtle()                
    #建立一個Turtle類的物件
    p.getscreen().colormode(255)
    # 獲得螢幕控制代碼,可以對其進行操作
    #顏色模式改為255,可以使用RGB顏色
    p.pencolor(139,69,19)
    #p.color('brown')            
    #Turtle的顏色為棕色
    p.pensize(6)
    #筆的大小為6
    p.setundobuffer(None)       
    #不設定撤銷緩衝區
    p.hideturtle()              
    #隱藏箭頭
    p.speed(0)                  
    #設定速度,0-10,0是最快的
    p.getscreen().tracer(5000,0)
    # 獲得螢幕控制代碼,可以對其進行操作
    # 每5000次操作將螢幕重新整理,延時為0
    p.left(90)
    # 將Turtle的前進方向左轉90度,使方向豎直向上
    p.penup()
    # 把筆擡起來
    p.goto(x,y)
    #p.forward(-210)
    # 筆向前移動-210個單位(向後移動210個畫素)
    p.pendown()
    # 把筆放下
    #這三條語句是一個組合相當於先把筆收起來再移動到指定位置,再把筆放下開始畫
    #否則turtle一移動就會自動的把線畫出來
    t = tree([p], l, a, f)
    for x in t:
        pass
    #print(len(p.getscreen().turtles()))
    #輸出箭頭總數
def main():
    a=clock()
    maketree(100,35,0.6375,-100,-210)
    maketree(110,60,0.67,-400,-100)
    maketree(120,30,0.6,500,-160)
    maketree(145,45,0.65,150,-80)
    b=clock()
    return "done: %.2f sec." % (b-a)
if __name__ == "__main__":
    msg = main()
    print(msg)
    mainloop()
    # 確保不會自動退出