顯示具有 turtle 標籤的文章。 顯示所有文章
顯示具有 turtle 標籤的文章。 顯示所有文章

2025年3月24日 星期一

用繪圖來學習Python物件導向設計以及意外處理

類別階層圖:





功能:draw()
以下程式是由ChatGPT產生。

範例一
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import turtle

class Shape:
    def __init__(self, x, y, color):
        self.x = x
        self.y = y
        self.color = color
        self.t = turtle.Turtle()
        self.t.speed(3)
        self.t.penup()
        self.t.goto(self.x, self.y)
        self.t.pendown()
        self.t.color(self.color)

    def draw(self):
        pass  # 讓子類別實作

class Square(Shape):
    def __init__(self, x, y, color, side_length):
        super().__init__(x, y, color)
        self.side_length = side_length

    def draw(self):
        for _ in range(4):
            self.t.forward(self.side_length)
            self.t.right(90)

class CircleShape(Shape):
    def __init__(self, x, y, color, radius):
        super().__init__(x, y, color)
        self.radius = radius

    def draw(self):
        self.t.circle(self.radius)

# 初始化 turtle 畫布
screen = turtle.Screen()
screen.bgcolor("white")

# 創建方形與圓形物件
square = Square(-50, 50, "blue", 100)
circle = CircleShape(100, -50, "red", 50)

# 繪製圖形
square.draw()
circle.draw()

# 點擊畫布後關閉
screen.exitonclick()

執行結果:

範例二

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import turtle

class Shape:
    def __init__(self, x, y, color):
        try:
            if not isinstance(x, (int, float)) or not isinstance(y, (int, float)):
                raise ValueError("座標 (x, y) 必須是數字")
            if not isinstance(color, str):
                raise TypeError("顏色必須是字串")
            
            self.x = x
            self.y = y
            self.color = color
            self.t = turtle.Turtle()
            self.t.speed(3)
            self.t.penup()
            self.t.goto(self.x, self.y)
            self.t.pendown()
            self.t.color(self.color)
        except Exception as e:
            print(f"初始化 Shape 物件時發生錯誤: {e}")

    def draw(self):
        pass  # 讓子類別實作

class Square(Shape):
    def __init__(self, x, y, color, side_length):
        try:
            super().__init__(x, y, color)
            if not isinstance(side_length, (int, float)) or side_length <= 0:
                raise ValueError("邊長必須是正數")
            self.side_length = side_length
        except Exception as e:
            print(f"初始化 Square 物件時發生錯誤: {e}")

    def draw(self):
        try:
            for _ in range(4):
                self.t.forward(self.side_length)
                self.t.right(90)
        except AttributeError:
            print("無法繪製正方形,請檢查初始化是否成功")

class CircleShape(Shape):
    def __init__(self, x, y, color, radius):
        try:
            super().__init__(x, y, color)
            if not isinstance(radius, (int, float)) or radius <= 0:
                raise ValueError("半徑必須是正數")
            self.radius = radius
        except Exception as e:
            print(f"初始化 CircleShape 物件時發生錯誤: {e}")

    def draw(self):
        try:
            self.t.circle(self.radius)
        except AttributeError:
            print("無法繪製圓形,請檢查初始化是否成功")

# 初始化 turtle 畫布
screen = turtle.Screen()
screen.bgcolor("white")

# 測試輸入錯誤的數據
invalid_square = Square("wrong", 50, "blue", -100)  # 會觸發 ValueError
invalid_circle = CircleShape(100, -50, 123, 50)  # 會觸發 TypeError

# 創建正常的方形與圓形物件
square = Square(-50, 50, "blue", 100)
circle = CircleShape(100, -50, "red", 50)

# 繪製圖形
square.draw()
circle.draw()

# 點擊畫布後關閉
screen.exitonclick()

執行結果:
初始化 Shape 物件時發生錯誤: 座標 (x, y) 必須是數字
初始化 Square 物件時發生錯誤: 邊長必須是正數
初始化 Shape 物件時發生錯誤: 顏色必須是字串



2024年3月15日 星期五

雙迴圈5*5實心方塊

