# ការបង្កើតហ្គេមដោយប្រើព្រឹត្តិការណ៍
តើអ្នកធ្លាប់ចាប់អារម្មណ៍ទេថា តើគេហទំព័រមានវិធីដឹងពីពេលដែលអ្នកចុចប៊ូតុង ឬវាយអក្សរចូលទៅក្នុងប្រអប់ខ្សែអត្ថបទដូចម្តេច? នេះជាគំន្យមន្តរបស់កម្មវិធីដែលគ្រប់គ្រងដោយព្រឹត្តិការណ៍! វិធីណាមួយល្អបំផុតក្នុងការរៀនជំនាញសំខាន់នេះ គឺដោយកសាងអ្វីមួយមានប្រយោជន៍ — ហ្គេមវាយល្បឿនដែលឆ្លើយតបនឹងរាល់ការចុចក្តារចុចដែលអ្នកធ្វើ។
អ្នកនឹងឃើញដោយផ្ទាល់វិធីដែលកម្មវិធីរុករកបណ្តាញ "និយាយ" ទៅកូដ JavaScript របស់អ្នក។ រាល់ពេលដែលអ្នកចុច វាយ ឬផ្លាស់ទីកណ្ដុរ កម្មវិធីរុករកកំពុងផ្ញើសារតូចៗ (យើងហៅថា ព្រឹត្តិការណ៍) ទៅកូដរបស់អ្នក ហើយអ្នកមានសិទ្ធិតัดสินចម្លើយថាតើបើករបៀបណា!
នៅពេលដែលយើងបញ្ចប់នៅទីនេះ អ្នកនឹងបានបង្កើតហ្គេមវាយពិតប្រាកដមួយដែលតាមដានល្បឿននិងភាពត្រឹមត្រូវ។ ច្រើនសំខាន់ជាងនេះ អ្នកនឹងយល់ដឹងពីគំនិតមូលដ្ឋានដែលជំរុញគេហទំព័រជាមួយនឹងអន្តរកម្មទាំងអស់ដែលអ្នកធ្លាប់ប្រើ។ ចាប់ផ្តើមទៅ!
## សំណួរពិនិត្យមុនវគ្គសិក្សា
[សំណួរពិនិត្យមុនវគ្គសិក្សា](https://ff-quizzes.netlify.app/web/quiz/21)
## កម្មវិធីដែលគ្រប់គ្រងដោយព្រឹត្តិការណ៍
គិតពីកម្មវិធីឬគេហទំព័រដែលអ្នកចូលចិត្ត — អ្វីធ្វើឲ្យវាហាក់ដូចជាផ្ទេចផ្លាក និងឆ្លើយតប? វាគឺពឹងផ្អែកលើរបៀបវាសកម្មចំពោះអ្វីដែលអ្នកធ្វើ! រាល់ការចុច ការចុចក្តារចុច ការប្រមូល ផ្លាស់ទីឬដើរយកក្នុងកំណត់ព្រឹត្តិការណ៍នេះ បង្កើតអ្វីដែលយើងហៅថា "ព្រឹត្តិការណ៍" ហើយវាជាគន្លងពិសេសនៃការអភិវឌ្ឍគេហទំព័រប្រកបដោយសមត្ថភាព។
នេះគឺជាវត្ថុដែលធ្វើឲ្យកម្មវិធីសម្រាប់បណ្តាញគឺគួរឱ្យចាប់អារម្មណ៍: យើងមិនដឹងទេថា ពេលណាអ្នកណាអាចចុចប៊ូតុងនោះ ឬចាប់ផ្តើមវាយនៅប្រអប់អត្ថបទឡើយ។ គេអាចនឹងចុចភ្លាមៗ រង់ចាំប្រាំនាទី រឺមិនចុចទេ! ការមិនអាចទាយបាននេះមានន័យថា យើងត្រូវគិតខុសពីរបៀបការសរសេរកូដរបស់យើង។
មិនមែនសរសេរកូដដែលរត់ពីលើក្រោមដូចមុខម្ហូបញ៉ាំនោះទេ យើងសរសេរកូដដែលរង់ចាំយ៉ាងអំពេនសម្រាប់អ្វីមួយកើតឡើង។ វាស្រដៀងនឹងអ្នកប្រើតេលេក្រาฟនៅលើសតវត្សទី ១៨០០ដែលអង្គុយដោយម៉ាស៊ីនរបស់ពួកគេ ពីរជាចាំបាច់ឆ្លើយតបភ្លាមៗពេលដែលមានសារ។
តើព្រឹត្តិការណ៍ជាអ្វី? បែបសាមញ្ញ វាជាអ្វីដែលកើតឡើង! ពេលអ្នកចុចប៊ូតុង — នោះជាព្រឹត្តិការណ៍។ ពេលអ្នកវាយតួអក្សរ — នោះជាព្រឹត្តិការណ៍។ ពេលអ្នកផ្លាស់ទីកណ្ដុរ — នោះជាព្រឹត្តិការណ៍មួយទៀត។
កម្មវិធីដែលត្រូវគ្រប់គ្រងដោយព្រឹត្តិការណ៍អនុញ្ញាតឲ្យយើងដាក់កូដរបស់យើងឲ្យស្តាប់និងឆ្លើយតប។ យើងបង្កើតមុខងារពិសេសហៅថា **ស្ដាប់ព្រឹត្តិការណ៍** ដែលរង់ចាំយ៉ាងអំពេនសម្រាប់អ្វីមួយច្បាស់លាស់កើតឡើង ហើយបន្ទាប់មកឆក់ចរន្តចូលសកម្មភាពពេលវាកើត។
គិតពីស្ដាប់ព្រឹត្តិការណ៍ដូចជាមានទូរស័ព្ទច្រកសម្រាប់កូដរបស់អ្នក។ អ្នកដាក់ជាមួយទូរស័ព្ទច្រក (`addEventListener()`), ផ្ដល់សំឡេងដែលត្រូវស្តាប់ (ដូចជា ‘click’ រឺ ‘keypress’), ហើយបញ្ជាក់ថាតើអ្វីគួរត្រូវកើតឡើងពេលដែលមាននរណាម្នាក់ចុចនោះ (មុខងាររបស់អ្នក)។
**នេះជាវិធីស្ដាប់ព្រឹត្តិការណ៍ដំណើរការ:**
- **ស្ដាប់** សម្រាប់សកម្មភាពអ្នកប្រើជាក់លាក់ដូចជាចុច ចុចក្តារចុច ឬផ្លាស់ទីកណ្ដុរ
- **អនុវត្ត** កូដផ្ទាល់ខ្លួនរបស់អ្នកពេលព្រឹត្តិការណ៍បានកើតឡើង
- **ឆ្លើយតប** បន្ទាន់ចំពោះអន្តរកម្មអ្នកប្រើ បង្កើតបទពិសោធន៍រលូនមិនមានឈរ
- **ដោះស្រាយ** ព្រឹត្តិការណ៍ជាច្រើនលើធាតុដូចគ្នា ដោយប្រើស្ដារព្រឹត្តិការណ៍ផ្សេងៗគ្នា
> **[!NOTE]** វាសមរម្យសម្គាល់ថាមានវិធីជាច្រើនដើម្បីបង្កើតស្ដារព្រឹត្តិការណ៍។ អ្នកអាចប្រើមុខងារដែលមិនមានឈ្មោះ ឬបង្កើតមុខងារដែលមានឈ្មោះ។ អ្នកអាចប្រើក្វីកខាត់ផ្សេងៗ ដូចជាការកំណត់គុណលក្ខណៈ `click` ឬប្រើ `addEventListener()`។ ក្នុងលំហាត់របស់យើង យើងនឹងផ្តោតលើ `addEventListener()` និងមុខងារមិនមានឈ្មោះ ព្រោះវាជាវិធីដែលអ្នកអភិវឌ្ឍន៍បណ្តាញភាគច្រើនប្រើ។ វាក៏មានភាពបត់បែនខ្ពស់ផង ដូចដែល `addEventListener()` ធ្វើការសម្រាប់ព្រឹត្តិការណ៍ទាំងអស់ និងអាចផ្ដល់ឈ្មោះព្រឹត្តិការណ៍ជាប៉ារ៉ាម៉ែត្រ។
### ព្រឹត្តិការណ៍រួម
បើទោះបីកម្មវិធីរុករកបណ្តាញផ្ដល់លេខព្រឹត្តិការណ៍ជាច្រើនដែលអ្នកអាចស្ដាប់បាន កម្មវិធីសកម្មភាពច្រើនទើបយូនិយោបល់ច្រើនលើព្រឹត្តិការណ៍សំខាន់ៗមួយចំនួនប៉ុណ្ណោះ។ ការយល់ដឹងពីព្រឹត្តិការណ៍មូលដ្ឋានទាំងនេះ នឹងផ្ដល់គ្រឹះដើម្បីបង្កើតអន្តរកម្មអ្នកប្រើមានសមត្ថភាព។
មាន [ព្រឹត្តិការណ៍ជាច្រើន](https://developer.mozilla.org/docs/Web/Events) សម្រាប់អ្នកស្តាប់នៅពេលបង្កើតកម្មវិធីណាមួយ។ គ្រប់អ្វីដែលអ្នកប្រើធ្វើនៅលើទំព័រមួយបន្ទះបង្កើតព្រឹត្តិការណ៍។ វាផ្ដល់អំណាចច្រើនដើម្បីធានាថាអ្នកប្រើទទួលបានបទពិសោធន៍ដែលអ្នកចង់បាន។ សំណាងល្អ ជាទូទៅ អ្នកត្រូវការព្រឹត្តិការណ៍តិចតួចប៉ុណ្ណោះ។ តោះមកមើលពីព្រឹត្តិការណ៍ទូទៅខ្លះៗ (រួមទាំងពីរព្រឹត្តិការណ៍ដែលយើងនឹងប្រើនៅពេលបង្កើតហ្គេម):
| ព្រឹត្តិការណ៍ | ពិពណ៌នា | ករណីប្រើរួមបញ្ចូល |
|-------------|-----------|-----------------------|
| `click` | អ្នកប្រើបានចុចលើអ្វីមួយ | ប៊ូតុង តំណភ្ជាប់ ធាតុមានអន្តរកម្ម |
| `contextmenu` | អ្នកប្រើបានចុចប៊ូតុងកណ្តុរខាងស្តាំ | មេនឺចុចប៊ូតុងស្តាំសម្រាប់ផ្ទាល់ខ្លួន |
| `select` | អ្នកប្រើបានដាក់ពណ៌លើអត្ថបទខ្លះ | ការកែសម្រួលអត្ថបទ ការចម្លង |
| `input` | អ្នកប្រើបានវាយអត្ថបទមួយ | ការត្រួតពិនិត្យបែបបទ ស្វែងរកពេលជាក់លាក់ |
**ការយល់ដឹងពីប្រភេទព្រឹត្តិការណ៍ទាំងនេះ:**
- **បើកសកម្មភាព** ពេលអ្នកប្រើប្រាស់ធ្វើអន្តរកម្មលើធាតុជាក់លាក់នៅលើទំព័ររបស់អ្នក
- **ផ្ដល់** ព័ត៌មានលម្អិតអំពីសកម្មភាពអ្នកប្រើតាមរយៈវត្ថុព្រឹត្តិការណ៍
- **អនុញ្ញាត** អ្នកបង្កើតកម្មវិធីបណ្តាញដែលឆ្លើយតប និងមានអន្តរកម្ម
- **ដំណើរការ** ដោយមានគោលការណ៍ដូចគ្នាបានលើកម្មវិធីរុករកនិងឧបករណ៍ផ្សេងៗ
## ការបង្កើតហ្គេម
ឥឡូវនេះអ្នកយល់ដឹងពីរបៀបព្រឹត្តិការណ៍ដំណើរការ តោះយកចំណេះដឹងនោះទៅអនុវត្តដោយបង្កើតអ្វីមួយមានប្រយោជន៍។ យើងនឹងបង្កើតហ្គេមវាយល្បឿនមួយដែលបង្ហាញការជួយគ្រប់គ្រងព្រឹត្តិការណ៍ខណៈកំពុងជួយអ្នកបង្កើតជំនាញសំខាន់មួយចំពោះអ្នកអភិវឌ្ឍន៍។
យើងនឹងបង្កើតហ្គេមមួយ ដើម្បីស្វែងយល់ពីរបៀបព្រឹត្តិការណ៍ដំណើរការនៅក្នុង JavaScript។ ហ្គេមរបស់យើងនឹងសាកល្បងជំនាញវាយរបស់អ្នកលេង មួយក្នុងចំណោមជំនាញតិចតួចដែលមានតម្លៃសម្រាប់អ្នកអភិវឌ្ឍន៍ទាំងអស់។ ព័ត៌មានស្ដើងៗ: បន្ទាត់ក្តារចុច QWERTY ដែលយើងប្រើនៅថ្ងៃនេះ ត្រូវបានរចនាឡើងនៅចលនាសតវត្សទី ១៨៧០ សម្រាប់ម៉ាស៊ីនវាយអក្សរ — និងជំនាញវាយល្អនៅតែមើលថ្លៃសម្រាប់អ្នកគូដនៅថ្ងៃនេះ! របៀបលំហូរទូទៅរបស់ហ្គេមមានដូចជា៖
```mermaid
flowchart TD
A[ចំណុចចាប់ផ្តើមលេង] --> B[បង្ហាញអត្ថបទចុងក្រោយរឿង]
B --> C[អ្នកលេងវាយនៅក្នុងប្រអប់អត្ថបទ]
C --> D{ពាក្យបានបញ្ចប់រួចហើយ?}
D -->|បាទ| E[គូសពាក្យបន្ទាប់]
D -->|ទេ| F{ត្រឹមត្រូវរហូតដល់បច្ចុប្បន្ន?}
F -->|បាទ| G[រក្សាររាងទ្រង់ទ្រាយធម្មតា]
F -->|ទេ| H[បង្ហាញរាងកំហុស]
E --> I{អត្ថបទបញ្ចប់រួចហើយ?}
I -->|ទេ| C
I -->|បាទ| J[បង្ហាញសារជោគជ័យជាមួយពេលវេលា]
G --> C
H --> C
```
**នេះជាវិធីដែលហ្គេមរបស់យើងនឹងដំណើរការ:**
- **ចាប់ផ្តើម** នៅពេលអ្នកលេងចុចប៊ូតុងចាប់ផ្តើម ហើយបង្ហាញអត្ថបទយ៉ាងចៃដន្យមួយ
- **តាមដាន** ការវាយវាយចាប់ពីមួយពាក្យទៅមួយពាក្យនៅពេលវិត
- **បង្ហាញខ្លឹមសារពាក្យបច្ចុប្បន្នដើម្បីផ្តោតបំណងអ្នកលេង**
- **ផ្ដល់** មតិយោបល់មើលឃើញភ្លាមៗសម្រាប់កំហុសវាយ
- **គណនានិងបង្ហាញ** ពេលវេលាសរុបនៅពេលសម្រេចការសរសេរអត្ថបទ
ចាំបាច់បង្កើតហ្គេមរបស់យើង ហើយរៀនអំពីព្រឹត្តិការណ៍!
### រចនាសម្ព័ន្ធឯកសារ
មុនចាប់ផ្តើមសរសេរកូដ ហ្នឹងត្រូវរៀបចំឡើង! ការមានរចនាសម្ព័ន្ធឯកសារស្អាតពីដំបូងនឹងជួយអ្នកបញ្ជាក់ក្បាលក្រោយ និងធ្វើឲ្យគម្រោងរបស់អ្នកមើលមានជំនាញជាងមុន។ 😊
យើងនឹងរក្សាថ្មីតែមួយដែលមានបីឯកសារ៖ `index.html` សម្រាប់រចនាសម្ព័ន្ធទំព័រ, `script.js` សម្រាប់គ្រប់គ្រងហ្គេមទាំងមូល, និង `style.css` ដើម្បីធ្វើឲ្យទាំងអស់មើលស្អាត។ នេះជាក្រុមបីគ្រឿងទួតដែលគ្រប់គ្រងបណ្តាញភាគច្រើន!
**បង្កើតថតថ្មីសម្រាប់ការងាររបស់អ្នក ដោយបើកផ្ទាំងបញ្ជា ឬទំព័របញ្ជា និងបញ្ជាក់បញ្ចូលបញ្ជាខាងក្រោម៖**
```bash
# Linux ឬ macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**នេះជាអ្វីដែលបញ្ជាខាងលើធ្វើ៖**
- **បង្កើត** ថតថ្មីឈ្មោះ `typing-game` សម្រាប់ឯកសារគម្រោងរបស់អ្នក
- **ចូលទៅក្នុង** ថតដែលបានបង្កើតថ្មីដោយស្វ័យប្រវត្តិ
- **រៀបចំ** កន្លែងធ្វើការស្អាតសម្រាប់ការអភិវឌ្ឍហ្គេមរបស់អ្នក
**បើក Visual Studio Code៖**
```bash
code .
```
**បញ្ជានេះ:**
- **បើក** Visual Studio Code នៅក្នុងថតបច្ចុប្បន្ន
- **បើក** ថតគម្រោងរបស់អ្នកនៅក្នុងកម្មវិធីកែសម្រួល
- **ផ្ដល់** ការចូលដំណើរការទៅកម្មវិធីអភិវឌ្ឍន៍ទាំងអស់ដែលអ្នកត្រូវការ
**បន្ថែមបីឯកសារចូលក្នុងថតនៅ Visual Studio Code ជាមួយឈ្មោះដូចខាងក្រោម៖**
- `index.html` - មានរចនាសម្ព័ន្ធនិងមាតិកាហ្គេមរបស់អ្នក
- `script.js` - គ្រប់គ្រងតុល្យភាពហ្គេមនិងស្ដារព្រឹត្តិការណ៍
- `style.css` - កំណត់រូបរាងនិងរាងកាយបណ្ដាញ
## បង្កើតចំណុចប្រជុំបណ្ដាញអ្នកប្រើ
ឥឡូវនេះតោះបង្កើតឆាកដែលនឹងធ្វើដំណើរការកម្មវិធីហ្គេមរបស់យើង! គិតថាវាដូចការរចនាផ្ទាំងគ្រប់គ្រងសម្រាប់យន្តហោះចរាចរណ៍ — ពួកយើងត្រូវធានាថា អ្វីៗដែលអ្នកលេងត្រូវការស្ថិតនៅកន្លែងដែលពួកគេទន្ទេញ។
យើងត្រូវកំណត់គ្រាន់តែអ្វីដែលហ្គេមយើងត្រូវការ។ ប្រសិនបើអ្នកកំពុងលេងហ្គេមវាយ តើអ្នកចង់ឃើញអ្វីនៅលើអេក្រង់? នេះជាអ្វីដែលយើងត្រូវការ៖
| ធាតុ UI | គោលបំណង | ធាតុ HTML |
|----------|-----------|------------|
| បង្ហាញពាក្យ | បង្ហាញអត្ថបទដែលត្រូវវាយ | `
` មាន `id="quote"` |
| តំបន់សារ | បង្ហាញស្ថានភាពនិងសារជោគជ័យ | `
` មាន `id="message"` |
| ប្រអប់វាយ | កន្លែងដែលអ្នកលេងវាយពាក្យ | `` មាន `id="typed-value"` |
| ប៊ូតុងចាប់ផ្តើម | ចាប់ផ្តើមហ្គេម | `