# การสร้างเกมโดยใช้เหตุการณ์
คุณเคยสงสัยไหมว่าเว็บไซต์รู้ได้อย่างไรเมื่อคุณคลิกปุ่มหรือพิมพ์ในกล่องข้อความ? นั่นคือความมหัศจรรย์ของโปรแกรมมิ่งแบบขับเคลื่อนด้วยเหตุการณ์! วิธีที่ดีที่สุดในการเรียนรู้ทักษะสำคัญนี้คือการสร้างสิ่งที่มีประโยชน์ - เกมวัดความเร็วการพิมพ์ที่ตอบสนองต่อทุกการกดแป้นที่คุณทำ
คุณจะได้เห็นด้วยตาคุณเองว่าเว็บเบราว์เซอร์ "สื่อสาร" กับโค้ด JavaScript ของคุณอย่างไร ทุกครั้งที่คุณคลิก พิมพ์ หรือเคลื่อนเมาส์ เบราว์เซอร์จะส่งข้อความเล็กๆ (เราเรียกว่าเหตุการณ์) ไปยังโค้ดของคุณ และคุณเป็นคนตัดสินใจว่าจะตอบสนองอย่างไร!
เมื่อเราทำเสร็จแล้ว คุณจะได้สร้างเกมพิมพ์จริงที่ติดตามความเร็วและความแม่นยำของคุณ ที่สำคัญกว่านั้น คุณจะเข้าใจแนวคิดพื้นฐานที่ขับเคลื่อนเว็บไซต์เชิงโต้ตอบทุกเว็บไซต์ที่คุณเคยใช้ มาเริ่มกันเลย!
## แบบทดสอบก่อนบรรยาย
[แบบทดสอบก่อนบรรยาย](https://ff-quizzes.netlify.app/web/quiz/21)
## การเขียนโปรแกรมขับเคลื่อนด้วยเหตุการณ์
คิดถึงแอปหรือเว็บไซต์ที่คุณชื่นชอบ - อะไรทำให้รู้สึกมีชีวิตชีวาและตอบสนอง? มันเกี่ยวกับวิธีที่มันตอบสนองต่อสิ่งที่คุณทำ! ทุกการแตะ คลิก ปัด หรือกดแป้นพิมพ์สร้างสิ่งที่เราเรียกว่า "เหตุการณ์" และนั่นคือจุดที่ความมหัศจรรย์ของการพัฒนาเว็บเกิดขึ้น
นี่คือสิ่งที่ทำให้การเขียนโปรแกรมสำหรับเว็บน่าสนใจ: เราไม่เคยรู้ว่าคนจะคลิกปุ่มนั้นเมื่อไหร่ หรือเริ่มพิมพ์ในกล่องข้อความเมื่อไหร่ พวกเขาอาจคลิกทันที รอห้านาที หรือบางทีอาจไม่คลิกเลย! ความไม่แน่นอนนี้หมายความว่าเราต้องคิดต่างออกไปเกี่ยวกับวิธีการเขียนโค้ดของเรา
แทนที่จะเขียนโค้ดที่ทำงานจากบนลงล่างเหมือนสูตรอาหาร เราจะเขียนโค้ดที่นั่งรออย่างอดทนเพื่อให้บางอย่างเกิดขึ้น เหมือนกับที่โอเปอเรเตอร์โทรเลขในยุค 1800 นั่งอยู่ข้างเครื่องของพวกเขา พร้อมตอบสนองทันทีที่มีข้อความผ่านสายลวด
แล้ว "เหตุการณ์" คืออะไร? ง่ายๆ คือสิ่งที่เกิดขึ้น! เมื่อคุณคลิกปุ่ม—นั่นคือเหตุการณ์ เมื่อคุณพิมพ์ตัวอักษร—นั่นคือเหตุการณ์ เมื่อคุณเคลื่อนเมาส์—นั่นคือเหตุการณ์อีกอย่างหนึ่ง
การเขียนโปรแกรมขับเคลื่อนด้วยเหตุการณ์ช่วยให้เราตั้งค่าโค้ดให้ฟังและตอบสนอง เราสร้างฟังก์ชั่นพิเศษที่เรียกว่า **event listeners** ซึ่งนั่งรออย่างอดทนเพื่อให้สิ่งเฉพาะเกิดขึ้น แล้วทำงานทันทีที่เกิดเหตุการณ์นั้น
เปรียบเสมือน event listeners เหมือนกับการติดตั้งกริ่งประตูสำหรับโค้ดของคุณ คุณตั้งกริ่ง (`addEventListener()`), บอกเสียงที่ต้องฟัง (เช่น 'click' หรือ 'keypress') และระบุว่าจะทำอะไรเมื่อมีคนกดกริ่ง (ฟังก์ชันที่คุณเขียนเอง)
**นี่คือวิธีการทำงานของ event listeners:**
- **ฟัง** การกระทำของผู้ใช้เฉพาะ เช่น การคลิก การกดแป้น หรือการเคลื่อนเมาส์
- **ดำเนินการ** โค้ดที่คุณเขียนเมื่อเกิดเหตุการณ์ที่กำหนด
- **ตอบสนอง** ทันทีต่อปฏิสัมพันธ์ของผู้ใช้ สร้างประสบการณ์ที่ไร้รอยต่อ
- **จัดการ** เหตุการณ์หลายเหตุการณ์บนองค์ประกอบเดียวกันโดยใช้ตัวฟังต่างกันหลายตัว
> **หมายเหตุ:** ควรเน้นว่าวิธีสร้าง event listeners มีหลากหลาย คุณสามารถใช้ฟังก์ชันนิรนาม หรือสร้างฟังก์ชันที่ตั้งชื่อได้ คุณสามารถใช้ทางลัดต่างๆ เช่น การตั้งค่าคุณสมบัติ `click` หรือใช้ `addEventListener()` ในการฝึกนี้เราจะเน้นที่ `addEventListener()` และฟังก์ชันนิรนามเพราะเป็นเทคนิคที่นักพัฒนาเว็บใช้บ่อยที่สุด และมีความยืดหยุ่นสูง เนื่องจาก `addEventListener()` ใช้ได้กับทุกเหตุการณ์ และชื่อเหตุการณ์สามารถระบุเป็นพารามิเตอร์ได้
### เหตุการณ์ทั่วไป
ในขณะที่เว็บเบราว์เซอร์มีเหตุการณ์ให้ฟังหลายสิบเหตุการณ์ แอปโต้ตอบส่วนใหญ่พึ่งพาเพียงไม่กี่เหตุการณ์ที่จำเป็น การเข้าใจเหตุการณ์หลักเหล่านี้จะช่วยให้คุณมีพื้นฐานในการสร้างปฏิสัมพันธ์ผู้ใช้ขั้นสูง
มี [เหตุการณ์หลายสิบเหตุการณ์](https://developer.mozilla.org/docs/Web/Events) ให้คุณฟังเมื่อสร้างแอป โปรแกรมเกือบทุกอย่างที่ผู้ใช้ทำในหน้าเว็บจะกระตุ้นเหตุการณ์ ซึ่งทำให้คุณมีอำนาจสูงในการรับประกันว่าผู้ใช้จะได้รับประสบการณ์ที่คุณต้องการ ปกติแล้วคุณจะต้องการเพียงไม่กี่เหตุการณ์เท่านั้น นี่คือตัวอย่างที่พบบ่อย (รวมถึงสองเหตุการณ์ที่เราจะใช้ในเกมของเรา):
| เหตุการณ์ | คำอธิบาย | กรณีใช้งานทั่วไป |
|-----------|-----------|------------------|
| `click` | ผู้ใช้คลิกบางอย่าง | ปุ่ม, ลิงก์, องค์ประกอบ interactive |
| `contextmenu` | ผู้ใช้คลิกเมาส์ขวา | เมนูคลิกขวาที่กำหนดเอง |
| `select` | ผู้ใช้เลือกข้อความบางส่วน | แก้ไขข้อความ, คัดลอก |
| `input` | ผู้ใช้ป้อนข้อความ | การตรวจสอบแบบฟอร์ม, การค้นหาแบบเรียลไทม์ |
**เข้าใจประเภทเหตุการณ์เหล่านี้:**
- **เปิดใช้งาน** เมื่อผู้ใช้โต้ตอบกับองค์ประกอบเฉพาะในหน้า
- **ให้ข้อมูลรายละเอียด** เกี่ยวกับการกระทำของผู้ใช้ผ่านวัตถุเหตุการณ์
- **ช่วยให้** คุณสร้างเว็บแอปพลิเคชันที่ตอบสนองและโต้ตอบได้
- **ทำงาน** อย่างสม่ำเสมอในเว็บเบราว์เซอร์และอุปกรณ์ต่างๆ
## การสร้างเกม
ตอนนี้คุณเข้าใจวิธีการทำงานของเหตุการณ์แล้ว มาใช้ความรู้นั้นกับการสร้างสิ่งที่มีประโยชน์กัน เราจะสร้างเกมวัดความเร็วการพิมพ์ที่แสดงการจัดการเหตุการณ์ในขณะที่ช่วยพัฒนาทักษะสำคัญของนักพัฒนา
เราจะสร้างเกมเพื่อสำรวจวิธีการทำงานของเหตุการณ์ใน JavaScript เกมของเราจะทดสอบทักษะการพิมพ์ของผู้เล่น ซึ่งเป็นหนึ่งในทักษะที่ผู้พัฒนาทุกคนควรมี เรื่องสนุก: แป้นพิมพ์แผงปุ่ม QWERTY ที่เราใช้ในปัจจุบันถูกออกแบบในปี 1870 สำหรับเครื่องพิมพ์ดีด — และทักษะการพิมพ์ที่ดีนั้นยังมีค่ายิ่งสำหรับโปรแกรมเมอร์สมัยนี้! รูปแบบทั่วไปของเกมจะเป็นดังนี้:
```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
# ลินุกซ์ หรือ macOS
mkdir typing-game && cd typing-game
# วินโดวส์
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"` |
| ปุ่มเริ่ม | เริ่มเกม | `