# สร้างเกมโดยใช้เหตุการณ์
คุณเคยสงสัยไหมว่าเว็บไซต์รู้ได้อย่างไรเมื่อคุณคลิกปุ่มหรือพิมพ์ในกล่องข้อความ? นั่นคือความมหัศจรรย์ของการเขียนโปรแกรมแบบขับเคลื่อนด้วยเหตุการณ์! ไม่มีวิธีไหนที่จะเรียนรู้ทักษะสำคัญนี้ได้ดีไปกว่าการสร้างสิ่งที่มีประโยชน์ - เกมวัดความเร็วในการพิมพ์ที่ตอบสนองต่อทุกการกดแป้นพิมพ์ของคุณ
คุณจะได้เห็นด้วยตัวเองว่าเบราว์เซอร์ "พูดคุย" กับโค้ด JavaScript ของคุณอย่างไร ทุกครั้งที่คุณคลิก พิมพ์ หรือเลื่อนเมาส์ เบราว์เซอร์จะส่งข้อความเล็กๆ (เราเรียกมันว่าเหตุการณ์) ไปยังโค้ดของคุณ และคุณจะเป็นคนตัดสินใจว่าจะตอบสนองอย่างไร!
เมื่อเราทำเสร็จ คุณจะได้สร้างเกมพิมพ์ที่ติดตามความเร็วและความแม่นยำของคุณ ที่สำคัญกว่านั้น คุณจะเข้าใจแนวคิดพื้นฐานที่ขับเคลื่อนทุกเว็บไซต์แบบโต้ตอบที่คุณเคยใช้ มาเริ่มกันเลย!
## แบบทดสอบก่อนเรียน
[แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/web/quiz/21)
## การเขียนโปรแกรมแบบขับเคลื่อนด้วยเหตุการณ์
ลองคิดถึงแอปหรือเว็บไซต์ที่คุณชื่นชอบ - อะไรทำให้มันดูมีชีวิตชีวาและตอบสนอง? ทั้งหมดนี้เกี่ยวกับการตอบสนองต่อสิ่งที่คุณทำ! ทุกการแตะ คลิก ปัด หรือกดแป้นพิมพ์สร้างสิ่งที่เราเรียกว่า "เหตุการณ์" และนั่นคือที่มาของความมหัศจรรย์ของการพัฒนาเว็บ
สิ่งที่ทำให้การเขียนโปรแกรมสำหรับเว็บน่าสนใจคือ เราไม่เคยรู้เลยว่าใครจะคลิกปุ่มนั้นหรือเริ่มพิมพ์ในกล่องข้อความเมื่อไหร่ พวกเขาอาจคลิกทันที รอห้านาที หรืออาจไม่คลิกเลย! ความไม่แน่นอนนี้หมายความว่าเราต้องคิดต่างออกไปเกี่ยวกับวิธีการเขียนโค้ดของเรา
แทนที่จะเขียนโค้ดที่ทำงานจากบนลงล่างเหมือนสูตรอาหาร เราเขียนโค้ดที่รอคอยอย่างอดทนเพื่อบางสิ่งที่จะเกิดขึ้น มันคล้ายกับวิธีที่ผู้ควบคุมโทรเลขในยุค 1800 นั่งข้างเครื่องของพวกเขา พร้อมที่จะตอบสนองทันทีเมื่อข้อความผ่านสายเข้ามา
แล้ว "เหตุการณ์" คืออะไร? พูดง่ายๆ ก็คือมันคือสิ่งที่เกิดขึ้น! เมื่อคุณคลิกปุ่ม - นั่นคือเหตุการณ์ เมื่อคุณพิมพ์ตัวอักษร - นั่นคือเหตุการณ์ เมื่อคุณเลื่อนเมาส์ - นั่นคืออีกเหตุการณ์หนึ่ง
การเขียนโปรแกรมแบบขับเคลื่อนด้วยเหตุการณ์ช่วยให้เราตั้งค่าโค้ดของเราให้ฟังและตอบสนอง เราสร้างฟังก์ชันพิเศษที่เรียกว่า **event listeners** ที่รอคอยอย่างอดทนสำหรับสิ่งที่เฉพาะเจาะจงที่จะเกิดขึ้น แล้วกระโดดเข้าสู่การทำงานเมื่อมันเกิดขึ้น
ลองนึกถึง event listeners เหมือนการมีออดสำหรับโค้ดของคุณ คุณตั้งค่าออด (`addEventListener()`), บอกมันว่าเสียงอะไรที่ต้องฟัง (เช่น 'click' หรือ 'keypress') และระบุว่าจะเกิดอะไรขึ้นเมื่อมีคนกดออด (ฟังก์ชันที่คุณกำหนดเอง)
**นี่คือวิธีการทำงานของ event listeners:**
- **ฟัง** การกระทำของผู้ใช้เฉพาะ เช่น คลิก กดแป้นพิมพ์ หรือเลื่อนเมาส์
- **ดำเนินการ** โค้ดที่คุณกำหนดเองเมื่อเหตุการณ์ที่ระบุเกิดขึ้น
- **ตอบสนอง** ทันทีต่อการโต้ตอบของผู้ใช้ สร้างประสบการณ์ที่ราบรื่น
- **จัดการ** เหตุการณ์หลายเหตุการณ์ในองค์ประกอบเดียวกันโดยใช้ listeners ต่างๆ
> **NOTE:** ควรเน้นว่ามีหลายวิธีในการสร้าง event listeners คุณสามารถใช้ฟังก์ชันนิรนาม หรือสร้างฟังก์ชันที่มีชื่อ คุณสามารถใช้ทางลัดต่างๆ เช่น การตั้งค่าคุณสมบัติ `click` หรือใช้ `addEventListener()` ในการฝึกของเรา เราจะมุ่งเน้นไปที่ `addEventListener()` และฟังก์ชันนิรนาม เนื่องจากเป็นเทคนิคที่นักพัฒนาเว็บใช้กันมากที่สุด นอกจากนี้ยังมีความยืดหยุ่นมากที่สุด เนื่องจาก `addEventListener()` ใช้ได้กับทุกเหตุการณ์ และชื่อเหตุการณ์สามารถระบุเป็นพารามิเตอร์ได้
### เหตุการณ์ทั่วไป
ในขณะที่เบราว์เซอร์เว็บมีเหตุการณ์หลายสิบเหตุการณ์ที่คุณสามารถฟังได้ แอปพลิเคชันแบบโต้ตอบส่วนใหญ่พึ่งพาเหตุการณ์สำคัญเพียงไม่กี่เหตุการณ์ การเข้าใจเหตุการณ์หลักเหล่านี้จะช่วยให้คุณมีพื้นฐานในการสร้างการโต้ตอบของผู้ใช้ที่ซับซ้อน
มี [เหตุการณ์หลายสิบ](https://developer.mozilla.org/docs/Web/Events) ที่คุณสามารถฟังได้เมื่อสร้างแอปพลิเคชัน โดยพื้นฐานแล้วทุกสิ่งที่ผู้ใช้ทำบนหน้าเว็บจะสร้างเหตุการณ์ ซึ่งทำให้คุณมีพลังมากมายในการทำให้พวกเขาได้รับประสบการณ์ที่คุณต้องการ โชคดีที่คุณมักจะต้องใช้เหตุการณ์เพียงไม่กี่เหตุการณ์ นี่คือเหตุการณ์ทั่วไปบางส่วน (รวมถึงสองเหตุการณ์ที่เราจะใช้เมื่อสร้างเกมของเรา):
| เหตุการณ์ | คำอธิบาย | กรณีการใช้งานทั่วไป |
|------------|-----------|----------------------|
| `click` | ผู้ใช้คลิกบางสิ่ง | ปุ่ม ลิงก์ องค์ประกอบแบบโต้ตอบ |
| `contextmenu` | ผู้ใช้คลิกปุ่มเมาส์ขวา | เมนูคลิกขวาแบบกำหนดเอง |
| `select` | ผู้ใช้ไฮไลต์ข้อความบางส่วน | การแก้ไขข้อความ การคัดลอก |
| `input` | ผู้ใช้ป้อนข้อความ | การตรวจสอบฟอร์ม การค้นหาแบบเรียลไทม์ |
**การเข้าใจประเภทของเหตุการณ์เหล่านี้:**
- **กระตุ้น** เมื่อผู้ใช้โต้ตอบกับองค์ประกอบเฉพาะบนหน้าเว็บของคุณ
- **ให้** ข้อมูลรายละเอียดเกี่ยวกับการกระทำของผู้ใช้ผ่านวัตถุเหตุการณ์
- **ช่วยให้** คุณสร้างแอปพลิเคชันเว็บแบบโต้ตอบที่ตอบสนอง
- **ทำงาน** อย่างสม่ำเสมอในเบราว์เซอร์และอุปกรณ์ต่างๆ
## สร้างเกม
ตอนนี้คุณเข้าใจวิธีการทำงานของเหตุการณ์แล้ว มาลองนำความรู้นี้ไปใช้โดยการสร้างสิ่งที่มีประโยชน์ เราจะสร้างเกมวัดความเร็วในการพิมพ์ที่แสดงการจัดการเหตุการณ์ในขณะที่ช่วยให้คุณพัฒนาทักษะสำคัญของนักพัฒนา
เรากำลังจะสร้างเกมเพื่อสำรวจวิธีการทำงานของเหตุการณ์ใน JavaScript เกมของเราจะทดสอบทักษะการพิมพ์ของผู้เล่น ซึ่งเป็นหนึ่งในทักษะที่นักพัฒนามักมองข้ามไป ข้อเท็จจริงที่น่าสนใจ: แป้นพิมพ์ QWERTY ที่เราใช้ในปัจจุบันถูกออกแบบในปี 1870 สำหรับเครื่องพิมพ์ดีด - และทักษะการพิมพ์ที่ดียังคงมีคุณค่าอย่างมากสำหรับโปรแกรมเมอร์ในปัจจุบัน! ลำดับการทำงานของเกมจะมีลักษณะดังนี้:
```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
```
**นี่คือวิธีการทำงานของเกมของเรา:**
- **เริ่มต้น** เมื่อผู้เล่นคลิกปุ่มเริ่มและแสดงข้อความสุ่ม
- **ติดตาม** ความคืบหน้าในการพิมพ์ของผู้เล่นทีละคำแบบเรียลไทม์
- **เน้น** คำปัจจุบันเพื่อช่วยให้ผู้เล่นโฟกัส
- **ให้** ข้อเสนอแนะภาพทันทีสำหรับข้อผิดพลาดในการพิมพ์
- **คำนวณ** และแสดงเวลารวมเมื่อพิมพ์ข้อความเสร็จสิ้น
มาสร้างเกมของเราและเรียนรู้เกี่ยวกับเหตุการณ์กันเถอะ!
### โครงสร้างไฟล์
ก่อนที่เราจะเริ่มเขียนโค้ด มาจัดระเบียบกันก่อน! การมีโครงสร้างไฟล์ที่สะอาดตั้งแต่เริ่มต้นจะช่วยให้คุณไม่ปวดหัวในภายหลังและทำให้โปรเจกต์ของคุณดูเป็นมืออาชีพ 😊
เราจะทำให้ทุกอย่างง่ายด้วยไฟล์เพียงสามไฟล์: `index.html` สำหรับโครงสร้างหน้าเว็บของเรา, `script.js` สำหรับตรรกะของเกมทั้งหมด และ `style.css` เพื่อทำให้ทุกอย่างดูดี นี่คือสามสิ่งที่ขับเคลื่อนเว็บส่วนใหญ่!
**สร้างโฟลเดอร์ใหม่สำหรับงานของคุณโดยเปิดคอนโซลหรือหน้าต่างเทอร์มินัลและใช้คำสั่งต่อไปนี้:**
```bash
# Linux or 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` - จัดการตรรกะของเกมและ event listeners ทั้งหมด
- `style.css` - กำหนดรูปลักษณ์และการจัดรูปแบบ
## สร้างส่วนติดต่อผู้ใช้
ตอนนี้มาสร้างเวทีที่การดำเนินการของเกมทั้งหมดจะเกิดขึ้น! ลองนึกถึงสิ่งนี้เหมือนการออกแบบแผงควบคุมสำหรับยานอวกาศ - เราต้องแน่ใจว่าสิ่งที่ผู้เล่นของเราต้องการอยู่ในตำแหน่งที่พวกเขาคาดหวัง
มาดูกันว่าเกมของเราต้องการอะไรจริงๆ หากคุณกำลังเล่นเกมพิมพ์ คุณอยากเห็นอะไรบนหน้าจอ? นี่คือสิ่งที่เราต้องการ:
| องค์ประกอบ UI | วัตถุประสงค์ | องค์ประกอบ HTML |
|----------------|--------------|------------------|
| การแสดงข้อความ | แสดงข้อความที่ต้องพิมพ์ | `
` พร้อม `id="quote"` |
| พื้นที่ข้อความ | แสดงสถานะและข้อความสำเร็จ | `
` พร้อม `id="message"` |
| กล่องข้อความ | ที่ที่ผู้เล่นพิมพ์ข้อความ | `` พร้อม `id="typed-value"` |
| ปุ่มเริ่ม | เริ่มเกม | `