အခန်း 25 · animation 2 ခု

Appendix B: Turtle Graphics (Turtle Graphics)

808 Coder မှ တင်ဆက်သည်

စာအုပ်တစ်အုပ်လုံး number တွေ၊ text တွေနဲ့ အလုပ်လုပ်လာခဲ့ပြီ။ ဒီ appendix ကတော့ အနားယူပြီး ပျော်စရာ တစ်ခုပါ — Python နဲ့ ပုံဆွဲခြင်း အကြောင်း။

ဒီအခန်းပြီးရင်...

  • turtle module ကို import လုပ်ပြီး virtual turtle တစ်ကောင် ဖန်တီးနိုင်မယ်
  • forward, backward, right, left, circle, home တို့နဲ့ turtle ကို ရွေ့ခိုင်းနိုင်မယ်
  • Square, triangle, circle, pentagon, star စတဲ့ ပုံတွေ ဆွဲနိုင်မယ်
  • color, fillcolor, pensize, speed တို့နဲ့ pen ကို စိတ်ကြိုက် ပြင်နိုင်မယ်
  • begin_fill()/end_fill() နဲ့ ပုံထဲ အရောင်ဖြည့်နိုင်မယ်
  • တစ်ပြိုင်နက် turtle နှစ်ကောင် ဆွဲခိုင်းနိုင်မယ်

turtle ဆိုတာ ဘာလဲ

turtle ဆိုတာ Python မှာ built-in ပါလာတဲ့ module တစ်ခု။ စိတ်ကူးထဲမှာ canvas (ပန်းချီစာရွက်ကြီး) တစ်ခုပေါ်မှာ virtual turtle (လိပ်ကလေး) တစ်ကောင် လမ်းလျှောက်နေတယ်လို့ တွေးကြည့်ပါ။

လိပ်ကလေးရဲ့ အမြီးမှာ pen တစ်ချောင်း ချည်ထားတယ်။ လိပ်ကလေး ရွေ့သွားတဲ့ နေရာတိုင်းမှာ pen က မျဉ်းကြောင်း ဆွဲသွားတယ်။ သင်က လိပ်ကလေးကို "ရှေ့ကို 100 သွား", "ညာဘက် 90 ဒီဂရီ လှည့်" လို့ ညွှန်ကြားတယ် — လိပ်ကလေးက နာခံပြီး ပုံတွေ ထွက်လာတယ်။

The turtle draws a square forward(100) right(90) turtle repeat 4x: forward(100), right(90)
turtle က forward နဲ့ 90° လှည့်ပြီး စတုရန်းဆွဲပုံ

ဒါကြောင့် turtle ဟာ programming ကို စလေ့လာသူတွေအတွက် အကောင်းဆုံး ကစားစရာ တစ်ခုပါ — loop တွေ၊ function တွေ သင်ထားသမျှကို မျက်စိနဲ့ မြင်ရတဲ့ ပုံတွေအဖြစ် ပြောင်းပြနိုင်တယ်။

စတင်ခြင်း

ပထမဆုံး module ကို import လုပ်ပြီး turtle တစ်ကောင် ဖန်တီးပါ။ Program ဆုံးရင် window ကို ဆက်ဖွင့်ထားဖို့ turtle.done() ကို ခေါ်ပါ။

import turtle

t = turtle.Turtle()

turtle.done()

ဒီ code ကို run ရင် window အလွတ်တစ်ခု ပွင့်လာမယ် — အလယ်မှာ မြားလေးတစ်ခု (ဒါပဲ လိပ်ကလေး) ရှိနေမယ်။

သတိပြုရန်: turtle က window ဖွင့်ဖို့ လိုတယ်။ ကိုယ့် computer မှာ Python run ရင် အဆင်ပြေတယ်။ ဒါပေမဲ့ server ပေါ်မှာ (သို့မဟုတ် screen မရှိတဲ့ environment မှာ) run ရင် window ပွင့်လာမှာ မဟုတ်ဘူး။ ဒီအခန်းရဲ့ code တွေကို ကိုယ့် laptop/desktop မှာ စမ်းကြည့်ပါ။

