DỰ ÁN GAME RẮN SĂN MỒI (PHẦN 1)

Dự án Game Rắn săn mồi (Snake Game) là một lựa chọn kinh điển và tuyệt vời nhất để chốt lại khóa học! Dự án này sẽ kết hợp toàn bộ công lực từ Bài 1 đến Bài 7: Biến số (để lưu điểm), If-Else (xử lý va chạm), Vòng lặp (để cập nhật màn hình liên tục), Danh sách (để quản lý thân rắn dài ra) và Hàm/Đối tượng (để điều khiển rắn).

Vì đây là một dự án lớn, chúng ta nên chia làm 2 giai đoạn (tương đương Bài 8 và Bài 9) để các con không bị ngợp.

Hôm nay, chúng ta sẽ bắt đầu với Bài 8: Xây dựng bộ khung và điều khiển Rắn di chuyển.

🛠️ Bước 1: Tạo sân chơi (GUI) và các Đối tượng

Chúng ta tạo file mới tên là game_ran_san_moi.py. Bước đầu tiên là tạo ra màn hình game màu đen huyền bí, một chú rắn (hình vuông màu xanh) và một viên mồi (hình tròn màu đỏ).

import turtle
import time

# 1. Tạo màn hình game (GUI)
cua_so = turtle.Screen()
cua_so.title("Game Rắn Săn Mồi - Hai Bố Con Tự Làm")
cua_so.bgcolor("black")
cua_so.setup(width=600, height=600)
cua_so.tracer(0) # Tắt tự động cập nhật màn hình để game chạy mượt hơn

# 2. Tạo đầu con rắn (Object đầu tiên)
dau_ran = turtle.Turtle()
dau_ran.shape("square")
dau_ran.color("green")
dau_ran.penup()
dau_ran.goto(0, 0) # Xuất phát ở chính giữa màn hình
dau_ran.direction = "stop" # Ban đầu đứng im

# 3. Tạo mồi cho rắn (Object thứ hai)
moi = turtle.Turtle()
moi.shape("circle")
moi.color("red")
moi.penup()
moi.goto(0, 100) # Đặt mồi ở vị trí phía trên đầu rắn

🕹️ Bước 2: Dạy Rắn biết "Bò" (Hành động)

Để rắn tự động bò theo hướng đã chọn, chúng ta cần định nghĩa một hàm di chuyển di_chuyen(). Trong hệ trục tọa độ của màn hình, muốn đi lên ta cộng thêm vào $Y$, đi xuống trừ $Y$, đi phải cộng $X$, đi trái trừ $X$.

Chúng ta gõ tiếp đoạn code định nghĩa hành động này:

def di_chuyen():
    if dau_ran.direction == "up":
        y = dau_ran.ycor() # Lấy tọa độ Y hiện tại
        dau_ran.sety(y + 20) # Tiến lên 20 bước
        
    if dau_ran.direction == "down":
        y = dau_ran.ycor()
        dau_ran.sety(y - 20)
        
    if dau_ran.direction == "left":
        x = dau_ran.xcor() # Lấy tọa độ X hiện tại
        dau_ran.setx(x - 20)
        
    if dau_ran.direction == "right":
        x = dau_ran.xcor()
        dau_ran.setx(x + 20)

⌨️ Bước 3: Kết nối phím bấm bàn phím (Điều khiển)

Bây giờ làm sao để khi bấm nút W (Lên), S (Xuống), A (Trái), D (Phải) thì rắn đổi hướng? Chúng ta cần viết các hàm đổi hướng và bắt sự kiện bàn phím.

# Các hàm thay đổi thuộc tính direction (hướng) của rắn
def di_len():
    if dau_ran.direction != "down": # Không cho phép đang đi xuống lại quay ngoắt lên trên
        dau_ran.direction = "up"

def di_xuong():
    if dau_ran.direction != "up":
        dau_ran.direction = "down"

def di_sang_trai():
    if dau_ran.direction != "right":
        dau_ran.direction = "left"

def di_sang_phai():
    if dau_ran.direction != "left":
        dau_ran.direction = "right"

# Ra lệnh cho màn hình lắng nghe bàn phím
cua_so.listen()
cua_so.onkeypress(di_len, "w")       # Bấm nút W để đi lên
cua_so.onkeypress(di_xuong, "s")    # Bấm nút S để đi xuống
cua_so.onkeypress(di_sang_trai, "a") # Bấm nút A để qua trái
cua_so.onkeypress(di_sang_phai, "d")# Bấm nút D để qua phải

🔄 Bước 4: Vòng lặp Game chạy vô tận (Game Loop)

Một trò chơi thực chất là một vòng lặp chạy liên tục với tốc độ cực nhanh để chụp lại hình ảnh nhân vật di chuyển. Chúng ta sẽ dùng vòng lặp while True để làm việc này.

Chúng  gõ đoạn code cuối cùng này ở dưới đáy file:

# --- VÒNG LẶP CHÍNH CỦA GAME ---
while True:
    cua_so.update() # Cập nhật lại hình ảnh trên màn hình
    
    di_chuyen() # Gọi hàm bắt rắn phải bò liên tục
    
    time.sleep(0.1) # Dừng 0.1 giây rồi mới lặp lại (để rắn bò không quá nhanh)

cua_so.mainloop() # Giữ cửa sổ luôn mở

🎯 Kết quả Bài 8:

Khi bấm Run, ta sẽ thấy một màn hình đen hiện ra. Hãy thử bấm các phím W, A, S, D xem, chú rắn xanh sẽ lao đi theo ý muốn của các con! Tuy nhiên, hiện tại rắn bò xuyên qua mồi và bò xuyên ra ngoài màn hình luôn vì chúng ta chưa viết luật chơi.

Hãy chạy thử phần khung này thật mượt mà. Ở bài tiếp theo (Bài 9), chúng ta sẽ lập trình:

  1. Khi rắn chạm vào mồi $\rightarrow$ Mồi nhảy đi chỗ khác, điểm số tăng lên và thân rắn dài ra.

  2. Khi rắn đâm vào tường hoặc tự đâm vào đuôi mình $\rightarrow$ Game Over!