2020年10月3日星期六

011 趣學Python程式設計 第1部分 學習程式設計 第11章 高級海龜作圖

 申明本站飛宇網 https://feiyetopro.blogspot.com/自網路收集整理之書籍文章影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]謝謝!



11章 高級海龜作圖

讓我們再來看看第4章中用到的海龜模組。你會在這一章中看到,在Python裡,海龜不僅可以畫簡單的黑線。你還可以用它來畫更複雜的幾何圖形,用不同的顏色,甚至還可以給形狀填色。

11.1 從基本的正方形開始

我們已經學會如何讓海龜畫簡單的圖形。在使用海龜之前,我們要引入turtle模組並創建Pen物件:


下麵是第4章裡我們用來創建正方形的代碼:


在第6章裡,你學會了使用for迴圈。用這個新知識,我們可以用for迴圈來讓這段有些冗長的代碼簡單一些:


在第一行,我們讓Pen物件重置。接下來,我們開始一個for迴圈,它用range(1, 5)來從1數到4。然後,在接下來的幾行,每次迴圈我們都向前50個圖元然後左轉90度。因為我們已經用了一個for迴圈,這段代碼會比前面的版本短一點。不算reset那一行的話,我們從7行減少到了3行。


11.2
 畫星星

現在,只要對我們的for迴圈做一些簡單的改動,我們就能畫出更好玩的東西。輸入下麵的代碼:


這段代碼會畫出一個八角星,如圖11-1所示。


11-1 八角星

這段代碼和前面畫正方形的代碼非常像,只是:

1.不是按range(1, 5)迴圈4次,而是用range(1, 9)迴圈8次。

2.不是向前移動50個圖元,而是向前100個圖元。

3.不是向左轉90度,而是向左轉225度。

現在,讓我們再進一步改進我們的星星。每次轉175度,迴圈37次,我們可以畫出有更多角的星星,用下面的代碼:


運行的結果如圖11-2所示。


11-2 螺旋星

除了普通的星星,我們還可以畫螺旋星:


把旋轉的角度改一下,減少迴圈的次數,海龜畫出風格不同的星星,如圖11-3所示。


11-3

用差不多的代碼,我們可以畫出很多不同的形狀,從基本的方形到螺旋星。如你所見,for迴圈使得畫這些形狀變得非常簡單。如果沒有for迴圈,我們就得輸入冗長的代碼。


現在讓我們用if語句控制海龜的轉向來繪製不同的星星。在下面的例子裡,我們想讓海龜先轉一個角度,然後下一次轉一個不同的角度。


在這裡,我們先創建一個運行18次的迴圈(用range(1, 19)),然後讓海龜向前移動100個圖元(t.forward(100))。接下來是if語句(if x % 2 == 0)。這個語句檢查變數x是否包含一個偶數,它用到了取餘運運算元,就是運算式x % 2 == 0中的%,它的意思是:x除以2的餘數是否等於0

運算式x % 2的本意是:%把變數x平均分成兩份後還剩下幾?例如,如果我們把5個球平均分成兩份,我們會得到兩組兩個球(一共是4個),那麼還剩下一個球,如圖11-4所示。


11-4 平分5個球

如果我們把13個球平均分成兩份,我們會得到兩組6個球,還剩1個球,如圖11-5所示。


11-5 平分13個球

如果我們檢查除以2後餘數是否等於0,實際上是在問它是否可以被平分為兩份,並且沒有剩餘。這是一個檢查變數中的數位是否為偶數的好辦法,因為偶數總是能被平均分成兩份。

在代碼的第5行,如果x中的數字是偶數(if x % 2 == 0)我們讓海龜左轉175度(t.left(175)),否則(else)在最後一行,我們讓它左轉225度(t.left(225))。

運行代碼的結果如圖11-6所示。


11-6 計語句畫出的星星

11.3 畫汽車

