基於Python中的turtle繪畫星星和星空

前言:

Python 中的畫圖工具——turtle(海龜繪圖),turtle 是 Python 中自帶的繪圖模塊,最初來自於 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 於 1967 年所創造的 Logo 編程語言。

使用 turtle 控制畫筆在畫板上畫畫。而這個畫筆是有形狀的,默認是一個小箭頭,我們可以使用 turtle.shape('turtle') 將其設成一個小海龜。除瞭變成小海龜外,還支持傳入 'arrow'(箭頭),'circle'(圓),'square'(正方形),'triangle'(三角形)和 'classic'(經典).

畫筆的顏色默認是黑色的,我們可以使用turtle.color('red') 改成紅色的。當然,你也可以使用 turtle.color('yellow') 改成黃色,使用turtle.color('pink') 改成粉色等等。

一、畫一個N邊形

import turtle
 
turtle.color('red') #將畫筆顏色設置成紅色
turtle.hideturtle() #隱藏小海龜
 
#畫一個n邊形
def draw_polygon(n):
  for i in range(n):
    turtle.forward(100)
    turtle.right(360/n)
 
draw_polygon(5)     #畫一個五邊形
turtle.done()

二、畫五角星

五角星每個角的度數都是 36 度,用 180 – 36 得到對應的補角為 144 度。

如下圖所示:

五角星的五條線的長度是一樣的,並且角度也一樣。那麼,我們就可以用循環來畫五角星。五角星要畫 5 條線,因此要循環 5 次。每次循環都除瞭畫一條線,還要旋轉特定的角度。從上圖可知,每次向右旋轉 144 度即可。

所以畫五角星的代碼如下:

import turtle
 
turtle.color('red')  # 畫筆顏色和填充顏色都設為紅色
turtle.hideturtle()  #隱藏小海龜
 
turtle.begin_fill()  #開始填充
for i in range(5):
  turtle.forward(100)#向前走100像素
  turtle.right(144)  #右轉144度
turtle.end_fill()    #結束填充

打印出結果其實上圖五角星不在畫板中央,我們將它移動到畫板中央

註意:(-50, 20) 隻是針對邊長 100 像素的五角星,不要隨意修改邊長。

import turtle
 
turtle.color('red')
turtle.hideturtle()
turtle.penup()
turtle.goto(-50,20)
turtle.pendown()
 
turtle.begin_fill()
for i in range(5):
  turtle.forward(100)
  turtle.right(144)
turtle.end_fill()
turtle.done()

三、一閃一閃亮晶晶

我們來畫一堆星星,實現“一閃一閃亮晶晶,滿天都是小星星”的效果~✨ 

因為畫的星星比較多,我們先把之前畫五角星的代碼封裝成一個函數:

import turtle
 
def draw_star():
  turtle.color('white')
  turtle.hideturtle()
  turtle.begin_fill()
  for i in range(5):
    turtle.forward(10)
    turtle.right(144)
  turtle.end_fill()

星星的光是白色的,因此我將顏色設置成瞭白色(white)。並且,因為是小星星,我將邊長設成瞭 10 像素。畫一個小星星的方法搞定瞭,接下來是畫滿天星,就畫 50 個吧!

滿天星的位置都是隨機的,我們需要用到 random 模塊生成隨機位置。因為教學環境中顯示區域有限,隨機位置在 x 軸上的范圍是 -150 到 150,在 y 軸上的范圍是 -100 到 100。

隨機畫 50 顆小星星的代碼如下:

import turtle
from random import randint
 
def draw_star():
  turtle.color('white')
  turtle.hideturtle()
  turtle.begin_fill()
  for i in range(5):
    turtle.forward(10)
    turtle.right(144)
  turtle.end_fill()
 
for i in range(50):
  turtle.speed(0)  # 最快速
  turtle.penup()
  x = randint(-150, 150)  # x 軸
  y = randint(-100, 100)  # y 軸
  turtle.goto(x, y)
  turtle.pendown()
  draw_star()

應該註意到瞭 turtle.speed(0) 這行代碼,這是控制繪圖速度的。因為畫 50 顆小星星耗時較久,所以要加快繪圖速度。 turtle.speed(0) 的參數是 0-10 的整數,其中 1-10 數字越大,繪圖速度越快。1 最慢,10 最快,默認是 6。而 0 表示沒有動畫效果,因此 0 比 10 的速度還要快。

滿天星畫完瞭,我們最後再署個名。調用turtle.write() 可以在畫板上寫字,參數為要寫的內容。我們還能設置字的字體、大小等,比如 turtle.write('By 黃幫主', font = ('SimHei', 12, 'bold'))。font 參數是個元組,其中第一個是字體,第二個是字體大小,最後一個是字重。

為瞭讓文字更清晰可見,我將字體設置成瞭黑體!12 像素!加粗!完整的代碼如下:

import turtle
from random import randint
 
def draw_star():
  # 補全畫一顆星星的代碼
  turtle.color('red')
  turtle.hideturtle()
  turtle.begin_fill()
  for i in range(5):
    turtle.forward(10)
    turtle.right(144)
  turtle.end_fill()
  
 
# 將 ??? 改成你想畫的星星個數
for i in range(50):
  turtle.speed(0)
  turtle.penup()
  x = randint(-150, 150)
  y = randint(-100, 100)
  turtle.goto(x, y)
  turtle.pendown()
  draw_star()
 
turtle.penup()
turtle.goto(0, -130)
turtle.pendown()
turtle.write('一閃一閃亮晶晶',  font = ('SimHei', 12, 'bold'))
turtle.done()

最終結果:

推薦閱讀: