Dự án nâng cao
Trong bài này, chúng ta sẽ làm các dự án thực tế và thú vị với Turtle!
1. Dự án: Đồng hồ analog
Phần tiêu đề “1. Dự án: Đồng hồ analog”import turtleimport time
# Setupscreen = turtle.Screen()screen.setup(width=600, height=600)screen.bgcolor("white")screen.title("Đồng hồ Analog")screen.tracer(0)
# Vẽ mặt đồng hồclock = turtle.Turtle()clock.hideturtle()clock.speed(0)clock.pensize(3)
# Vẽ vòng tròn đồng hồclock.penup()clock.goto(0, -210)clock.pendown()clock.circle(210)
# Vẽ các số từ 1-12clock.penup()for hour in range(1, 13): angle = 90 - (hour * 30) x = 170 * turtle.cos(turtle.radians(angle)) y = 170 * turtle.sin(turtle.radians(angle)) clock.goto(x, y) clock.write(str(hour), align="center", font=("Arial", 14, "bold"))
# Tạo kim giâysecond_hand = turtle.Turtle()second_hand.speed(0)second_hand.color("red")second_hand.pensize(2)second_hand.hideturtle()
# Tạo kim phútminute_hand = turtle.Turtle()minute_hand.speed(0)minute_hand.color("blue")minute_hand.pensize(4)minute_hand.hideturtle()
# Tạo kim giờhour_hand = turtle.Turtle()hour_hand.speed(0)hour_hand.color("black")hour_hand.pensize(6)hour_hand.hideturtle()
def draw_hand(hand, angle, length): """Vẽ kim đồng hồ""" hand.clear() hand.penup() hand.goto(0, 0) hand.setheading(90) hand.right(angle) hand.pendown() hand.forward(length)
# Vòng lặp cập nhật thời gianwhile True: # Lấy thời gian hiện tại current_time = time.localtime() hour = current_time.tm_hour % 12 minute = current_time.tm_min second = current_time.tm_sec
# Tính góc cho các kim second_angle = second * 6 minute_angle = minute * 6 + second * 0.1 hour_angle = hour * 30 + minute * 0.5
# Vẽ các kim draw_hand(second_hand, second_angle, 180) draw_hand(minute_hand, minute_angle, 150) draw_hand(hour_hand, hour_angle, 100)
screen.update() time.sleep(1)
turtle.done()2. Dự án: Game đua rùa
Phần tiêu đề “2. Dự án: Game đua rùa”import turtleimport random
# Setupscreen = turtle.Screen()screen.setup(width=800, height=600)screen.bgcolor("lightgreen")screen.title("Đua rùa")
# Vẽ đường đuapen = turtle.Turtle()pen.speed(0)pen.hideturtle()pen.penup()pen.goto(-350, 200)pen.pendown()pen.pensize(3)
# Vẽ 5 làn đuafor i in range(6): pen.penup() pen.goto(-350, 200 - i * 80) pen.pendown() pen.forward(700)
# Vẽ vạch đíchpen.penup()pen.goto(350, 200)pen.pendown()pen.right(90)pen.forward(400)
# Tạo 5 con rùacolors = ["red", "blue", "green", "yellow", "purple"]turtles = []
for i in range(5): racer = turtle.Turtle() racer.shape("turtle") racer.color(colors[i]) racer.penup() racer.goto(-340, 160 - i * 80) racer.pendown() turtles.append(racer)
# Bắt đầu đuarace_on = Truewhile race_on: for racer in turtles: # Mỗi rùa di chuyển ngẫu nhiên distance = random.randint(1, 10) racer.forward(distance)
# Kiểm tra xem có rùa nào về đích chưa if racer.xcor() >= 340: race_on = False winner_color = racer.pencolor() pen.penup() pen.goto(0, 0) pen.write(f"Rùa {winner_color} thắng!", align="center", font=("Arial", 24, "bold")) break
turtle.done()3. Dự án: Vẽ mặt cười emoji
Phần tiêu đề “3. Dự án: Vẽ mặt cười emoji”import turtle
# Setupscreen = turtle.Screen()screen.bgcolor("lightyellow")
t = turtle.Turtle()t.speed(3)
# Vẽ mặt (hình tròn vàng)t.penup()t.goto(0, -100)t.pendown()t.color("black", "yellow")t.begin_fill()t.circle(100)t.end_fill()
# Vẽ mắt tráit.penup()t.goto(-40, 20)t.pendown()t.color("black", "black")t.begin_fill()t.circle(10)t.end_fill()
# Vẽ mắt phảit.penup()t.goto(40, 20)t.pendown()t.begin_fill()t.circle(10)t.end_fill()
# Vẽ miệng cườit.penup()t.goto(-50, 0)t.pendown()t.color("black")t.pensize(3)t.right(90)t.circle(50, 180)
t.hideturtle()turtle.done()4. Dự án: Máy tính đơn giản (Interactive)
Phần tiêu đề “4. Dự án: Máy tính đơn giản (Interactive)”import turtle
# Setupscreen = turtle.Screen()screen.setup(width=600, height=600)screen.bgcolor("lightblue")screen.title("Máy tính vẽ hình")
t = turtle.Turtle()t.shape("turtle")t.speed(3)
# Hướng dẫninstructions = turtle.Turtle()instructions.hideturtle()instructions.penup()instructions.goto(0, 250)instructions.write("Nhấn phím: w=tiến, s=lùi, a=trái, d=phải, c=xóa, q=thoát", align="center", font=("Arial", 12, "normal"))
# Các hàm điều khiểndef move_forward(): t.forward(10)
def move_backward(): t.backward(10)
def turn_left(): t.left(15)
def turn_right(): t.right(15)
def clear_screen(): t.clear() t.penup() t.home() t.pendown()
def quit_game(): screen.bye()
# Đăng ký phímscreen.listen()screen.onkey(move_forward, "w")screen.onkey(move_backward, "s")screen.onkey(turn_left, "a")screen.onkey(turn_right, "d")screen.onkey(clear_screen, "c")screen.onkey(quit_game, "q")
turtle.done()5. Dự án: Vẽ cờ các quốc gia
Phần tiêu đề “5. Dự án: Vẽ cờ các quốc gia”Cờ Nhật Bản
Phần tiêu đề “Cờ Nhật Bản”import turtle
screen = turtle.Screen()screen.bgcolor("white")
t = turtle.Turtle()t.speed(2)
# Vẽ viền cờt.penup()t.goto(-200, 150)t.pendown()t.pensize(3)for i in range(2): t.forward(400) t.right(90) t.forward(300) t.right(90)
# Vẽ hình tròn đỏ ở giữat.penup()t.goto(0, -50)t.pendown()t.color("red", "red")t.begin_fill()t.circle(80)t.end_fill()
t.hideturtle()turtle.done()Cờ Hàn Quốc (đơn giản hóa)
Phần tiêu đề “Cờ Hàn Quốc (đơn giản hóa)”import turtle
screen = turtle.Screen()screen.bgcolor("white")
t = turtle.Turtle()t.speed(2)
# Vẽ hình chữ nhật trắngt.penup()t.goto(-200, 150)t.pendown()t.pensize(3)for i in range(2): t.forward(400) t.right(90) t.forward(300) t.right(90)
# Vẽ hình tròn âm dương ở giữa# Nửa đỏt.penup()t.goto(0, 0)t.pendown()t.color("red", "red")t.begin_fill()t.circle(50, 180)t.end_fill()
# Nửa xanht.color("blue", "blue")t.begin_fill()t.circle(50, 180)t.end_fill()
t.hideturtle()turtle.done()6. Dự án: Vẽ biểu đồ
Phần tiêu đề “6. Dự án: Vẽ biểu đồ”import turtle
# Dữ liệudata = { "Python": 85, "Java": 70, "JavaScript": 75, "C++": 60, "Ruby": 50}
colors = ["red", "blue", "green", "orange", "purple"]
# Setupscreen = turtle.Screen()screen.bgcolor("white")screen.title("Biểu đồ cột")
t = turtle.Turtle()t.speed(2)
# Vẽ trụct.penup()t.goto(-300, -200)t.pendown()t.forward(600)t.backward(600)t.left(90)t.forward(400)
# Vẽ các cộtx = -250for i, (language, value) in enumerate(data.items()): # Vẽ cột t.penup() t.goto(x, -200) t.pendown() t.color(colors[i], colors[i]) t.begin_fill() for j in range(2): t.forward(value * 2) t.right(90) t.forward(80) t.right(90) t.end_fill()
# Viết tên t.penup() t.goto(x + 10, -230) t.color("black") t.write(language, font=("Arial", 10, "normal"))
# Viết giá trị t.goto(x + 20, value * 2 - 190) t.write(str(value), font=("Arial", 10, "bold"))
x += 120
t.hideturtle()turtle.done()7. Dự án: Vẽ maze (mê cung)
Phần tiêu đề “7. Dự án: Vẽ maze (mê cung)”import turtle
# Setupscreen = turtle.Screen()screen.bgcolor("white")screen.title("Mê cung")
t = turtle.Turtle()t.speed(0)t.pensize(3)t.color("blue")
# Định nghĩa mê cung (1 = tường, 0 = đường)maze = [ [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 1, 1, 1, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1], [1, 0, 1, 0, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1]]
# Kích thước ôcell_size = 40
# Vẽ mê cungt.penup()for row in range(len(maze)): for col in range(len(maze[row])): if maze[row][col] == 1: x = col * cell_size - 150 y = 150 - row * cell_size t.goto(x, y) t.pendown() t.color("black", "gray") t.begin_fill() for i in range(4): t.forward(cell_size) t.right(90) t.end_fill() t.penup()
# Đánh dấu điểm bắt đầu và kết thúc# Điểm bắt đầu (xanh lá)t.goto(-150 + cell_size, 150 - cell_size)t.dot(20, "green")
# Điểm kết thúc (đỏ)t.goto(-150 + 6 * cell_size, 150 - 5 * cell_size)t.dot(20, "red")
t.hideturtle()turtle.done()8. Dự án: Xếp hình tetris
Phần tiêu đề “8. Dự án: Xếp hình tetris”import turtle
def draw_square(x, y, size, color): """Vẽ một ô vuông""" t.penup() t.goto(x, y) t.pendown() t.color("black", color) t.begin_fill() for i in range(4): t.forward(size) t.left(90) t.end_fill()
# Setupscreen = turtle.Screen()screen.bgcolor("white")screen.title("Các khối Tetris")
t = turtle.Turtle()t.speed(0)
size = 30
# Khối I (màu cyan)for i in range(4): draw_square(-200 + i * size, 200, size, "cyan")
# Khối O (màu vàng)for i in range(2): for j in range(2): draw_square(-50 + i * size, 200 - j * size, size, "yellow")
# Khối T (màu tím)draw_square(100, 200, size, "purple")for i in range(3): draw_square(70 + i * size, 170, size, "purple")
# Khối L (màu cam)for i in range(3): draw_square(-200, 50 - i * size, size, "orange")draw_square(-170, -10, size, "orange")
# Khối Z (màu đỏ)for i in range(2): draw_square(-50 + i * size, 50, size, "red") draw_square(-20 + i * size, 20, size, "red")
# Khối S (màu xanh lá)for i in range(2): draw_square(100 + i * size, 50, size, "green") draw_square(70 + i * size, 20, size, "green")
t.hideturtle()turtle.done()Bài tập thử thách
Phần tiêu đề “Bài tập thử thách”Thử thách 1: Pong Game
Phần tiêu đề “Thử thách 1: Pong Game”Tạo game Pong đơn giản với 2 thanh và một quả bóng
Thử thách 2: Snake Game
Phần tiêu đề “Thử thách 2: Snake Game”Tạo game rắn săn mồi cổ điển
Thử thách 3: Tic-Tac-Toe
Phần tiêu đề “Thử thách 3: Tic-Tac-Toe”Tạo game X-O với turtle
Thử thách 4: Vẽ nhân vật Cartoon
Phần tiêu đề “Thử thách 4: Vẽ nhân vật Cartoon”Vẽ một nhân vật cartoon yêu thích (Pokemon, Doraemon, etc.)
Thử thách 5: Digital Art
Phần tiêu đề “Thử thách 5: Digital Art”Tạo một tác phẩm nghệ thuật số độc đáo
Tips cho dự án lớn
Phần tiêu đề “Tips cho dự án lớn”- Chia nhỏ vấn đề: Chia dự án thành các hàm nhỏ
- Test từng phần: Kiểm tra từng hàm trước khi ghép lại
- Comment code: Ghi chú để dễ hiểu và maintain
- Sử dụng hàm: Tránh lặp code, viết hàm tái sử dụng
- Tối ưu tốc độ: Dùng
speed(0)vàtracer(0)cho animation phức tạp
Tổng kết
Phần tiêu đề “Tổng kết”Trong bài này, bạn đã học:
- ✅ Tạo đồng hồ analog với kim đồng hồ động
- ✅ Làm game đua rùa đơn giản
- ✅ Vẽ các dự án có tính tương tác
- ✅ Tạo biểu đồ và trực quan hóa dữ liệu
- ✅ Vẽ các hình phức tạp (cờ, mê cung, tetris)
- ✅ Kết hợp nhiều kỹ thuật tạo dự án hoàn chỉnh
Chúc bạn thành công với các dự án Turtle của mình! 🐢🎨