我們的海龜可不只是能畫星星和簡單的幾何形狀。在下面的例子裡,我們要畫一個看上去很原始的小汽車。首先,我們要畫車身。在IDLE裡,選擇新視窗,然後在視窗裡輸入如下代碼。


接下來我們畫第一個輪子。


最後,我們畫第二個輪子。



選擇保存為。給它起個檔案名,比如car.py

選擇運行運行模組來試試代碼吧。畫好的車如圖11-7所示。


11-7 畫出的小汽車

你大概已經注意到我們代碼中的幾個新的海龜函數了:

1color是用來改變畫筆的顏色的。

2begin_fillend_fill是用來給畫布上的一個區域填色的。

3circle會畫一個指定大小的圓。

4setheading讓海龜面向指定的方向。

讓我們看看如何用這些函數來給我們的繪圖加上顏色吧。

11.4 填色

color函數有三個參數。第一個參數指定有多少紅色,第二個指定有多少綠色,第三個指定有多少藍色。舉個例子,要得到車子的亮紅色,我們用color(1, 0, 0),也就是讓海龜用百分之百的紅色畫筆。


這種紅色、綠色、藍色的混搭叫做RGBRedGreenBlue)。顏色在你電腦的顯示器上就是這樣表示的,把這些主色用不同比例混合就能產生其他的顏色,就像我們混合藍色和紅色的顏料來做出紫色,用黃色和紅色來做出橙色一樣。紅色、綠色和藍色被稱為主色是因為你無法組合其他顏色來生成它們。

雖然我們不是在電腦螢幕上混合顏料(我們用的是光),但我們可以把RGB方案想像成是三個顏料桶,一個紅的,一個綠的和一個藍的。每個桶裡都是滿的,我們說滿桶的值是1(或者說100%)。然後把所有的紅顏料和所有的綠顏料混在一起放在一個大缸裡,這樣就產生了黃色(每個顏色都是1,或者說100%)。

現在讓我們回到代碼的世界。要用海龜畫一個黃色的圓,我們要用100%的紅色和綠色顏料,但是不用藍色,像這樣:


第一行的1,1,0表示100%的紅色,100%的綠色,還有0%的藍色。在下麵一行,我們告訴海龜用這個RGB顏色(t.begin_fill)來給後面的形狀填色,然後用(t.circle)來畫一個圓。在最後一行,end_file告訴海龜用RGB顏色來給圓填色。

11.4.1 用來畫填色圓形的函數

為了更容易地用不同的顏色來試驗,我們來把畫圓填色的代碼寫成一個函數。


我們可以只用綠色來畫一個很亮的綠色的圓,如下:


我們也可以用一半的綠色(0.5)來畫一個深綠色的圓:


接下來在螢幕上試試其他RGB顏色,先畫個全紅的圓,再畫個半紅的(10.5),然後全藍和半藍,像這樣:



如果你的畫布已經變得很零亂了,那麼用
t.reset()來把舊畫刪掉。同時要記得你還可以用t.up()來把畫筆抬起,這樣海龜移動時就不會畫出線來(用t.down()來把筆再次放下)。

紅綠藍的各種組合可以產生大量不同的顏色,如金色:


下麵是淡粉色:


下面是兩種不同的橙色:


試著自己組合一些顏色吧!

11.4.2 使用純白和純黑

當你在晚上把燈都關了會怎麼樣?所有的東西都成了黑色。電腦上的顏色也是如此。沒有光意味著沒有顏色,所有主色為0的圓都是黑色的:



結果如圖11-8所示。


11-8 黑色的圖

反過來你把三個顏色都用100%也是同樣的道理。這時你會得到白色。輸入下面的代碼可以把黑色的圓擦掉:


11.5
 畫方形的函數

你已經知道如何用begin_fill來讓海龜畫帶顏色的形狀,並且用end_fill函數來給形狀填上顏色。現在我們要做更多關於形狀和填色的實驗。我們先用本章開頭畫正方形的函數並把正方形的尺寸作為一個參數傳給它。


