跳轉到

Python程式設計:海龜繪圖

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

海龜繪圖的核心是

  • 位置與坐標:以 (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() # 結束後停住

![image](https://hackmd.io/_uploads/By3H2e6pgl.png)

![image](https://hackmd.io/_uploads/S1JO2gapee.png)

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

![image](https://hackmd.io/_uploads/r1VUy-apgx.png)

### 範例:畫五邊形

```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 值設定填滿顏色

範例:繪製一個填滿顏色的五角形星星

image

```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 為繪製圓弧的角度 |

### 範例:畫四個圓

![image](https://hackmd.io/_uploads/SyHGxf66ll.png)

```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() 顯示海龜

範例:繪製一個藍色天空下的五角形星星

image

```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()

## 停止追蹤

```python=
turtle.tracer(0,0) # 可以停止動畫,一次顯現出來

範例:多邊形螺旋

利用turtle.tracer一次畫好

image

```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
  ![image](https://hackmd.io/_uploads/rkQt3HbS-l.png =60%x)

### 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