Basic Turtle Commands

လိပ်ကလေးကို ရွေ့ခိုင်းတဲ့ အခြေခံ command တွေ:

Command ဖော်ပြချက်
t.forward(100) ရှေ့ကို 100 pixels ရွေ့မယ် (မျဉ်းဆွဲသွားမယ်)
t.backward(100) နောက်ကို 100 pixels ရွေ့မယ်
t.right(90) ညာဘက်ကို 90 degrees လှည့်မယ်
t.left(90) ဘယ်ဘက်ကို 90 degrees လှည့်မယ်
t.circle(50) radius 50 pixels ရှိတဲ့ စက်ဝိုင်း ဆွဲမယ်
t.home() အစမှတ် (0, 0) ကို ပြန်သွားပြီး အစက မျက်နှာမူတဲ့ ဘက်ကို ပြန်လှည့်မယ်

တစ်ဆင့်ချင်း စမ်းကြည့်ရအောင်:

import turtle

t = turtle.Turtle()

t.forward(100)    # ရှေ့ကို သွား
t.right(90)       # ညာဘက် လှည့်
t.forward(100)    # ထပ်သွား
t.left(45)        # ဘယ်ဘက် 45 ဒီဂရီ လှည့်
t.backward(50)    # နောက်ပြန် သွား
t.home()          # အစမှတ် ပြန်

turtle.done()

ပုံတွေ ဆွဲခြင်း

Square (စတုရန်း)

Square ဆွဲဖို့ လိုတာက — ရှေ့သွား 100၊ ညာလှည့် 90 — ဒါကို 4 ကြိမ် ထပ်လုပ်ရုံပဲ။ Loop နဲ့ ရေးရင် ရှင်းရှင်းလေး:

import turtle

t = turtle.Turtle()

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

turtle.done()

Triangle (တြိဂံ)

Triangle အတွက်က 3 ကြိမ်၊ လှည့်ရမယ့် ထောင့်က 120 degrees:

import turtle

t = turtle.Turtle()

for i in range(3):
    t.forward(120)
    t.left(120)

turtle.done()

မှတ်ချက်: ပုံမှန် polygon တစ်ခု ဆွဲဖို့ formula ရှိတယ် — အခြမ်းအရေအတွက် × (360 ÷ အခြမ်းအရေအတွက်) degrees လှည့်။ Square = 4 × 90°, triangle = 3 × 120°, hexagon ဆို 6 × 60° ပေါ့။

Pentagon (ပဉ္စဂံ — အခြမ်း 5 ခု)

import turtle

t = turtle.Turtle()
t.shape("turtle")

for i in range(5):
    t.forward(100)
    t.right(360 / 5)

turtle.done()

360 / 5 = 72 degrees လှည့်ပြီး 5 ကြိမ် ထပ်လုပ်ရင် pentagon ရတယ်။

Circle (စက်ဝိုင်း)

စက်ဝိုင်းကတော့ အလွယ်ဆုံး — command တစ်ခုတည်းပဲ:

import turtle

t = turtle.Turtle()

t.circle(80)

turtle.done()

အရောင် နှင့် Pen Attributes

အရောင်ပြောင်းခြင်း

t.color() က pen ရဲ့ အရောင် (outline color) ကို ပြောင်းတယ်။ t.fillcolor() က ပုံထဲ ဖြည့်မယ့် အရောင်ကို သတ်မှတ်တယ်။

import turtle

t = turtle.Turtle()

t.color("blue")        # pen အရောင် အပြာ
t.fillcolor("yellow")  # ဖြည့်မယ့် အရောင် အဝါ

t.begin_fill()         # အရောင်ဖြည့်တာ စ
for i in range(4):     # square ဆွဲ
    t.forward(100)
    t.right(90)
t.end_fill()           # အရောင်ဖြည့်တာ ဆုံး

turtle.done()

