Python程式設計:海龜繪圖¶
海龜繪圖模組 (turtle) 是 Python 內建的,不需要額外安裝,可以直接使用 import turtle 來匯入。
:::danger
伽碩的學生,若電腦版IDE無法執行的話,就用線上網頁的方式完成
https://www.w3cschool.cn/tools/index?name=pythonturtle
:::

海龜繪圖的核心是
- 位置與坐標:以 (0, 0) 為中心,向右為 x 軸正向,向上為 y 軸正向 。
- 畫筆屬性:可以設定畫筆的顏色、粗細、填充顏色等 。
- 方向與狀態:海龜有方向性,可以前進、後退、轉彎,畫筆可以放下或抬起
建立畫布與海龜¶
t = turtle.Pen() 可以建立一個海龜,並自動生成一個畫布。
| 指令 | 說明 |
|---|---|
| left(angle) | 向左轉動指定角度 |
| right(angle) | 向右轉動指定角度 |
| forward(number) | 向前移動指定距離 |
| backward(number) | 向後移動指定距離 |
| penup() | 抬起畫筆,移動時不繪圖 |
| pendown() | 放下畫筆,開始繪圖 |
| goto(x, y) | 移動到指定座標 (x, y) |
| speed(n) | 設定海龜速度,0 為最快 |
範例:畫正方形¶
```python= import turtle
import time¶
t = turtle.Turtle() t.forward(100)
time.sleep(2)¶
t.left(90) t.forward(100)
time.sleep(2)¶
t.left(90) t.forward(100)
time.sleep(2)¶
t.left(90) t.forward(100) t.left(90) turtle.done() # 結束後停住


### 補充:內角和與外角和

### 範例:畫五邊形
```python=
import turtle
t = turtle.Turtle()
sides = 5
for x in range(sides):
t.forward(100)
t.right(360/sides)
turtle.done() # 保持視窗開啟
練習¶
Problom. 請用海龜畫一個三角形¶
Tips. 三角形有 3 個邊,所以我們的迴圈要讓海龜重複做 3 次動作。 畫三角形時,海龜每次往前走完,請讓牠「向左轉 120 度」(使用 t.left(120))。
Problom. 繪製一個長方形¶
請建立一個海龜畫筆 t,繪製一個長方形。設定寬度變數 width 為 150,高度變數 height 為 80。海龜需要前進 width 步,轉彎 90 度,再前進 height 步,重複兩次完成。
Problom. 繪製虛線段¶
請繪製一段由 5 個小線段組成的虛線。設定變數 step_length 為 20。海龜先放下畫筆前進 step_length,再抬起畫筆(penup)前進 10 步,重複 5 次。
(補充)填滿顏色¶
| 指令 | 解釋 |
|---|---|
| begin_fill() | 開始記錄繪製路徑以準備填色 |
| end_fill() | 填滿路徑內的區域 |
| fillcolor(color_string) | 設定填滿的顏色,例如 "red" 或 "green" |
| fillcolor(r, g, b) | 使用 RGB 值設定填滿顏色 |
範例:繪製一個填滿顏色的五角形星星¶

```python= import turtle t = turtle.Pen() t.color('blue', 'yellow') # 設定畫筆和填色顏色 t.begin_fill() # 開始記錄繪製路徑以準備填色 for i in range(5): t.forward(100) t.right(144) # 720/5 (720是因為海龜在畫五角星時,需要繞著圖形的中心旋轉兩圈才能完成圖形。) t.end_fill() # 填滿路徑內的區域 turtle.done()
## 繪製圓弧形
| 指令 | 解釋 |
| --------------------------- | -------------------------------------- |
| circle(radius, extend=None) | radius 為半徑,extend 為繪製圓弧的角度 |
### 範例:畫四個圓

```python=
import turtle
t = turtle.Pen()
t.color('blue')
t.circle(50)
t.circle(-50)
t.forward(100)
t.circle(50)
t.circle(-50)
turtle.done()
Problom. 繪製同心圓¶
請繪製 3 個同心圓。設定一個列表 radii 包含 [30, 60, 90]。海龜每次畫完一個圓後,需要移動位置以確保下一個圓的中心點一致,或者單純在原點畫出不同大小的圓。
Problom. 繪製十字架形狀¶
請利用海龜畫出一個「+」字形。設定每一條分支的長度 length 為 50。海龜從中心出發,前進後再後退回原點,轉 90 度後重複,共執行 4 次。
(補充)螢幕與海龜控制¶
| 指令 | 解釋 |
|---|---|
| screen.title(string) | 設定視窗標題 |
| screen.bgcolor(color_string) | 設定背景顏色 |
| screen.setup(width, height) | 設定視窗寬度和高度 |
| t.hideturtle() | 隱藏海龜 |
| t.showturtle() | 顯示海龜 |
範例:繪製一個藍色天空下的五角形星星¶

