自信心是成功的源泉,對剛入門編程行業的初級程式設計師來說,多敲代碼多做項目就是構建自信心的最好辦法。
第一次學編程是在屏幕上敲出」Hello World!「,慢慢地可以處理簡單程序,顯示更複雜的圖像,解決更多的問題。
信心增加又可以促進自己學習更多的知識,這樣正能量的方式就是程式設計師學習進階的不二法寶。
今天就教大家用Python寫一個機器貓,跟著異步君一起敲代碼吧!
01程序分析
我們先來看一下機器貓的樣子,如圖所示。
它有大大的腦袋、圓圓的眼睛、紅紅的鼻頭,嘴巴兩邊各有 3 根鬍子。腦袋和身體用一條紅色的絲帶分 隔開,因為圖中的這隻機器貓是坐著的,所以我們沒有看到腿,只有圓圓的腳露在外面。此外,機器貓還有胳膊和圓圓的手。最後,別忘了機器貓還有標誌性的鈴鐺和口袋。
我們可以使用自定義函數,按照機器貓的身體部位來定義各個繪製函數:head(頭)、 eyes(眼睛)、nose(鼻子)、mouth(嘴)、whiskers(鬍子)、body(身體)、feet(腳)、arms(胳 膊)、hands(手)、bell(鈴鐺)和 package(口袋)。函數的名字就表明了該函數負責繪製的身體部位。
我們可以看到,這些身體部位大部分是由圓形和矩形組成,所以為了能夠重複使用相同的代碼段,避免 不必要地複製和粘貼代碼,我們還需要定義兩個基礎函數——一個是繪製圓形的函數 drawRound(),一個是繪製矩形的 drawRect()函數。
02導入模塊和設置畫筆
因為要使用海龜繪圖,所以我們需要先導入 turtle 模塊。我們將採用第 11 章介紹的導入模塊的第二種方法:
from turtle import *
使用這種方法,可以導入 turtle 模塊中所有的方法和變量,然後就可以直接調用方法了,而不需要再添加 「turtle.」前綴。現在,我們可以直接將代碼寫為 setup(500,500),而不需要再添加前綴寫成 turtle.setup(500,500)。
然後我們對畫筆做一些基本設置,代碼如下。
#設置窗口大小 setup(500,500) #設置畫筆 speed(10) shape("turtle") colormode(255)
調用 setup(500,500),將畫布大小設置為 500 像素寬,500 像素高。調用 speed(10) 將畫筆速度設置為 10。
調用 shape("turtle"),將光標設置為小海龜。調用 colormode(255)設置 RGB 色彩值範圍為 0~255。
03基礎函數
繪製圓形
我們定義一個 drawRound()函數,用它來繪製圓形。這裡為它設置兩個參數,分別是表示所繪製的圓的半 徑的 size 和表示是否填充的 filled。drawRound()函數的代碼如下所示。
def drawRound(size,filled): pendown() if filled==True: begin_fill() setheading (180) circle(size,360) if filled==True: end_fill()
首先,調用 pendown()函數表示落筆。然後,判斷參數 filled 是否等於 True。如果等於 True,表示要填充, 那麼就調用 begin_fill()函數;否則,不調用該函數,表示沒有填充。然後調用 setheading(180),設置小海 龜啟動時運動的方向,就是讓小海龜調個頭。調用 circle(size,360),畫一個半徑為 size 的圓。然後還要判斷參數 filled 是否等於 True,如果等於 True,意味著前面調用過 begin_fill()函數,則這裡調用 end_fill()函 數表示填充完畢。
繪製矩形
接下來,我們定義了一個 drawRect()函數,用它來繪製矩形。這裡為它指定 3 個參數,分別是表示所繪製 的矩形的長的 length,表示所繪製的矩形的寬的 width,以及表示是否填充的 filled。drawRect()函數的代 碼如下所示。
def drawRect(length,width,filled): setheading(0) pendown() if filled==True: begin_fill() forward(length) right(90) forward(width) right(90) forward(length) right(90) forward(width) if filled==True: end_fill()
首先調用 setheading(0),設置小海龜啟動時運動的方向,就是讓小海龜頭朝右。然後調用 pendown()函數, 表示落筆。判斷參數 filled 是否等於 True。如果等於 True,表示要填充,就調用 begin_fill()函數;否則, 不調用函數,表示沒有填充。調用 forward(length),繪製一條邊。然後調用 right(90),讓光標向右旋轉 90 度。調用 forward(width),繪製另一條邊。
調用 right(90),讓光標向右旋轉 90 度。調用 forward(length),繪製第三條邊。調用 right(90),讓光標向右旋轉 90 度。調用 forward(width),繪製第四 條邊。然後還要判斷參數 filled 是否等於 True,如果等於,則調用 end_fill()函數表示填充完畢。
04繪製機器貓的身體
head()函數
在這裡,我們定義了一個繪製機器貓大腦袋的函數——head()。首先,它繪製一個藍色填充的大圓,表示 機器貓的腦袋。然後,在藍色圓中繪製一個稍小一點的白色填充的圓,表示機器貓的臉龐。head()函數的 代碼如下所示。
def head(): #大圓 color("blue","blue") penup() goto(0,100) drawRound(75,True) #小圓 color("white","white") penup() goto(0,72) drawRound(60,True)
首先調用 color()函數,將畫筆的顏色設置為藍色,將填充的顏色也設置為藍色。然後調用 penup()函數, 讓畫筆抬起,不要在畫布上留下筆跡。調用 goto()函數將畫筆移動到 x 坐標為 0、y 坐標為 100 的位置。調用我們在前面創建的自定義函數 drawRound(),繪製一個半徑為 75 個像素、用藍色填充的圓。
然後再次調用 color()函數,將畫筆的顏色設置為白色,將填充的顏色也設置為白色。然後調用 penup()函 數,讓畫筆抬起,不要在畫布上留下筆跡。調用 goto()函數將畫筆移動到 x 坐標為 0、y 坐標為 72 的位置。調用 drawRound()函數,繪製一個半徑為 60 個像素、用白色填充的圓。調用這個 head()函數來看一下執行效果,如圖所示。
eyes()函數
接下來,我們定義 eyes()函數,用來繪製機器貓的眼睛。首先,我們繪製兩個邊框為黑色並用白色填充的 大圓,表示機器貓的兩隻眼睛。然後在每個大圓中畫一個用黑色填充的圓,並且在這個黑圓中再繪製一
個更小的用白色填充的圓,它們表示機器貓的眼球。
def eyes(): #左眼眶 color("black","white") penup() goto(-15,80) drawRound(17,True) #右眼眶 color("black","white") penup() goto(19,80) drawRound(17,True) #左眼珠 color("black","black") penup() goto(-8,70) drawRound(6,True) color("white","white") penup() goto(-8,66) drawRound(2,True) #右眼珠 color("black","black") penup() goto(12,70) drawRound(6,True) color("white","white") penup() goto(12,66) drawRound(2,True)
首先繪製機器貓的左眼眶。調用 color()函數,將畫筆的顏色設置為黑色,將填充的顏色設置為白色。然 後調用 penup()函數,讓畫筆抬起,不要在畫布上留下筆跡。調用 goto()函數將畫筆移動到 x 坐標為 15、y 坐標為 80 的位置。調用自定義函數 drawRound(),繪製一個半徑為 17 個像素、用白色填充的圓。
然後繪製右眼眶,這段代碼和繪製左眼的代碼基本一致,只是傳入 goto()函數的參數不一樣,要將畫筆移 動到 x 坐標為 19、y 坐標為 80 的位置。接下來繪製左眼珠和右眼珠。還是調用 color()函數,設置畫筆和填充的顏色,移動畫筆,然後繪製圓。調用這個 eyes()函數來看一下效果,如圖所示。
nose()函數 接下來,我們定義 nose()函數,來繪製鼻子。鼻子很簡單,就是一個紅色的圓。nose 函數的代碼如下所示。
def nose(): color("red","red") penup() goto(0,40) drawRound(7,True)
調用 color 函數,將畫筆和填充的顏色設置為紅色。然後調用 penup()函數,讓畫筆抬起,先不要在畫布
上留下筆跡。調用 goto()函數將畫筆移動到 x 坐標為 0、y 坐標為 40 的位置。調用自定義函數 drawRound(),繪製一個半徑為 7 個像素、用紅色填充的圓。調用這個 nose()函數來看一下繪製效果,如圖所示。
mouth()函數
接下來,我們定義一個 mouth()函數,用來繪製機器貓的嘴巴。它會先繪製一條弧線,表示嘴形,然後再 繪製一條豎線,表示機器貓的「人中」。
def mouth(): #嘴 color("black","black") penup() goto(-30,-20) pendown() setheading (-27) circle(70,55) #人中 penup() goto(0,26) pendown() goto(0,-25)
調用 color 函數,將畫筆和填充的顏色都設置為黑色。然後調用 penup()函數,讓畫筆抬起,先不要在畫 布上留下筆跡。調用 goto()函數將畫筆移動到 x 坐標為30、y 坐標為20 的位置。然後調用 pendown()函數落下畫筆。調用 setheading(-27),設置小海龜啟動時運動的方向。調用 circle(70,55)繪製一 條弧線,表示機器貓的嘴巴。
接下來,調用 penup()函數,讓畫筆抬起,先不要在畫布上留下筆跡。調用 goto()函數將畫筆移動到 x 坐 標 0、y 坐標為 26 的位置。然後調用 pendown()函數落下畫筆。調用 goto(0,-25),來繪製一條直線,表示 機器貓的「人中」。調用這個 mouth()函數來看一下繪製效果,如圖所示。
whiskers()函數
接下來,我們定義了一個 whiskers()函數,用來繪製鬍子。它在機器貓的「人中」的兩邊,分別繪製 3 條 直線,表示鬍鬚。whiskers()函數的代碼如下所示。
def whiskers(): color("black","black") #左邊中間的鬍子 penup() goto(10,5) pendown() goto(-40,5) #右邊中間的鬍子 penup() goto(10,5) pendown() goto(40,5) #左上的鬍子 penup() goto(-10,15) pendown() goto(-40,20) #右上的鬍子 penup() goto(10,15) pendown() goto(40,20) #左下的鬍子 penup() goto(-10,-5) pendown() goto(-40,-10) #右下的鬍子 penup() goto(10,-5) pendown() goto(40,-10)
還是先調用 color()函數,將畫筆和填充的顏色都設置為黑色。然後調用 penup()函數,讓畫筆抬起,先不要在畫布上留下筆跡。調用 goto()函數將畫筆移動到指定位置。然後調用 pendown()函數落下畫筆。調用goto()函數,繪製一條直線,表示左邊第一根鬍子。然後重複類似的動作,繪製剩下的 5 根鬍子。這部分的代碼基本上是相同的,只是移動到的坐標位置有 所不同,這裡就不再贅述。調用 whiskers()函數來看一下繪製效果,如圖所示。
body()函數
下面我們定義 body()函數,它用來繪製機器貓的身體。該函數先繪製一個藍色的矩形表示身體,然後再 繪製一個白色的圓,表示機器貓的大肚子。接下來,繪製一個紅色的長方形,表示紅絲帶,用於分隔開 腦袋和身體。最後,繪製一個半圓,表示機器貓的腿。body()函數的代碼如下所示。
def body(): #藍色的身體 color("blue","blue") penup() goto(-50,-40) drawRect(100,80,True) #白色的大肚子 color("white","white") penup() goto(0,-30) drawRound(40,True) #紅色絲帶 color("red","red") penup() goto(-60,-35) drawRect(120,10,True) #白色的腿 color("white","white") penup() goto(15,-127) pendown() setheading(90) begin_fill() circle(14,180) end_fill()
先調用 color()函數,將畫筆和填充的顏色都設置為藍色。然後調用 penup()函數,讓畫筆抬起,先不要在 畫布上留下筆跡。調用 goto()函數將畫筆移動到指定位置。然後調用自定義函數 drawRect(),繪製一個長 為 100 像素、寬為 80 像素,用藍色填充的矩形,表示機器貓的身體。
然後調用 color()函數,將畫筆和填充的顏色都設置為白色。然後調用 penup()函數,讓畫筆抬起,先不要 在畫布上留下筆跡。調用 goto()函數將畫筆移動到指定位置。然後調用自定義函數 drawRound(),繪製一 個半徑為 40 像素、用白色填充的圓形,表示機器貓的大肚子。
接下來,再次調用 color()函數,將畫筆和填充的顏色都設置為紅色。然後調用 penup()函數,讓畫筆抬起, 先不要在畫布上留下筆跡。調用 goto()函數將畫筆移動到指定位置。然後調用自定義函數 drawRect(),繪 制一個長為 120 像素、寬為 10 像素,用紅色填充的扁扁的矩形,用來分隔開機器人的身體和腦袋。這是 機器人的紅絲帶,也是掛鈴鐺的地方。
然後調用 color()函數,將畫筆和填充的顏色都設置為白色。然後調用 penup()函數,讓畫筆抬起,先不要 在畫布上留下筆跡。調用 goto()函數將畫筆移動到指定位置。調用 pendown()函數落下畫筆。調用 setheading(90),設置小海龜啟動時運動的方向,也就是讓小海龜旋轉 90 度。調用 begin_fill()函數,開始 填充。調用 circle(14,180),繪製一個半徑為 14 像素的半圓形。然後調用 end_fill()函數,停止填充。這樣 就繪製完了機器貓的兩條腿。
調用這個函數,看一下繪製效果,如圖所示。
feet()函數
接下來,我們定義 feet()函數,用來繪製機器貓的腳。feet()函數的代碼如下所示。
def feet(): #左腳 color("black","white") penup() goto(-30,-110) drawRound(20,True) #右腳 color("black","white") penup() goto(30,-110) drawRound(20,True
調用 color()函數,將畫筆顏色設置為黑色,將填充顏色設置為白色。然後調用 penup()函數,讓畫筆抬起,先不要在畫布上留下筆跡。調用 goto()函數將畫筆移動到 x 坐標為30、y 坐標為110 的位置。
然後調用自定義函數 drawRound(),繪製一個半徑為 20 像素、用白色填充的圓形,表示機器貓的左腳。然後重複類似的動作,繪製機器貓的右腳。代碼基本上是相同的,只是移動的坐標有所不同,這裡就不 再贅述。調用 feet()函數,看一下繪製效果,如圖所示。
arms()函數
接下來,我們定義 arms()函數,用來繪製機器貓的胳膊。這裡用兩個四邊形表示機器貓的兩條胳膊。arms()函數的代碼如下所示。
def arms(): #左胳膊 color("blue","blue") penup() begin_fill() goto(-51,-50) pendown() goto(-51,-75) left(70) goto(-76,-85) left(70) goto(-86,-70) left(70) goto(-51,-50) end_fill() #右胳膊 color("blue","blue") penup() begin_fill() goto(49,-50) pendown() goto(49,-75) left(70) goto(74,-85) left(70) goto(84,-70) left(70) goto(49,-50) end_fill()
調用 color()函數,將畫筆顏色和填充顏色都設置為藍色。然後調用 penup()函數,讓畫筆抬起,先不要在 畫布上留下筆跡。調用 begin_fill()函數表示開始填充。調用 goto()函數將畫筆移動到指定位置。然後調用 pendown()函數落下畫筆。調用 goto()函數,繪製一條直線。然後調用函數 left(70),表示向左旋轉 70 度。調用 goto()函數,繪製第二條直線。然後調用函數 left(70),表示向左旋轉 70 度。調用 goto()函數,繪製第三條直線。然後調用函數 left(70),表示再次向左旋轉 70 度。調用 goto()函數,繪製第四條直線。調用 end_fill()函數,完成顏色的填充。這樣我們就完成了一個用藍色填充的四邊形,用它來表示機器貓的左胳膊。
然後重複類似的動作,繪製右胳膊。代碼基本相同,只是移動的坐標位置有所不同,這裡不再贅述。調 用一下 arms()函數,看一下繪製效果,如圖所示。
hands()函數
接下來,我們定義了 hands()函數,來繪製機器貓的手。這裡用兩個白色填充的圓來表示機器貓的手。hands()函數的代碼和 feet()函數比較類似,這裡不再做過多的解釋,直接列出了代碼。
def hands(): #左手 color("black","white") penup() goto(-90,-71) drawRound(15,True) #右手 color("black","white") penup() goto(90,-71) drawRound(15,True)
調用 hands()函數,看一下繪製效果,如圖所示。
bell()函數
接下來,我們定義了一個 bell()函數,來繪製鈴鐺。可以看到,鈴鐺是在一個黃色圓上,由中間的兩條黑 線和下方的一個小黑圈組成的。所以,我們先繪製一個用黃色填充的圓;然後繪製一個沒有填充的矩形, 表示鈴鐺中間分開上下部分的橫條。在矩形下面,再繪製一個黑色填充的圓。bell()函數代碼比較簡單, 這裡也不再過多地解釋,直接列出代碼。
def bell(): #黃色實心圓表示銅鈴 color("yellow","yellow") penup() goto(0,-41) drawRound(8,True) #黑色矩形表示花紋 color("black","black") penup() goto(-10,-47) drawRect(20,4,False) #黑色實心圓表示撞擊的金屬丸 color("black","black") penup() goto(0,-53) drawRound(2,True)
調用這個函數,看一下其繪製效果,如圖所示。
package()函數
最後,我們還要給機器貓繪製一個口袋,因此,這裡定義一個 package()函數來繪製口袋。這裡用一個半 圓來表示機器貓的口袋。package()函數的代碼比較簡單,這裡不再解釋,直接列出了代碼。
def package(): #半圓 color("black","black") penup() goto(-25,-70) pendown() setheading(-90) circle(25,180) goto(-25,-70) hideturtle()
調用這個函數,看一下繪製效果,如圖所示。
到這裡,我們的機器貓就繪製完成了。和前面給出的機器貓的卡通形象對比一下,看看是不是挺像的呢?
還想了解更多趣味編程嗎?這本《Python少兒趣味編程》推薦給大家,本書精心選取內容,注重難易適度和趣味性,語言通俗易懂,代碼示例豐富。在每章的末尾,還給出了一些練習題並給出了解答。
本書適合想要學習Python編程基礎的少兒(尤其是10歲以上的孩子)及想要教孩子學習編程的家長閱讀,也適合少兒編程培訓班的老師用作少兒編程培訓的教材。