範例一、利用Tutle指令來畫出5*5實心方塊

程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import turtle
c = turtle.Turtle()
for i in range(1,6):
    for j in range(-2,3):
        c.penup()
        c.goto(-500+i*150,j*150)
        c.pendown()
        c.color("red")
        c.begin_fill()
        c.forward(100)
        c.left(90)
        c.forward(100)
        c.left(90)
        c.forward(100)
        c.left(90)
        c.forward(100)
        c.left(90)
        c.end_fill()

執行結果:

範例二、利用Tutle指令來畫出5*5實心方塊呈三角形

程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import turtle
c = turtle.Turtle()
for i in range(1,6):
    for j in range(-2+i-1,3):
        c.penup()
        c.goto(-500+i*150,j*150)
        c.pendown()
        c.color("red")
        c.begin_fill()
        c.forward(100)
        c.left(90)
        c.forward(100)
        c.left(90)
        c.forward(100)
        c.left(90)
        c.forward(100)
        c.left(90)
        c.end_fill()

執行結果:



範例三、承上題,但中間的方不顯示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import turtle
c = turtle.Turtle()
for i in range(1,6):
    for j in range(-2+i-1,3):
        if i==2 and j==-1:
            continue
        c.penup()
        c.goto(-500+i*150,j*150)
        c.pendown()
        c.color("red")
        c.begin_fill()
        c.forward(100)
        c.left(90)
        c.forward(100)
        c.left(90)
        c.forward(100)
        c.left(90)
        c.forward(100)
        c.left(90)
        c.end_fill()

執行結果:


2023年7月10日 星期一

Python迴圈的美(ChatGPT協助說明程式)

延續文章:Python迴圈的美

本篇延續學習Python迴圈的概念,並以ChatGPT來協助說明程式,範例五到七為ChatGPT所產生。

範例一:畫圓
程式:
import turtle
c = turtle.Turtle()
c.circle(100)

執行結果:



程式說明:
這段程式碼使用了Python中的turtle模組來畫圖。turtle模組提供了一個簡單的圖形介面,可以使用簡單的指令來控制一個海龜(turtle)圖形,進而畫出各種圖形。程式的第一行 import turtle 是將turtle模組匯入到你的程式中,以便使用其中的功能。第二行 c = turtle.Turtle() 創建了一個Turtle物件,並將其指派給變數c。這個物件代表了一隻海龜,你可以使用它來控制圖形的畫筆。第三行 c.circle(100) 是使用海龜物件c的circle()方法來畫一個半徑為100的圓形。這個方法接受一個參數,表示圓的半徑。
總結起來,這段程式碼的作用是畫出一個半徑為100的圓形。你可以根據自己的需求修改程式碼,調整圓的半徑或者新增其他的圖形指令,來繪製更複雜的圖形。

範例二:畫出2個圓
import turtle
c = turtle.Turtle()
c.circle(100)
c.left(10)
c.circle(100)
c.left(10)


執行結果:

程式說明:
這段程式碼在上一個範例的基礎上新增了兩行指令,c.left(10)。這是使用海龜物件c的left()方法將畫筆向左轉10度,然後再次呼叫c.circle(100)方法來繪製半徑為100的圓形。這樣的程式碼片段將繪製兩個相鄰的圓形,並且每次繪製完一個圓形後將畫筆向左轉10度。這樣重複執行兩次,就會得到一個類似螺旋的圖形。你可以根據需要修改程式碼,調整轉彎角度或重複的次數,以繪製出不同的圖案。turtle模組提供了許多可以控制海龜圖形的方法,你可以參考官方文件或其他資源以了解更多詳細的使用方式和指令。

範例三:用迴圈改寫範例二
程式:
import turtle
c = turtle.Turtle()
i = 0
while i < 2:
    c.circle(100)
    c.left(10)
    i += 1


