# Tạo một trò chơi sử dụng sự kiện
Bạn đã bao giờ tự hỏi làm thế nào các trang web biết khi bạn nhấp vào một nút hoặc nhập vào một hộp văn bản chưa? Đó chính là sự kỳ diệu của lập trình dựa trên sự kiện! Cách tốt nhất để học kỹ năng quan trọng này là xây dựng một thứ gì đó hữu ích - một trò chơi đo tốc độ gõ phím phản ứng với từng lần nhấn phím của bạn.
Bạn sẽ trực tiếp thấy cách các trình duyệt web "giao tiếp" với mã JavaScript của bạn. Mỗi lần bạn nhấp chuột, gõ phím hoặc di chuyển chuột, trình duyệt sẽ gửi những thông điệp nhỏ (chúng tôi gọi chúng là sự kiện) đến mã của bạn, và bạn sẽ quyết định cách phản hồi!
Khi chúng ta hoàn thành, bạn sẽ tạo ra một trò chơi gõ phím thực sự theo dõi tốc độ và độ chính xác của bạn. Quan trọng hơn, bạn sẽ hiểu các khái niệm cơ bản làm nền tảng cho mọi trang web tương tác mà bạn từng sử dụng. Hãy bắt đầu nào!
## Câu hỏi trước bài học
[Quiz trước bài học](https://ff-quizzes.netlify.app/web/quiz/21)
## Lập trình dựa trên sự kiện
Hãy nghĩ về ứng dụng hoặc trang web yêu thích của bạn - điều gì khiến nó cảm thấy sống động và phản hồi nhanh? Tất cả là nhờ cách nó phản ứng với những gì bạn làm! Mỗi lần chạm, nhấp chuột, vuốt hoặc nhấn phím tạo ra cái mà chúng tôi gọi là "sự kiện," và đó là nơi mà sự kỳ diệu thực sự của phát triển web diễn ra.
Điều làm cho lập trình web trở nên thú vị là: chúng ta không bao giờ biết khi nào ai đó sẽ nhấp vào nút đó hoặc bắt đầu nhập vào một hộp văn bản. Họ có thể nhấp ngay lập tức, chờ năm phút, hoặc có thể không bao giờ nhấp! Sự không thể đoán trước này có nghĩa là chúng ta cần suy nghĩ khác về cách viết mã.
Thay vì viết mã chạy từ trên xuống dưới như một công thức, chúng ta viết mã ngồi chờ đợi điều gì đó xảy ra. Nó giống như cách các nhân viên điện báo vào thế kỷ 19 ngồi bên máy của họ, sẵn sàng phản hồi ngay khi một thông điệp được gửi qua dây.
Vậy chính xác thì "sự kiện" là gì? Đơn giản mà nói, đó là một điều gì đó xảy ra! Khi bạn nhấp vào một nút - đó là một sự kiện. Khi bạn gõ một chữ cái - đó là một sự kiện. Khi bạn di chuyển chuột - đó là một sự kiện khác.
Lập trình dựa trên sự kiện cho phép chúng ta thiết lập mã để lắng nghe và phản hồi. Chúng ta tạo ra các hàm đặc biệt gọi là **event listeners** (trình lắng nghe sự kiện) chờ đợi một cách kiên nhẫn cho những điều cụ thể xảy ra, sau đó hành động ngay khi chúng xảy ra.
Hãy nghĩ về event listeners như có một chuông cửa cho mã của bạn. Bạn thiết lập chuông cửa (`addEventListener()`), nói cho nó biết âm thanh nào cần lắng nghe (như 'click' hoặc 'keypress'), và sau đó chỉ định điều gì sẽ xảy ra khi ai đó bấm chuông (hàm tùy chỉnh của bạn).
**Cách hoạt động của event listeners:**
- **Lắng nghe** các hành động cụ thể của người dùng như nhấp chuột, gõ phím, hoặc di chuyển chuột
- **Thực thi** mã tùy chỉnh của bạn khi sự kiện được chỉ định xảy ra
- **Phản hồi** ngay lập tức với các tương tác của người dùng, tạo ra trải nghiệm liền mạch
- **Xử lý** nhiều sự kiện trên cùng một phần tử bằng các trình lắng nghe khác nhau
> **NOTE:** Đáng chú ý là có nhiều cách để tạo event listeners. Bạn có thể sử dụng hàm ẩn danh hoặc tạo hàm có tên. Bạn có thể sử dụng các phím tắt khác nhau, như thiết lập thuộc tính `click`, hoặc sử dụng `addEventListener()`. Trong bài tập của chúng ta, chúng ta sẽ tập trung vào `addEventListener()` và hàm ẩn danh, vì đây có lẽ là kỹ thuật phổ biến nhất mà các nhà phát triển web sử dụng. Nó cũng là cách linh hoạt nhất, vì `addEventListener()` hoạt động cho tất cả các sự kiện, và tên sự kiện có thể được cung cấp dưới dạng tham số.
### Các sự kiện phổ biến
Mặc dù các trình duyệt web cung cấp hàng chục sự kiện khác nhau mà bạn có thể lắng nghe, hầu hết các ứng dụng tương tác chỉ dựa vào một số sự kiện cơ bản. Hiểu các sự kiện cốt lõi này sẽ giúp bạn xây dựng các tương tác người dùng phức tạp.
Có [hàng chục sự kiện](https://developer.mozilla.org/docs/Web/Events) mà bạn có thể lắng nghe khi tạo ứng dụng. Về cơ bản, bất cứ điều gì người dùng làm trên trang đều tạo ra một sự kiện, điều này mang lại cho bạn rất nhiều quyền lực để đảm bảo họ có trải nghiệm như mong muốn. May mắn thay, bạn thường chỉ cần một số ít sự kiện. Dưới đây là một vài sự kiện phổ biến (bao gồm hai sự kiện chúng ta sẽ sử dụng khi tạo trò chơi):
| Sự kiện | Mô tả | Các trường hợp sử dụng phổ biến |
|---------|-------|-------------------------------|
| `click` | Người dùng nhấp vào một thứ gì đó | Nút, liên kết, phần tử tương tác |
| `contextmenu` | Người dùng nhấp chuột phải | Menu chuột phải tùy chỉnh |
| `select` | Người dùng chọn một đoạn văn bản | Chỉnh sửa văn bản, thao tác sao chép |
| `input` | Người dùng nhập văn bản | Xác thực biểu mẫu, tìm kiếm thời gian thực |
**Hiểu các loại sự kiện này:**
- **Kích hoạt** khi người dùng tương tác với các phần tử cụ thể trên trang của bạn
- **Cung cấp** thông tin chi tiết về hành động của người dùng thông qua các đối tượng sự kiện
- **Cho phép** bạn tạo các ứng dụng web tương tác, phản hồi nhanh
- **Hoạt động** nhất quán trên các trình duyệt và thiết bị khác nhau
## Tạo trò chơi
Bây giờ bạn đã hiểu cách hoạt động của sự kiện, hãy áp dụng kiến thức đó vào thực tế bằng cách xây dựng một thứ gì đó hữu ích. Chúng ta sẽ tạo một trò chơi đo tốc độ gõ phím để minh họa cách xử lý sự kiện đồng thời giúp bạn phát triển một kỹ năng quan trọng của nhà phát triển.
Chúng ta sẽ tạo một trò chơi để khám phá cách sự kiện hoạt động trong JavaScript. Trò chơi của chúng ta sẽ kiểm tra kỹ năng gõ phím của người chơi, một trong những kỹ năng bị đánh giá thấp nhưng rất quan trọng mà mọi nhà phát triển nên có. Một sự thật thú vị: bố cục bàn phím QWERTY mà chúng ta sử dụng ngày nay thực sự được thiết kế vào những năm 1870 cho máy đánh chữ - và kỹ năng gõ phím tốt vẫn có giá trị như vậy đối với các lập trình viên ngày nay! Quy trình chung của trò chơi sẽ như sau:
```mermaid
flowchart TD
A[Player clicks Start] --> B[Random quote displays]
B --> C[Player types in textbox]
C --> D{Word complete?}
D -->|Yes| E[Highlight next word]
D -->|No| F{Correct so far?}
F -->|Yes| G[Keep normal styling]
F -->|No| H[Show error styling]
E --> I{Quote complete?}
I -->|No| C
I -->|Yes| J[Show success message with time]
G --> C
H --> C
```
**Cách trò chơi của chúng ta hoạt động:**
- **Bắt đầu** khi người chơi nhấp vào nút bắt đầu và hiển thị một câu ngẫu nhiên
- **Theo dõi** tiến trình gõ phím của người chơi từng từ một trong thời gian thực
- **Làm nổi bật** từ hiện tại để hướng dẫn sự tập trung của người chơi
- **Cung cấp** phản hồi trực quan ngay lập tức cho các lỗi gõ phím
- **Tính toán** và hiển thị tổng thời gian khi hoàn thành câu
Hãy cùng xây dựng trò chơi và tìm hiểu về sự kiện!
### Cấu trúc tệp
Trước khi bắt đầu viết mã, hãy tổ chức mọi thứ! Có một cấu trúc tệp sạch sẽ từ đầu sẽ giúp bạn tránh đau đầu sau này và làm cho dự án của bạn chuyên nghiệp hơn. 😊
Chúng ta sẽ giữ mọi thứ đơn giản với chỉ ba tệp: `index.html` cho cấu trúc trang, `script.js` cho tất cả logic trò chơi, và `style.css` để làm cho mọi thứ trông đẹp mắt. Đây là bộ ba cổ điển làm nền tảng cho hầu hết các trang web!
**Tạo một thư mục mới cho công việc của bạn bằng cách mở cửa sổ console hoặc terminal và thực hiện lệnh sau:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Những gì các lệnh này thực hiện:**
- **Tạo** một thư mục mới có tên `typing-game` cho các tệp dự án của bạn
- **Chuyển đến** thư mục vừa tạo một cách tự động
- **Thiết lập** một không gian làm việc sạch sẽ cho việc phát triển trò chơi của bạn
**Mở Visual Studio Code:**
```bash
code .
```
**Lệnh này:**
- **Khởi chạy** Visual Studio Code trong thư mục hiện tại
- **Mở** thư mục dự án của bạn trong trình chỉnh sửa
- **Cung cấp** quyền truy cập vào tất cả các công cụ phát triển bạn cần
**Thêm ba tệp vào thư mục trong Visual Studio Code với các tên sau:**
- `index.html` - Chứa cấu trúc và nội dung của trò chơi
- `script.js` - Xử lý tất cả logic trò chơi và các trình lắng nghe sự kiện
- `style.css` - Định nghĩa giao diện và phong cách trực quan
## Tạo giao diện người dùng
Bây giờ hãy xây dựng sân khấu nơi tất cả hành động của trò chơi sẽ diễn ra! Hãy nghĩ về điều này như thiết kế bảng điều khiển cho một tàu vũ trụ - chúng ta cần đảm bảo mọi thứ mà người chơi cần đều nằm đúng chỗ họ mong đợi.
Hãy tìm hiểu xem trò chơi của chúng ta thực sự cần gì. Nếu bạn đang chơi một trò chơi gõ phím, bạn muốn thấy gì trên màn hình? Đây là những gì chúng ta sẽ cần:
| Phần tử giao diện | Mục đích | Phần tử HTML |
|-------------------|----------|--------------|
| Hiển thị câu | Hiển thị văn bản cần gõ | `
` với `id="quote"` |
| Khu vực thông báo | Hiển thị trạng thái và thông báo thành công | `
` với `id="message"` |
| Nhập văn bản | Nơi người chơi gõ câu | `` với `id="typed-value"` |
| Nút bắt đầu | Bắt đầu trò chơi | `