အဝါရောင် ဖြည့်ထားတဲ့ အပြာ square တစ်ခု ရမယ်။ begin_fill() နဲ့ end_fill() ကြားမှာ ဆွဲသမျှ ပုံကို fillcolor နဲ့ ဖြည့်ပေးတယ်။

စက်ဝိုင်းကို ဖြည့်တာလဲ အတူတူပဲ:

import turtle

t = turtle.Turtle()
t.color("green")
t.fillcolor("lightgreen")

t.begin_fill()
t.circle(60)
t.end_fill()

turtle.done()

Pen Size နှင့် Speed

import turtle

t = turtle.Turtle()

t.pensize(5)     # pen ကို ထူထူ ဆွဲခိုင်း
t.color("red")
t.forward(150)

t.pensize(1)     # pen ပြန်ပါး
t.color("blue")
t.forward(150)

turtle.done()

t.speed() က လိပ်ကလေး ရွေ့တဲ့ အမြန်နှုန်းကို သတ်မှတ်တယ် — 1 (အနှေး) ကနေ 10 (အမြန်) အထိ။ 0 ဆိုတာ အမြန်ဆုံး (animation မပြဘဲ ချက်ချင်း ဆွဲပြီးသား ဖြစ်သွားတယ်):

import turtle

t = turtle.Turtle()

t.speed(1)       # နှေးနှေး — လှုပ်ရှားမှု မြင်ရမယ်
t.forward(100)

t.speed(0)       # အမြန်ဆုံး — ချက်ချင်း ပြီးသွားမယ်
t.circle(50)

turtle.done()

Turtle ကို အလှဆင်ခြင်း

လိပ်ကလေးရဲ့ ပုံသဏ္ဍာန်ကိုယ်တိုင်ကို ပြောင်းနိုင်တယ်။ မြားအစား လိပ်ပုံလေး ဖြစ်စေချင်ရင်:

import turtle

t = turtle.Turtle()

t.shape("turtle")              # "arrow", "circle", "square", "turtle"...
turtle.bgcolor("lightblue")    # canvas နောက်ခံ အရောင်

t.pensize(2)
t.color("green")

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

turtle.done()

shape() မှာ ရွေးစရာတွေ: "arrow" (default), "turtle", "circle", "square", "triangle", "classic"။

ကြယ် (Star) ဆွဲခြင်း

5-pointed star ဆွဲဖို့ လျှို့ဝှက်ချက်က ထောင့်ပါ — အခြမ်းတိုင်းမှာ 144 degrees လှည့်ရတယ်:

import turtle

t = turtle.Turtle()

for i in range(5):
    t.forward(100)
    t.right(144)

turtle.done()

144 ဆိုတာ ဘယ်ကလာသလဲ? Star ရဲ့ ထောင့်ချွန်တစ်ခုက 36 degrees ရှိတယ်။ အပြင်ဘက် လှည့်ရမယ့် ထောင့်က 180 − 36 = 144 degrees ဖြစ်တယ်။ (ဒါမှမဟုတ် 360 / 5 * 2 = 144 လို့ မှတ်လဲ ရတယ်။)

အရောင်ဖြည့်ထားတဲ့ ကြယ်:

import turtle

t = turtle.Turtle()
t.color("red", "yellow")   # outline အနီ, fill အဝါ
t.shape("turtle")

t.begin_fill()
for i in range(5):
    t.forward(120)
    t.right(360 / 5 * 2)
t.end_fill()

turtle.done()

t.color("red", "yellow") — argument နှစ်ခု ပေးရင် ပထမတစ်ခုက pen color၊ ဒုတိယတစ်ခုက fill color ဖြစ်တယ်။

နောက်ထပ် star ပုံစံတစ်မျိုး — ထောင့် 170 degrees နဲ့ 36 ကြိမ် လှည့်ရင် ပိုရှုပ်ထွေးလှပတဲ့ ကြယ်ပွင့် ရတယ်:

import turtle

t = turtle.Turtle()
t.color("red", "yellow")
t.speed(0)

t.begin_fill()
for i in range(36):
    t.forward(200)
    t.left(170)
t.end_fill()

turtle.done()

