# Membina permainan menggunakan acara
Pernahkah anda tertanya-tanya bagaimana laman web tahu bila anda klik butang atau menaip dalam kotak teks? Itulah keajaiban pengaturcaraan berasaskan acara! Apa cara yang lebih baik untuk mempelajari kemahiran penting ini daripada membina sesuatu yang berguna - permainan kelajuan menaip yang bertindak balas terhadap setiap keystroke anda.
Anda akan melihat sendiri bagaimana pelayar web "bercakap" dengan kod JavaScript anda. Setiap kali anda klik, menaip, atau menggerakkan tetikus anda, pelayar menghantar mesej kecil (kami panggil ia acara) kepada kod anda, dan anda yang menentukan bagaimana untuk bertindak balas!
Apabila kita selesai di sini, anda akan membina permainan menaip sebenar yang menjejaki kelajuan dan ketepatan anda. Lebih penting lagi, anda akan memahami konsep asas yang menggerakkan setiap laman web interaktif yang pernah anda gunakan. Jom mulakan!
## Kuiz Pra-Kuliah
[Kuiz pra-kuliah](https://ff-quizzes.netlify.app/web/quiz/21)
## Pengaturcaraan berasaskan acara
Fikirkan tentang aplikasi atau laman web kegemaran anda - apa yang membuatkannya terasa hidup dan responsif? Semuanya tentang bagaimana ia bertindak balas terhadap apa yang anda lakukan! Setiap ketukan, klik, sapuan, atau keystroke mencipta apa yang kami panggil "acara," dan di situlah keajaiban sebenar pembangunan web berlaku.
Inilah yang membuatkan pengaturcaraan untuk web begitu menarik: kita tidak pernah tahu bila seseorang akan klik butang itu atau mula menaip dalam kotak teks. Mereka mungkin klik dengan segera, tunggu lima minit, atau mungkin tidak klik langsung! Ketidakpastian ini bermakna kita perlu berfikir secara berbeza tentang bagaimana kita menulis kod kita.
Daripada menulis kod yang berjalan dari atas ke bawah seperti resipi, kita menulis kod yang duduk dengan sabar menunggu sesuatu berlaku. Ia serupa dengan bagaimana operator telegraf pada tahun 1800-an akan duduk di mesin mereka, bersedia untuk bertindak balas sebaik sahaja mesej datang melalui wayar.
Jadi apa sebenarnya "acara"? Secara ringkas, ia adalah sesuatu yang berlaku! Apabila anda klik butang - itu adalah acara. Apabila anda menaip huruf - itu adalah acara. Apabila anda menggerakkan tetikus anda - itu adalah satu lagi acara.
Pengaturcaraan berasaskan acara membolehkan kita menyediakan kod kita untuk mendengar dan bertindak balas. Kita mencipta fungsi khas yang dipanggil **pendengar acara** yang menunggu dengan sabar untuk perkara tertentu berlaku, kemudian bertindak apabila ia berlaku.
Fikirkan pendengar acara seperti mempunyai loceng pintu untuk kod anda. Anda menyediakan loceng pintu (`addEventListener()`), memberitahunya bunyi apa yang perlu didengar (seperti 'klik' atau 'tekan kekunci'), dan kemudian menentukan apa yang perlu berlaku apabila seseorang menekannya (fungsi khusus anda).
**Inilah cara pendengar acara berfungsi:**
- **Mendengar** tindakan pengguna tertentu seperti klik, keystroke, atau pergerakan tetikus
- **Melaksanakan** kod khusus anda apabila acara yang ditentukan berlaku
- **Bertindak balas** dengan segera terhadap interaksi pengguna, mencipta pengalaman yang lancar
- **Mengendalikan** pelbagai acara pada elemen yang sama menggunakan pendengar yang berbeza
> **NOTE:** Perlu diingat bahawa terdapat pelbagai cara untuk mencipta pendengar acara. Anda boleh menggunakan fungsi tanpa nama, atau mencipta fungsi bernama. Anda boleh menggunakan pelbagai pintasan, seperti menetapkan sifat `click`, atau menggunakan `addEventListener()`. Dalam latihan kita, kita akan fokus pada `addEventListener()` dan fungsi tanpa nama, kerana ia mungkin teknik yang paling biasa digunakan oleh pembangun web. Ia juga yang paling fleksibel, kerana `addEventListener()` berfungsi untuk semua acara, dan nama acara boleh diberikan sebagai parameter.
### Acara biasa
Walaupun pelayar web menawarkan berpuluh-puluh acara yang berbeza untuk anda dengar, kebanyakan aplikasi interaktif hanya bergantung pada beberapa acara penting. Memahami acara teras ini akan memberi anda asas untuk membina interaksi pengguna yang canggih.
Terdapat [berpuluh-puluh acara](https://developer.mozilla.org/docs/Web/Events) yang tersedia untuk anda dengar semasa mencipta aplikasi. Pada dasarnya, apa sahaja yang pengguna lakukan pada halaman akan mencetuskan acara, yang memberi anda banyak kuasa untuk memastikan mereka mendapat pengalaman yang anda inginkan. Nasib baik, anda biasanya hanya memerlukan sebilangan kecil acara. Berikut adalah beberapa acara biasa (termasuk dua yang akan kita gunakan semasa mencipta permainan kita):
| Acara | Penerangan | Kes Penggunaan Biasa |
|-------|-------------|------------------|
| `click` | Pengguna klik sesuatu | Butang, pautan, elemen interaktif |
| `contextmenu` | Pengguna klik butang kanan tetikus | Menu klik kanan khusus |
| `select` | Pengguna menyerlahkan beberapa teks | Penyuntingan teks, operasi salin |
| `input` | Pengguna memasukkan teks | Pengesahan borang, carian masa nyata |
**Memahami jenis acara ini:**
- **Mencetuskan** apabila pengguna berinteraksi dengan elemen tertentu pada halaman anda
- **Menyediakan** maklumat terperinci tentang tindakan pengguna melalui objek acara
- **Membolehkan** anda mencipta aplikasi web yang responsif dan interaktif
- **Berfungsi** secara konsisten merentasi pelayar dan peranti yang berbeza
## Membina permainan
Sekarang anda memahami bagaimana acara berfungsi, mari kita gunakan pengetahuan itu dengan membina sesuatu yang berguna. Kita akan mencipta permainan kelajuan menaip yang menunjukkan pengendalian acara sambil membantu anda membangunkan kemahiran penting sebagai pembangun.
Kita akan mencipta permainan untuk meneroka bagaimana acara berfungsi dalam JavaScript. Permainan kita akan menguji kemahiran menaip pemain, yang merupakan salah satu kemahiran yang paling kurang dihargai tetapi sangat penting untuk pembangun. Fakta menarik: susun atur papan kekunci QWERTY yang kita gunakan hari ini sebenarnya direka pada tahun 1870-an untuk mesin taip - dan kemahiran menaip yang baik masih sama berharganya untuk pengaturcara hari ini! Aliran umum permainan akan kelihatan seperti ini:
```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
```
**Inilah cara permainan kita berfungsi:**
- **Bermula** apabila pemain klik butang mula dan memaparkan petikan rawak
- **Menjejaki** kemajuan menaip pemain perkataan demi perkataan secara masa nyata
- **Menyerlahkan** perkataan semasa untuk membimbing fokus pemain
- **Memberikan** maklum balas visual segera untuk kesalahan menaip
- **Mengira** dan memaparkan jumlah masa apabila petikan selesai
Mari kita bina permainan kita, dan belajar tentang acara!
### Struktur fail
Sebelum kita mula menulis kod, mari kita susun! Mempunyai struktur fail yang bersih dari awal akan menjimatkan anda daripada sakit kepala kemudian dan menjadikan projek anda lebih profesional. 😊
Kita akan menyimpan semuanya ringkas dengan hanya tiga fail: `index.html` untuk struktur halaman kita, `script.js` untuk semua logik permainan kita, dan `style.css` untuk menjadikan semuanya kelihatan hebat. Ini adalah trio klasik yang menggerakkan kebanyakan web!
**Cipta folder baru untuk kerja anda dengan membuka konsol atau tetingkap terminal dan masukkan arahan berikut:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Inilah yang dilakukan oleh arahan ini:**
- **Mencipta** direktori baru bernama `typing-game` untuk fail projek anda
- **Berpindah** ke dalam direktori yang baru dicipta secara automatik
- **Menyiapkan** ruang kerja yang bersih untuk pembangunan permainan anda
**Buka Visual Studio Code:**
```bash
code .
```
**Arahan ini:**
- **Melancarkan** Visual Studio Code dalam direktori semasa
- **Membuka** folder projek anda dalam editor
- **Memberikan** akses kepada semua alat pembangunan yang anda perlukan
**Tambah tiga fail ke folder dalam Visual Studio Code dengan nama berikut:**
- `index.html` - Mengandungi struktur dan kandungan permainan anda
- `script.js` - Mengendalikan semua logik permainan dan pendengar acara
- `style.css` - Menentukan rupa visual dan gaya
## Cipta antara muka pengguna
Sekarang mari kita bina pentas di mana semua aksi permainan kita akan berlaku! Fikirkan ini seperti mereka bentuk panel kawalan untuk kapal angkasa - kita perlu pastikan semua yang pemain kita perlukan berada di tempat yang mereka jangkakan.
Mari kita fikirkan apa yang permainan kita perlukan. Jika anda bermain permainan menaip, apa yang anda mahu lihat di skrin? Berikut adalah apa yang kita perlukan:
| Elemen UI | Tujuan | Elemen HTML |
|------------|---------|-------------|
| Paparan Petikan | Menunjukkan teks untuk ditaip | `
` dengan `id="quote"` |
| Kawasan Mesej | Memaparkan status dan mesej kejayaan | `
` dengan `id="message"` |
| Input Teks | Tempat pemain menaip petikan | `` dengan `id="typed-value"` |
| Butang Mula | Memulakan permainan | `