Uốn LượnWiki
Tìm
Toán của đường lượn cho học sinh

Vẽ đường lượn bằng lập trình rùa trong Scratch và Python

Cho con rùa vừa tiến vừa quay là vẽ được cung tròn, chữ S, dải sóng, xoắn ốc và cả đường cong rồng. Hướng dẫn từng bước trong Scratch và Python turtle.

Vẽ đường lượn bằng lập trình rùa trong Scratch và Python

Lập trình rùa là cách vẽ hình bằng cách ra lệnh cho một "con rùa" cầm bút: tiến bao nhiêu bước, quay bao nhiêu độ. Muốn vẽ đường lượn, chỉ cần cho rùa vừa tiến vừa quay đều tay — quay một chiều thì được cung tròn, đổi chiều quay thì được chữ S, lặp lại thì được dải sóng uốn lượn. Cả Scratch lẫn Python đều có sẵn con rùa này, học sinh từ khoảng lớp 4 đã làm được.

Con rùa từ đâu ra

Con rùa vẽ hình ra đời cùng ngôn ngữ lập trình Logo, do Seymour Papert, Wally Feurzeig và Cynthia Solomon phát triển năm 1967 để dạy trẻ em suy nghĩ toán học. Ban đầu "rùa" là một robot nhỏ có cắm bút, bò trên tờ giấy lớn trải dưới sàn lớp học; về sau nó trở thành một hình tam giác nhỏ trên màn hình. Papert kể lại triết lý ấy trong cuốn Mindstorms (1980): trẻ học hình học tốt nhất khi tự "đóng vai" con rùa, tự hỏi "nếu mình là rùa thì phải bước thế nào".

Ngày nay, ý tưởng đó sống tiếp trong Scratch (do Phòng thí nghiệm Truyền thông MIT phát triển, ra mắt năm 2007) với tiện ích mở rộng Bút vẽ, và trong thư viện turtle có sẵn trong mọi bản cài Python.

Ý tưởng cốt lõi: hình học "từ bên trong"

Hình học ở trường thường nhìn hình từ bên ngoài, bằng toạ độ: điểm này ở (3; 5), điểm kia ở (7; 2). Hình học con rùa nhìn từ bên trong: rùa không biết mình đang ở đâu trên trang giấy, nó chỉ biết đi thẳng và rẽ.

  • Đi thẳng 100 bước, rẽ trái 90°, lặp lại 4 lần: hình vuông.
  • Đi thẳng 100 bước, rẽ trái 120°, lặp lại 3 lần: tam giác đều.
  • Đi thẳng 5 bước, rẽ trái 5°, lặp lại 72 lần: gần như một vòng tròn.

Để ý: cả ba hình khép kín đều có tổng các góc rẽ bằng 360° (4 × 90°, 3 × 120°, 72 × 5°). Đây là "định lý tổng chặng của rùa": rùa đi một vòng khép kín không tự cắt, quay về hướng cũ, thì tổng góc đã rẽ luôn là 360°. Từ đó, đường tròn chỉ là một đa giác có rất nhiều cạnh rất ngắn.

Bài 1: Cung tròn và chữ S trong Scratch

Trong Scratch, bấm nút "Thêm tiện ích" ở góc dưới bên trái, chọn Bút vẽ (Pen). Bạn sẽ có các khối hạ bút, nhấc bút, xoá tất cả. Dùng nhân vật mèo hoặc chọn một nhân vật hình mũi tên.

Một cung tròn nửa vòng

  1. Khi bấm lá cờ xanh: xoá tất cả, đi tới vị trí x = −150, y = 0, hướng về 0° (lên trên), hạ bút.
  2. Lặp lại 36 lần: di chuyển 5 bước, xoay phải 5 độ.

Tổng góc rẽ 36 × 5° = 180°: đúng nửa vòng. Rùa đã đi 36 × 5 = 180 bước, nên bán kính cung khoảng 180 ÷ π ≈ 57 bước.

Thêm nửa vòng ngược chiều: chữ S

  1. Tiếp ngay sau đó: lặp lại 36 lần: di chuyển 5 bước, xoay trái 5 độ.

Hai nửa vòng nối nhau ở đúng điểm rùa đổi chiều quay. Vì ở điểm nối rùa không rẽ gấp mà chỉ đổi chiều rẽ, đường vẽ liền mạch, không có góc gãy. Đặt cả hai khối "lặp lại 36" vào trong một khối "lặp lại 4", bạn được một dải sóng gồm 8 nửa vòng nối tiếp — chính là hình con rắn bò.