程式說明:
這段程式碼使用了while迴圈來實現重複繪製圓形的效果。
首先,我們創建了一個Turtle物件c,然後定義一個變數i並將其初始化為0。接下來,使用while迴圈來執行下列動作,只要i小於2:呼叫c.circle(100)方法繪製一個半徑為100的圓形。呼叫c.left(10)方法將畫筆向左轉10度。將i的值加1,以便迭代下一次迴圈。當i的值增加到2或以上時,迴圈結束。
這樣的程式碼片段將繪製兩個相鄰的圓形,並且每次繪製完一個圓形後將畫筆向左轉10度。重複執行兩次,得到一個類似螺旋的圖形。你可以根據需要修改迴圈的條件和迭代的次數,以繪製出不同的圖案。

因為圓有360度,每次都向左10度,只要連續轉36次,就會變得很好看

範例四:畫出36個圓
import turtle
c = turtle.Turtle()
i = 0
while i < 36:
   c.circle(100)
   c.left(10)
   i += 1



執行結果:



這段程式碼使用了while迴圈來繪製一個由36個圓形組成的圖案。這樣的程式碼片段將繪製36個相鄰的圓形,每次繪製完一個圓形後將畫筆向左轉10度,重複執行36次,得到一個類似花瓣的圖案。

範例五:繪製彩色螺旋圖案
程式碼:
import turtle

colors = ["red", "orange", "yellow", "green", "blue", "purple"]
c = turtle.Turtle()

for i in range(200):
    c.pencolor(colors[i % 6])
    c.width(i / 100 + 1)
    c.forward(i)
    c.left(59)

執行結果:



程式解說:
這段程式碼使用for迴圈來繪製一個彩色的螺旋圖案。迴圈遍歷200次,每次改變畫筆顏色、畫筆寬度、向前移動的距離和左轉的角度,從而創造出一個螺旋圖案。

範例六:繪製五角星
程式碼:
import turtle c = turtle.Turtle() for _ in range(5): c.forward(100) c.right(144)

執行結果:

程式解說:
這段程式碼使用for迴圈來繪製一個五角星。迴圈遍歷5次,每次向前移動100單位,然後右轉144度,這樣就完成了一個五角星的繪製。

範例七:繪製螺旋正方形
程式碼:
import turtle

c = turtle.Turtle()

for i in range(100):
    c.forward(i)
    c.right(90)


執行結果:




程式解說:
這段程式碼使用for迴圈來繪製一個螺旋正方形。迴圈遍歷100次,每次向前移動的距離增加,同時每次右轉90度,從而創造出一個螺旋狀的正方形。

範例八:設置畫筆顏色
程式碼:
import turtle

c = turtle.Turtle()

c.pencolor("red")  # 設置畫筆顏色為紅色
c.fillcolor("blue")  # 設置填充顏色為藍色

c.begin_fill()  # 開始填充
c.circle(100)  # 繪製圓形
c.end_fill()  # 結束填充

執行結果:
執行中:
執行完畢:
程式解說:
這段程式碼使用pencolor()方法設置畫筆顏色為紅色,並使用fillcolor()方法設置填充顏色為藍色。接著使用begin_fill()開始填充,繪製一個半徑為100的圓形,最後使用end_fill()結束填充,形成一個填充藍色的圓形。

範例九:控制畫筆速度
程式碼:
import turtle

c = turtle.Turtle()

c.speed(1)  # 設置畫筆速度為最慢

for _ in range(4):
    c.forward(100)
    c.right(90)

執行結果:




程式解說:

這段程式碼使用speed()方法設置畫筆速度為最慢。然後使用for迴圈繪製一個正方形,每次向前移動100單位,然後右轉90度。

範例十:隱藏或顯示畫筆
程式碼:
import turtle

c = turtle.Turtle()

c.hideturtle()  # 隱藏畫筆

for _ in range(3):
    c.forward(100)
    c.left(120)

c.showturtle()  # 顯示畫筆

執行結果:
畫筆消失:

畫筆出現:
程式解說:


這段程式碼使用hideturtle()方法隱藏畫筆。然後使用for迴圈繪製一個三角形,每次向前移動100單位,然後左轉120度。最後使用showturtle()方法顯示畫筆。

這些範例程式碼展示了如何在使用Turtle模組時設置畫筆顏色、填充形狀、控制畫筆速度以及隱藏或顯示畫筆。你可以根據需要自由修改這些程式碼,以達到你想要的視覺效果。