Mục tiêu và cách chơi
Trong trò chơi này, người chơi nhấn nút B để bắt đầu một lượt. micro:bit hiển thị dấu “-” trong một khoảng chờ ngẫu nhiên. Khi màn hình đổi sang chữ “O”, người chơi nhấn nút A nhanh nhất có thể. Chương trình hiển thị thời gian từ lúc phát tín hiệu đến lúc nhận nút bấm, tính bằng mili giây (ms).
Nếu nhấn A trước tín hiệu, lượt chơi được báo là bấm sớm. Nếu không nhấn trong 5 giây sau tín hiệu, lượt chơi kết thúc với thông báo hết giờ.
Chuẩn bị và phác thảo thuật toán
Cần một micro:bit có nguồn điện và môi trường lập trình MicroPython dành cho micro:bit. Trò chơi chỉ sử dụng màn hình LED cùng hai nút A, B; không cần linh kiện ngoài.
Chia chương trình thành ba giai đoạn: chờ nút B, chờ ngẫu nhiên để phát hiện bấm sớm, rồi phát tín hiệu và đo thời gian nhấn A. Hàm running_time() cung cấp số mili giây kể từ khi chương trình bắt đầu chạy. Lấy thời điểm nhấn A trừ thời điểm phát tín hiệu để có kết quả.
Viết chương trình MicroPython
Nhập chương trình dưới đây vào trình soạn thảo MicroPython và chuyển chương trình sang micro:bit. Khoảng chờ trước tín hiệu được chọn ngẫu nhiên từ 1.000 đến 3.000 ms để người chơi khó đoán trước thời điểm chữ “O” xuất hiện.
from microbit import *
import random
def choi():
button_a.was_pressed() # Xóa lần bấm A còn lưu từ lượt trước
display.show("-")
bat_dau_cho = running_time()
thoi_gian_cho = random.randint(1000, 3000)
while running_time() – bat_dau_cho < thoi_gian_cho:
if button_a.was_pressed() or button_a.is_pressed():
display.scroll("SOM")
return
sleep(10)
if button_a.was_pressed() or button_a.is_pressed():
display.scroll("SOM")
return
display.show("O")
moc_tin_hieu = running_time()
while running_time() – moc_tin_hieu < 5000:
if button_a.was_pressed() or button_a.is_pressed():
ket_qua = running_time() – moc_tin_hieu
display.scroll(str(ket_qua) + " ms")
return
sleep(1)
display.scroll("HET GIO")
while True:
display.show("B")
if button_b.was_pressed():
while button_b.is_pressed():
sleep(10)
choi()
button_b.was_pressed() # Bỏ các lần bấm B trong lúc chơi
sleep(20)
Hàm was_pressed() giúp ghi nhận một lần bấm ngắn giữa hai lần chương trình kiểm tra nút. Hàm is_pressed() bổ sung khả năng phát hiện khi người chơi đang giữ nút A.
Chạy thử từng tình huống
Khi thấy chữ “B”, hãy nhấn rồi thả nút B. Kiểm tra rằng màn hình hiện dấu “-”, sau đó mới hiện chữ “O”. Chỉ nhấn A sau khi thấy “O” và quan sát số mili giây được cuộn trên màn hình.
Chơi lại và cố ý nhấn A khi màn hình còn dấu “-”: chương trình cần hiện “SOM” thay vì một kết quả thời gian. Ở lượt khác, không nhấn A sau khi thấy “O” để kiểm tra thông báo “HET GIO”. Sau mỗi lượt, chữ “B” xuất hiện để mời bắt đầu lượt mới.
Hiểu kết quả đo và giới hạn của trò chơi
Kết quả là khoảng thời gian chương trình đo được từ sau khi lệnh hiển thị “O” hoàn tất đến lúc chương trình nhận nút A. Nó hữu ích để so sánh các lượt chơi trong cùng cách thiết lập, nhưng không phải phép đo chính xác tuyệt đối về phản xạ của con người.
Việc kiểm tra nút theo vòng lặp, thời điểm màn hình thực sự được người chơi nhìn thấy và thao tác nhấn nút đều có thể ảnh hưởng đến kết quả. Vì vậy, không nên diễn giải chênh lệch vài mili giây giữa hai lượt như một khác biệt chắc chắn về khả năng phản xạ.
Mở rộng thành hoạt động học tập
Hãy thay các giá trị 1000 và 3000 trong random.randint() để xem độ dài khoảng chờ ảnh hưởng thế nào đến việc đoán trước tín hiệu. Có thể thay giới hạn 5000 ms bằng một giá trị khác, rồi kiểm tra lại trường hợp hết giờ.
Để luyện xử lý dữ liệu, mỗi người chơi có thể ghi kết quả của nhiều lượt hợp lệ vào bảng, tính giá trị trung bình và nhận xét mức độ dao động. Không đưa các lượt báo “SOM” hoặc “HET GIO” vào phép tính trung bình vì chúng không có kết quả thời gian phản xạ hợp lệ.