Bài 2: Cùng hình đó trong Python

Mở IDLE (đi kèm khi cài Python) hoặc một trình soạn Python bất kỳ trên máy tính, gõ từng dòng sau. Các dòng đều viết sát lề trái, không cần thụt đầu dòng.

  1. import turtle
  2. t = turtle.Turtle()
  3. t.penup(); t.goto(-300, 0); t.setheading(90); t.pendown()
  4. for i in range(4): t.circle(-40, 180); t.circle(40, 180)
  5. turtle.done()

Lệnh t.circle(bán kính, góc) vẽ một cung tròn. Bán kính dương thì tâm nằm bên trái rùa (rùa rẽ trái), bán kính âm thì tâm nằm bên phải (rùa rẽ phải). Vì thế cặp −40 và 40 tạo ra một chữ S, lặp 4 lần thành dải sóng dài 8 nửa vòng, mỗi chữ S rộng 160 bước.

Thay đổi để thấy quy luật

  • Đổi góc 180 thành 90: sóng thoải hơn, giống đường đi của chiếc xe lượn qua các cọc.
  • Đổi góc thành 270: các khúc uốn cuộn tròn gần như vòng khuyên, giống dòng sông rất quanh co.
  • Đổi bán kính thành 20 và 60 xen kẽ: sóng lệch, một bên khúc nhỏ một bên khúc to.

Bài 3: Đường xoắn ốc — bước chân dài dần

Nếu rùa quay một góc cố định nhưng mỗi bước dài hơn bước trước một chút, nó vẽ ra đường xoắn ốc cuộn ra ngoài.

  1. import turtle
  2. t = turtle.Turtle(); t.speed(0)
  3. for i in range(200): t.forward(i * 0.5); t.left(20)
  4. turtle.done()

Thử đổi góc 20 thành 89, 90, 91, 121. Với góc gần 90° hoặc gần 120°, các cạnh xếp thành những "cánh tay" xoắn chầm chậm — vì rùa gần như vẽ hình vuông, tam giác, nhưng mỗi vòng bị lệch đi 1°. Đây là thí nghiệm rất hay để thấy một sai lệch nhỏ cộng dồn tạo thành hình lớn.

Bài 4: Sóng hình sin bằng toạ độ

Lần này ta bỏ cách "từ bên trong", để rùa đi theo toạ độ, nhằm so sánh hai cách nghĩ.

  1. import turtle, math
  2. t = turtle.Turtle(); t.penup(); t.goto(-300, 60 * math.sin(-10)); t.pendown()
  3. for x in range(-300, 301, 5): t.goto(x, 60 * math.sin(x / 30))
  4. turtle.done()

Số 60 là biên độ (độ cao đỉnh sóng), số 30 điều khiển bước sóng: bước sóng bằng 2π × 30 ≈ 188 bước. Đặt hai dải lên cùng màn hình: dải ghép từ cung tròn ở Bài 2 và dải hình sin ở đây. Nhìn thoáng qua giống nhau, nhưng dải cung tròn có đỉnh "tròn trịa" hơn, còn dải sin thì độ cong thay đổi liên tục, thẳng nhất ở chỗ cắt trục. Đồ thị hình sin là cả một khái niệm toán riêng; ở đây ta chỉ dùng nó để so sánh.

Bài 5: Đường cong rồng bằng đệ quy

Với học sinh đã quen hàm, đây là bài thử thách: vẽ đường cong rồng (hình thu được khi gấp đôi dải giấy nhiều lần, có bài riêng trong mục này) bằng một hàm tự gọi chính nó. Phần thụt đầu dòng được đánh dấu bằng khoảng trắng; khi gõ vào máy, mỗi mức thụt là 4 dấu cách.

  1. import turtle
  2. t = turtle.Turtle(); t.speed(0); t.hideturtle()
  3. def rong(bac, dai, chieu):
  4.     if bac == 0: t.forward(dai); return
  5.     rong(bac - 1, dai, 1)
  6.     t.right(90 * chieu)
  7.     rong(bac - 1, dai, -1)
  8. rong(10, 6, 1)
  9. turtle.done()

