Cách Bắt Sự Kiện Bàn Phím Trong C/C++ - Lập Trình Không Khó

Bắt sự kiện bàn phím
Bắt sự kiện bàn phím

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++

NỘI DUNG BÀI VIẾT

Toggle
  • 1. Mã ASCII của các ký tự trên bàn phím
  • 2. Code in ra mã ASCII phím vừa nhập
  • 3. Nhấn ESC để thoát chương trình
  • 4. Bắt sự kiện bàn phím các phím mũi tên
  • 5. Ứng dụng sử dụng bắt sự kiện bàn phím
    • 5.1. Chuyển hàm khi nhấn phím
    • 5.2. Xây dựng game

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:

  • 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é

#include<iostream> #include<conio.h> using namespace std; int main() { char key_press; int ascii_value; cout<<"\n\t\tNhap phim bat ky de kiem tra ma ASCII\n\t\t\An ESC de thoat\n\n\n"; while(1) { key_press=getch(); ascii_value=key_press; if(ascii_value==27) // For ESC break; cout<<"Ban nhap phim-> \" "<<key_press<<" \" Gia tri ASCII = "<<ascii_value<<"\n"; } return 0; }
123456789101112131415161718 #include<iostream>#include<conio.h>using namespacestd;intmain(){charkey_press;intascii_value;cout<<"\n\t\tNhap phim bat ky de kiem tra ma ASCII\n\t\t\An ESC de thoat\n\n\n";while(1){key_press=getch();ascii_value=key_press;if(ascii_value==27)// For ESCbreak;cout<<"Ban nhap phim-> \" "<<key_press<<" \" Gia tri ASCII = "<<ascii_value<<"\n";}return0;}

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

Nhap phim bat ky de kiem tra ma ASCII An ESC de thoat Ban nhap phim-> " Q " Gia tri ASCII = 81 Ban nhap phim-> " W " Gia tri ASCII = 87 Ban nhap phim-> " E " Gia tri ASCII = 69 Ban nhap phim-> " s " Gia tri ASCII = 115 Ban nhap phim-> " d " Gia tri ASCII = 100 Ban nhap phim-> " g " Gia tri ASCII = 103
12345678910 Nhap phim bat ky de kiem tra ma ASCII An ESC de thoat Ban nhap phim-> " Q " Gia tri ASCII = 81Ban nhap phim-> " W " Gia tri ASCII = 87Ban nhap phim-> " E " Gia tri ASCII = 69Ban nhap phim-> " s " Gia tri ASCII = 115Ban nhap phim-> " d " Gia tri ASCII = 100Ban nhap phim-> " g " Gia tri ASCII = 103

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é.

C++ #include <stdio.h> #include <conio.h> #include <windows.h> int main(){ char key; while(true){ printf("I love nguyenvanhieu.vn\n"); printf("Sleep...\n"); Sleep(500); if(kbhit()){ key = getch(); if(key == 27){ break; } } } }
1234567891011121314151617 #include <stdio.h>#include <conio.h>#include <windows.h>intmain(){charkey;while(true){printf("I love nguyenvanhieu.vn\n");printf("Sleep...\n");Sleep(500);if(kbhit()){key=getch();if(key==27){break;}}}}

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.

#include <stdio.h> #include <conio.h> int main(){ while(true){ char c = getch(); printf("\nBan vua nhap phim %d", c); } }
12345678 #include <stdio.h>#include <conio.h>intmain(){while(true){charc=getch();printf("\nBan vua nhap phim %d",c);}}

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.

Ban vua nhap phim -32 Ban vua nhap phim 72 Ban vua nhap phim -32 Ban vua nhap phim 77 Ban vua nhap phim -32 Ban vua nhap phim 80 Ban vua nhap phim -32 Ban vua nhap phim 75
12345678 Ban vua nhap phim-32Ban vua nhap phim72Ban vua nhap phim-32Ban vua nhap phim77Ban vua nhap phim-32Ban vua nhap phim80Ban vua nhap phim-32Ban vua nhap phim75

Để 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:

C++ #include <stdio.h> #include <conio.h> int main(){ while(true){ char c = getch(); if(c == -32){ c = getch(); if(c == 72){ printf("Ban vua an phim mui ten len!\n"); } if(c == 80){ printf("Ban vua an phim mui ten xuong!\n"); } if(c == 75){ printf("Ban vua an phim mui ten sang trai!\n"); } if(c == 77){ printf("Ban vua an phim mui ten sang phai!\n"); } if(c == 27) break; } } }
1234567891011121314151617181920212223 #include <stdio.h>#include <conio.h>intmain(){while(true){charc=getch();if(c==-32){c=getch();if(c==72){printf("Ban vua an phim mui ten len!\n");}if(c==80){printf("Ban vua an phim mui ten xuong!\n");}if(c==75){printf("Ban vua an phim mui ten sang trai!\n");}if(c==77){printf("Ban vua an phim mui ten sang phai!\n");}if(c==27)break;}}}

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.

#include <iostream> using namespace std; #include <conio.h> #include <windows.h> void f1(){ cout << "I'm F1'\n"; } void f2(){ cout << "I'm F2'\n"; } int main(){ bool flag = true; char ch; while(true){ if(kbhit()){ ch = getch(); if(ch == 13){ flag = !flag; } } if(flag) f1(); else f2(); Sleep(500); } }
12345678910111213141516171819202122232425262728 #include <iostream>using namespacestd;#include <conio.h>#include <windows.h> voidf1(){cout<<"I'm F1'\n";} voidf2(){cout<<"I'm F2'\n";} intmain(){boolflag=true;charch;while(true){if(kbhit()){ch=getch();if(ch==13){flag=!flag;}}if(flag)f1();elsef2();Sleep(500);}}

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!

Từ khóa » Kbhit Trong C++