用尺寸為50來調用這個函數,像這樣:


這會畫出一個小的正方形,如圖11-9所示。


11-9 小正方形

現在我們讓用不同的尺寸來調用這個函數。用255075100125創建五個套在一起的正方形。


結果如圖11-10所示。


11-10 五個套在一起的正方形

11.6 畫填色正方形

要畫填了色的正方形,我們首先要重置畫布,開始填色,然後再調用正方形函數,如下:


你應當看到一個空的正方形,直到你結束填充:


你的正方形如圖11-11所示。


11-11 填好色的正方形

我們改變一下這個函數,讓它既可以畫填好的正方形也可以畫不填色的正方形。這樣的話我們就會需要另一個參數,並讓代碼更複雜一點。


在第一行,我們改變函數的定義讓它接受兩個參數:sizefilled。接下來,我們用if filled == True來檢查filled的值是否為True。如果是,我們調用begin_fill來讓海龜給畫出的形狀填色。然後我們迴圈4次(for x in range(0, 4))來畫出正方形的四邊(向前畫然後左轉)。然後再用if filled == True來檢查filled是否為True。如果是,我們用t.end_fill把填色關閉,這時海龜會把正方形填好顏色。

現在我們可以用下面的代碼來畫一個填了色的正方形:


或者我們可以用下面的代碼來畫一個沒有填色的正方形:


在調用了mysqure函數兩次後,我們得到了如圖11-12所示的圖案,看上去就像個正方形的眼睛。


11-12 一個填了色的正方形和一個沒有填色的正方形

當然這些還遠遠不夠。你可以畫各種形狀並給它們填色。

11.7 畫填好色的星星

作為最後一個例子,讓我們給早前畫的星星填上顏色。下麵是原來的代碼:


現在我們要寫一個mystar函數。我們會使用mysquare函數中的if語句,並且也加上size參數。


在函數的前面兩行,我們檢查filled是否為真,如果是的話開始填充。在最後兩行再次檢查,如果filled是真,我們就停止填充。同時,和mysquare函數一樣,我們把參數size作為星星的大小,在調用t.forward時使用這個值。

現在我們把顏色設置為金色(90%紅色,75%綠色,0%的藍色),然後再次調用這個函數。


海龜會畫出一個填了色的星星,如圖11-13所示。


11-3 填了色的星星

要給星星畫上輪廓,把顏色改成黑色並且不用填色再畫一遍星星:


現在,星星成了帶黑邊的金色,如圖11-14所示。


11-14 加了黑邊的星星

11.8 你學到了什麼

經過了這一章,你學會了如何用turtle模組畫幾個基本的幾何圖形,還有用for迴圈和if語句來控制海龜在螢幕上的動作。我們改變了海龜的筆的顏色並給它所畫的形狀填色。我們還用一些函數來重用繪圖的代碼,這使得畫出不同顏色的形狀只要簡單地做一次函式呼叫就夠了。


11.9
 程式設計小測驗

在下面的練習裡,你要自己用海龜畫圖。和從前一樣,答案可以在網站http://python-for-kids.com/ 上找到。

#1:畫八邊形

在這一章裡我們畫過星星、正方形,還有長方形。那麼寫個函數來畫一個八邊形吧!(提示:嘗試讓海龜每次轉45度。)如圖11-15所示。


11-15 八邊形

#2:畫填好色的八邊形

寫好畫八邊形的函數以後,改一改它讓它畫出填色的八邊形。最好畫一個帶輪廓的八邊形,就像我們畫的星星一樣,如圖11-16所示。


11-16 填色的八邊形

#3:不同的畫星星函數


寫一個畫星星的函數,它有兩個參數:大小(size)和尖角(points)的數量。函數的開始應該是這樣的:

 


0 留言:

發佈留言