Hàm rong bậc n vẽ hai con rồng bậc n − 1, ở giữa rẽ 90° theo chiều được giao. Con rồng thứ hai được giao chiều ngược lại — đúng quy luật "đảo và đổi" của dãy gấp giấy. Với bậc 10, rùa vẽ 1 024 đoạn. Thử bậc 12 hoặc 14 (rùa vẽ lâu hơn), giảm độ dài đoạn để hình vừa màn hình.

Lỗi hay gặp và cách sửa

Hiện tượngNguyên nhân thường gặpCách sửa
Hình chạy ra ngoài màn hìnhĐiểm xuất phát hoặc bước quá dàiDùng goto đưa rùa về mép trái trước, giảm số bước
Vòng tròn không khép kínTổng góc rẽ khác 360°Kiểm tra: số lần lặp × góc mỗi lần = 360
Có vệt nối thừaQuên nhấc bút khi di chuyểnpenup() trước goto, pendown() sau
Cửa sổ vẽ đóng ngayThiếu dòng cuốiThêm turtle.done()
Python báo lỗi thụt dòngDấu cách và phím Tab lẫn lộnChỉ dùng 4 dấu cách cho mỗi mức

Đóng vai con rùa: làm không cần máy tính

Trước khi ngồi vào máy, cả lớp có thể ra sân làm "rùa người", đúng như cách Papert gợi ý:

  1. Một bạn làm rùa, cầm một viên phấn chạm đất. Một bạn đọc lệnh: "tiến 2 bước, xoay phải 30 độ" (dùng bước chân ngắn, đều).
  2. Lặp 6 lần: rùa vẽ được nửa hình gì? Lặp 12 lần thì sao?
  3. Đổi sang "tiến 2 bước, xoay phải 30 độ" sáu lần rồi "tiến 2 bước, xoay trái 30 độ" sáu lần: nét phấn thành chữ S lớn trên sân.

Đi chậm, nhìn đường, mỗi lần chỉ một bạn làm rùa. Sau đó về lớp, viết lại đúng chuỗi lệnh ấy bằng Scratch: bạn sẽ thấy câu lệnh trên máy đơn giản chỉ là bản ghi những gì cơ thể mình vừa làm.

Câu hỏi thường gặp

Lập trình rùa là gì?

Lập trình rùa là cách vẽ hình bằng các lệnh điều khiển một con trỏ gọi là rùa: tiến, lùi, rẽ trái, rẽ phải, hạ bút, nhấc bút. Nó ra đời cùng ngôn ngữ Logo năm 1967 và nay có sẵn trong Scratch (tiện ích Bút vẽ) và thư viện turtle của Python.

Làm sao vẽ đường cong bằng Scratch?

Cho nhân vật vừa di chuyển vừa xoay trong một vòng lặp, ví dụ lặp 36 lần "di chuyển 5 bước, xoay 5 độ" sẽ được nửa vòng tròn. Đổi chiều xoay ở lần lặp tiếp theo sẽ được chữ S. Nhớ thêm tiện ích Bút vẽ và hạ bút trước khi vẽ.

Lệnh circle trong Python turtle dùng thế nào?

Lệnh t.circle(r, góc) vẽ một cung tròn bán kính r, quay hết số độ đã cho. Bán kính dương thì rùa rẽ trái, bán kính âm thì rẽ phải. Ghép t.circle(-40, 180) với t.circle(40, 180) sẽ được một chữ S.

Vì sao rùa đi một vòng khép kín thì tổng góc rẽ là 360 độ?

Khi rùa đi hết một đường khép kín không tự cắt và quay về đúng hướng ban đầu, nó đã xoay trọn một vòng. Đó là định lý tổng chặng của rùa, được trình bày trong các sách về hình học con rùa từ thập niên 1980. Hình vuông 4 × 90° hay vòng tròn 72 × 5° đều thoả điều này.

Học sinh mấy tuổi thì học được lập trình rùa?

Học sinh khoảng lớp 3–4 đã làm được các hình đơn giản trong Scratch, nhất là khi được "đóng vai rùa" trước trên sân. Python turtle hợp với học sinh từ khoảng lớp 6–7 trở lên. Đệ quy như bài đường cong rồng hợp với học sinh trung học đã quen hàm.

Mở app Uốn Lượn

Lượn đều tay cho dải lụa hoá rồng, chèo thuyền theo trống

Mở app Uốn Lượn

Bài viết liên quan

Mở app Uốn Lượn

Lượn đều tay cho dải lụa hoá rồng, chèo thuyền theo trống

Mở app Uốn Lượn Xem app khác