သတိပြုရန်: ဒီ star ကို while True: နဲ့ ရေးရင် program က ဘယ်တော့မှ ရပ်မှာ မဟုတ်ဘူး — infinite loop ဖြစ်သွားမယ်။ Loop အကြိမ် အရေအတွက် သိရင် for loop ကို သုံးပါ။ 36 ကြိမ်က 170 × 36 = 6120 degrees = အပတ်ရေ 17 ပတ် တိတိ ဖြစ်လို့ ပုံပြီးဆုံးတယ်။

Drawing a 5-pointed star: turn 144° at each point 144° exterior turn forward(100) right(144) repeat 5x 5 points x 144° = 720° (two full turns)
ကြယ် ၅ ထောင့် ဆွဲရာမှာ 144° လှည့်ရပုံ

Function နဲ့ ပုံဆွဲခြင်း

Chapter 14 မှာ function တွေ သင်ခဲ့ပြီးပြီ — turtle နဲ့ တွဲသုံးကြည့်ရအောင်။ Polygon ဆွဲတဲ့ formula က အတူတူပဲ ဖြစ်တော့ function တစ်ခုထဲ ထုပ်ထားရင် ပုံအမျိုးမျိုး ပြန်သုံးနိုင်တယ်:

import turtle

t = turtle.Turtle()
t.speed(0)

def polygon(sides, length):
    angle = 360 / sides
    for i in range(sides):
        t.forward(length)
        t.right(angle)

t.color("blue")
polygon(6, 80)    # hexagon

t.color("red")
polygon(8, 60)    # octagon

turtle.done()

ဒီလိုမျိုး code ကို တစ်ခါ ရေးထားပြီး ပုံအမျိုးမျိုး ဆွဲခိုင်းနိုင်တာ function ရဲ့ အစွမ်းပဲ။

Spiral (လိမ်ပုံစံ) ဆွဲခြင်း

Loop နဲ့ အရောင်တွေကို တွဲသုံးရင် spiral လို လှပတဲ့ ပုံတွေ ရတယ်:

import turtle

t = turtle.Turtle()
t.speed(0)

colors = ["red", "purple", "blue", "green", "yellow", "orange"]

for x in range(100):
    t.pencolor(colors[x % 6])
    t.forward(x)
    t.left(59)

turtle.done()

ဒီမှာ ဘာဖြစ်နေသလဲ? x က တစ်ကြိမ်ပြီးတစ်ကြိမ် ကြီးလာတော့ မျဉ်းက တဖြည်းဖြည်း ရှည်လာတယ်။ 59 degrees လှည့်တာက 60 နဲ့ နည်းနည်းလွဲတာမို့ ပုံက တစ်ပတ်ပြီးတစ်ပတ် လှည့်ပတ်ရင်း အပြင်ကို ပွင့်ထွက်သွားတယ်။ x % 6 က အရောင် 6 ရောင်ကို အလှည့်ကျ သုံးပေးတယ် — Chapter 8 (list) နဲ့ Chapter 1 (% operator) ကို ပြန်သတိရကြည့်ပါ။

ရှင်းလင်းခြင်း နှင့် ဖျောက်ခြင်း

ပုံဆွဲပြီးရင် ပြန်စဖို့ command တွေ:

Command ဖော်ပြချက်
t.reset() ပုံရော turtle ရဲ့ အခြေအနေရော အကုန် reset လုပ်မယ်
t.clear() ဆွဲထားတဲ့ ပုံပဲ ဖျက်မယ် (turtle က နေရာမရွေ့ဘူး)
t.hideturtle() turtle icon ကို ဖျောက်မယ် (ပုံကျန်တယ်)
t.showturtle() turtle icon ကို ပြန်ပြမယ်

ဥပမာ — ပုံဆွဲပြီး icon ဖျောက်ထားချင်ရင်:

import turtle

t = turtle.Turtle()

t.circle(80)
t.hideturtle()   # လိပ်ကလေး ပျောက်သွား၊ စက်ဝိုင်းပဲ ကျန်

turtle.done()

Turtle နှစ်ကောင် တစ်ပြိုင်နက်

