Cách bắt sự kiện bàn phím trong C/C++

Có những cách bắt sự kiện bàn phím nào trong ngôn ngữ lập trình C/C++? Bạn muốn khi nhấn phím ESC thì thoát chương trình? Hay bạn muốn sử dụng các phím mũi tên để điều khiển trò chơi của mình? Bạn muốn khi nhấn phím nào đó thì chương trình sẽ thực hiện một hành động cụ thể? Tất cả sẽ có câu trả lời trong bài viết này.

Cách bắt sự kiện bàn phím trong C/C++

1. Mã ASCII của các ký tự trên bàn phím

Để có thể thực hiện bắt sự kiện bàn phím với bất kỳ ngôn ngữ nào, bạn cần biết mã ASCII của các phím đó. Sau đây là mã ASCII của các phím thông dụng trên bàn phím.

Mã ASCII của các phím thông dụng:

Mình xin 5 phút quảng cáo nha =))
  • Phím Enter : 13
  • Phím ESC: 27
  • Phím Tab: 9
  • Mũi tên lên: 72
  • Mũi tên xuống: 80
  • Mũi tên sang trái: 75
  • Mũi tên sang phải: 77
  • Phím cách: 32

Với các ký tự từ A-Z, a-z  và các ký tự khác, bạn tham khảo thêm tại bài viết bảng mã ascii này nhé.

2. Code in ra mã ASCII phím vừa nhập

Giả sử, bạn cần in ra phím mình vừa nhập là phím gì trên bàn phím, hãy thử mấy dòng code đơn giản sau nhé

Mình chạy demo thử một chút:

Lưu ý: Sẽ có nhiều ký tự không thể in lên màn hình, hoặc in ra các ký tự lạ. Điều đó không có nghĩa là code sai đâu nha.

Đó là phần test chơi, bây giờ chúng ta sẽ đi vào từng bài toán cụ thể.

3. Nhấn ESC để thoát chương trình

Nếu bạn muốn bắt sự kiện bàn phím để thoát chương trình, mục này được viết dành riêng cho bạn đấy.

Giả sử bây giờ bạn có một chương trình lặp vô tận. Và bạn muốn thoát chương trình khi ấn phím ESC? Đơn giản, code sau đây sẽ giúp bạn làm điều đó.

Ở đây mình ví dụ là phím ESC có mã ASCII trong hệ thập phân là 27. Bạn có thể dùng bất cứ phím nào khác nhé.

Nếu bạn cần chương trình chờ để giảm tốc độ chạy thì có thể sử dụng hàm Sleep ở trên có trong thư viện windows.h . Lưu ý, chỉ hoạt động trên Windows. Linux cần sử dụng cách khác.

Dòng if(kbhit()) để kiểm tra có sự kiện nhập phím của người dùng hay không. Nếu có, dùng getch() để tóm phím đó.

Như vậy, bạn thấy bắt sự kiện bàn phím để thoát chương trình có dễ không? Hãy thử code trên với các phím khác nhé.

4. Bắt sự kiện bàn phím các phím mũi tên

Để bắt sự kiện bàn phím với các phím mũi tên, nó sẽ phức tạp hơn chút. Nếu bạn thử code sau với các phím mũi tên. Bạn sẽ ngạc nhiên và không hiểu chuyện gì đang xảy ra.

Đoạn code này in ra mã ASCII của phím vừa nhập.

Mỗi lần bạn nhấn 1 phím mũi tên, có 2 dòng text được in ra. Sẽ luôn có 1 dòng in ra giá trị ASCII hệ thập phân là -32.

Để ngăn chặn việc này, bạn hãy sử dụng một lệnh if để kiểm tra trường hợp có giá trị -32 nhé. Nếu nó xảy ra, thực hiện get lại. Sau đây là code minh họa:

5. Ứng dụng sử dụng bắt sự kiện bàn phím

Với việc bắt sự kiện bàn phím này, bạn có thể làm rất nhiều tính năng hay ho cho các đoạn code. Hoặc có thể xây dựng một số trò chơi nhỏ.

5.1. Chuyển hàm khi nhấn phím

Code dưới đây có thể giúp bạn chuyển đổi 2 chức năng khác nhau khi ấn phím. Bạn sẽ có thể chuyển qua lại giữa hàm f1 và hàm f2 nếu nhấn phím ESC trên bàn phím.

Bạn có thể copy code về để chạy thử và xem thành quả!

5.2. Xây dựng game

Đây là trò game rắn săn mồi mình viết hồi sinh viên năm hai. Video demo này quay lúc chưa hoàn thiện nên có chút lỗi nhỏ.

Code này có sử dụng các phím mũi tên để điều hướng rắn và phím gì đó để play/pause của trò chơi(mình quên cmnr).

Về sau, mình có nâng cấp thêm tính năng sử dụng chuột để chọn các chức năng trên menu.

Nếu bạn quan tâm, có thể xem và tải source code tại đây.

Chú ý: Code này lâu rồi và khá rối, mình không tiện sửa lại 😀

Hi vọng bài viết đã giúp các bạn biết cách bắt sự kiện bàn phím với ngôn ngữ C/C++.

Chúc các bạn học tốt!

avatar
  Subscribe  
newest oldest most voted
Notify of
Duong
Guest
Duong

Làm sao để phân biệt được phím mình đang bấm là “Mũi Tên Xuống” với “P” được ạ, Em thấy nó cùng mã là 80

Vinh Nguyễn
Member
Vinh Nguyễn

anh ơi có cách nào để chương trình bắt sự kiện song song không ạ, giống như khi mình nhấn mũi tên đi xuống và bên phải lần lượt (nhưng vẫn giữ, không nhả) thì nó đi chéo không ạ