```python= import turtle t = turtle.Pen() turtle.Screen().bgcolor('blue') # 設定背景顏色為藍色 t.color('yellow') t.begin_fill() for i in range(5): t.forward(100) t.right(144) t.end_fill() turtle.done()
範例:多邊形螺旋¶
利用turtle.tracer一次畫好

```python= import turtle
turtle.tracer(0,0)
t = turtle.Pen()
colorsList = ['red', 'green', 'blue'] for line in range(400): t.color(colorsList[line % 3]) t.forward(line) # 三角形是120度,這邊故意少一度,讓他可以重疊去畫出來 t.right(119)
turtle.done()
## 實作
- 星星:https://drive.google.com/file/d/1rGhv3OCfZ8we6uYBCLuIJrN04Aml7-9V/view?usp=sharing
- 蛇蛇追月亮:https://drive.google.com/file/d/19_MTdfuoRXafnnCSCtGWbDryhmTRMnux/view?usp=sharing
- 環狀樹枝:https://drive.google.com/file/d/1ido1cMyqHEfTQ27pWkOwsQR9L1Yv2G9T/view?usp=sharing
- 謝爾賓斯基三角形:https://drive.google.com/file/d/1Iq7vZThvVnanHdjmm-TjdevN84dh_Fxl/view?usp=sharing
- 科赫雪花:https://drive.google.com/file/d/1wSrRpcTM-RUusAQozJ3OUlVNR0dyJ3KQ/view?usp=sharing
- 小樹吃點點:https://drive.google.com/file/d/1_F1I3CHEuXZXvcP-I0Zr8yHiv5FatM0o/view?usp=sharing
## (補充)Reeborg's world:練習控制機器人走動
- https://reurl.cc/DOkEOO

### Home 1/Home 2
```python=
move()
move()
Home 3¶
```python= move() move()
turn_left() move()
### Home 4
```python=
def turn_right():
turn_left()
turn_left()
turn_left()
for _ in range(4): # 我們將重複以上所有步驟共4次。
move()
move()
move()
turn_left()
move()
move()
move()
if at_goal(): done()
else:
turn_right()
move()
turn_right()
Around 1/Around 1 - Variable¶
```python=
這會將一個標記放置在機器人目前所在的位置,該標記稍後會使用。¶
put()
這樣就迫使機器人向前移動一格,以免干擾下面的程式碼。¶
move() while True: # 我們在這裡開始一個無限迴圈。 if object_here(): done() elif front_is_clear(): move() else: turn_left()
### Around 1 - Apple
```python=
move()
while True: # 我們在這裡開始一個無限迴圈。
if object_here(): take()
elif at_goal(): done()
elif front_is_clear(): move()
else: turn_left()
Around 2¶
```python= put() move() while True: if object_here(): done() elif right_is_clear(): turn_left() turn_left() turn_left() move() elif wall_in_front(): turn_left() else: move()
### Around 3
```python=
put()
turn_left() # 這裡我們強制機器人先向左轉,然後再向前移動。
move()
while True:
if object_here(): done()
elif right_is_clear():
turn_left()
turn_left()
turn_left()
move()
elif wall_in_front(): turn_left()
else: move()
Around 4¶
```python= put() turn_left() # 我們在這裡再加一個左轉。 turn_left() move() while True: if object_here(): done() elif right_is_clear(): turn_left() turn_left() turn_left() move() elif wall_in_front(): turn_left() else: move()
### Center 1
```python=
step = 0
while front_is_clear():
step+=1
move()
turn_left()
turn_left()
for i in range(step//2):
move()
put()
Center 2¶
```python= step = 0
while front_is_clear(): step+=1 move() turn_left() turn_left() for i in range(step//2): move()
turn_left()
while front_is_clear(): step+=1 move() turn_left() turn_left() for i in range(step//2): move()
put()
### Harvest 1/ Harvest 2
```python=
# 定義右轉,讓程式碼更好讀
def turn_right():
for _ in range(3):
turn_left()
# 定義「撿起這格所有東西並往前走」
def pick_and_move():
while object_here():
take()
if front_is_clear():
move()
# 定義「收割完一整行」
def harvest_row():
while front_is_clear():
pick_and_move()
# 處理最後一格(因為 front_is_clear 停止時,機器人還站在最後一格)
while object_here():
take()
# 主程式邏輯
for _ in range(4): # 根據地圖範圍重複次數
harvest_row()
turn_left()
move()
turn_left()
harvest_row()
turn_right()
if front_is_clear(): # 避免最後一行撞牆
move()
turn_right()
Harvest 3¶
```python=
定義右轉,讓路徑轉向更直覺¶
def turn_right(): for _ in range(3): turn_left()
定義「修正單一格子」:清空並補上一顆¶
def fix_spot(): while object_here(): take() put()
定義「處理一整行」:每行 6 格,移動 5 次¶
def fix_one_row(): for _ in range(5): fix_spot() move() fix_spot()
1. 前往花園起點 (3, 3)¶
機器人從 (1, 1) 出發,面向東方¶
for _ in range(2): move() turn_left() for _ in range(2): move() turn_right()
2. 以「之字形」方式處理 6 行花園¶
總共 6 行,我們每兩行為一組處理(一去一回)¶
for i in range(3): # 向東處理一行 fix_one_row() turn_left() move() turn_left()
# 向西處理下一行
fix_one_row()
# 判斷是否還有下一組要處理,避免在最後一行撞牆
if i < 2:
turn_right()
move()
turn_right()
```
Hurdle 1/Hurdle 2/Hurdle 3/Hurdle 4¶
python=
while not at_goal(): # while 迴圈將無限期地持續下去,直到達到目標為止。
if right_is_clear(): # 這裡偵測是否需要右轉,如果需要,則右轉。
for _ in range(3):
turn_left()
move()
elif wall_in_front(): # 這裡檢測是否需要左轉,如果需要,則左轉。
turn_left()
else: # 如果不需要轉彎,這裡會讓機器人往前走。
move()
Copyright © 2026 Alen