Turtle တစ်ကောင်ထဲ မဟုတ်ဘူး — နှစ်ကောင်၊ သုံးကောင် ဖန်တီးပြီး တစ်ပြိုင်နက် ဆွဲခိုင်းနိုင်တယ်:

import turtle

t1 = turtle.Turtle()
t1.color("red")
for i in range(5):
    t1.forward(100)
    t1.right(360 / 5 * 2)

t2 = turtle.Turtle()
t2.shape("turtle")
t2.color("blue")
t2.right(180)
for i in range(5):
    t2.forward(100)
    t2.right(360 / 5 * 2)

turtle.done()

t1 က အနီကြယ် တစ်ခု ဆွဲတယ်။ t2 က 180 degrees လှည့်ပြီး (မျက်နှာမူရာ ပြောင်းပြီး) အပြာကြယ် တစ်ခု ဆွဲတယ်။ Object တစ်ခုချင်းစီက သီးခြား state (အရောင်၊ နေရာ၊ မျက်နှာမူရာ) ရှိတယ် — Chapter 15/16 က object အကြောင်း ပြန်သတိရကြည့်ပါ။

Program ပိတ်ခြင်း

Window ကို program ကနေ ပိတ်ချင်ရင် turtle.bye() ကို သုံးတယ်:

import turtle

t = turtle.Turtle()
t.forward(100)

turtle.bye()   # turtle window ကို ပိတ်မယ်

မှတ်ချက်: turtle.done() က window ကို ဖွင့်ထားပေးပြီး user ပိတ်တဲ့အထိ စောင့်တယ်။ turtle.bye() က window ကို ချက်ချင်း ပိတ်ပစ်တယ်။ ပုံဆွဲပြီးသား မြင်ချင်ရင် done() ကို သုံးပါ။


လေ့ကျင့်ခန်းများ

1. Hexagon ဆွဲပါ။ အခြမ်း 6 ခု၊ တစ်ခြမ်း 80 pixels ရှိတဲ့ ပုံမှန် hexagon တစ်ခု ဆွဲပါ။ လှည့်ရမယ့် ထောင့်ကို 360 / 6 နဲ့ တွက်ပါ။

2. အရောင်ဖြည့်ထားတဲ့ တြိဂံ။ အစိမ်းရောင် outline၊ အဝါရောင် fill နဲ့ triangle တစ်ခု ဆွဲပါ။ begin_fill()/end_fill() ကို သုံးပါ။

3. အိမ်ပုံလေး ဆွဲပါ။ Square (ကိုယ်) + triangle (ခေါင်မိုး) ကို တွဲပြီး အိမ်ပုံလေး ဆွဲပါ။ Square ဆွဲပြီးရင် turtle က ဘယ်နေရာမှာ ရှိနေမလဲ စဉ်းစားပြီး ခေါင်မိုးကို ဆက်ဆွဲပါ။ Hint: square ရဲ့ အပေါ်ဘက်အခြမ်းကနေ triangle စဆွဲပါ။

4. ကိုယ်ပိုင် spiral။ ဒီအခန်းရဲ့ spiral example ကို ယူပြီး ပြောင်းကြည့်ပါ — ထောင့်ကို 59 အစား 91 ထားကြည့်၊ ဒါမှမဟုတ် အရောင် list ကို ကိုယ်ကြိုက်တဲ့ အရောင် 3 ရောင်ပဲ ထားကြည့်။ ဘာထွက်လာသလဲ?

5. Turtle ပြိုင်ပွဲ။ Turtle နှစ်ကောင် ဖန်တီးပါ — တစ်ကောင်က အနီရောင် စက်ဝိုင်း ဆွဲပြီး၊ နောက်တစ်ကောင်က အပြာရောင် square ဆွဲပါစေ။ speed(0) နဲ့ နှစ်ကောင်လုံး အမြန်ဆွဲခိုင်းပြီး ဘယ်ပုံက ပိုလှသလဲ ကြည့်ပါ။

Appendix A: Binary Number များ (Binary Numbers)