# สร้างเกมจำลอง: ใช้รูปแบบการออกแบบ ## ภาพรวมของงาน นำความรู้ใหม่เกี่ยวกับรูปแบบการออกแบบมาใช้โดยการสร้างต้นแบบเกมง่ายๆ! งานนี้จะช่วยให้คุณฝึกฝนทั้งรูปแบบสถาปัตยกรรม (การสืบทอดหรือการประกอบ) และระบบการสื่อสาร pub/sub ที่คุณได้เรียนรู้ในบทเรียน ## คำแนะนำ สร้างตัวแทนเกมง่ายๆ ที่แสดงให้เห็นถึงรูปแบบการออกแบบจากบทเรียนนี้ เกมของคุณควรใช้งานได้ แต่ไม่จำเป็นต้องมีกราฟิกที่ซับซ้อน \u2013 เน้นที่สถาปัตยกรรมพื้นฐานและรูปแบบการสื่อสาร ### ข้อกำหนด **เลือกแบบสถาปัตยกรรมของคุณ:** - **ตัวเลือก A**: ใช้การสืบทอดแบบคลาส (เช่นตัวอย่าง `GameObject` → `Movable` → `Hero`) - **ตัวเลือก B**: ใช้การประกอบ (เช่นวิธีการฟังก์ชันโรงงานที่มีพฤติกรรมผสม) **การสื่อสาร:** - **รวม** คลาส `EventEmitter` สำหรับการส่งข้อความแบบ pub/sub - **ตั้งค่า** ประเภทข้อความอย่างน้อย 2-3 ประเภท (เช่น `PLAYER_MOVE`, `ENEMY_SPAWN`, `SCORE_UPDATE`) - **เชื่อมต่อ** การป้อนข้อมูลของผู้ใช้ (คีย์บอร์ด/เมาส์) กับเหตุการณ์ในเกมผ่านระบบเหตุการณ์ **องค์ประกอบของเกมที่ต้องมี:** - ตัวละครที่ผู้เล่นควบคุมได้อย่างน้อยหนึ่งตัว - วัตถุเกมอื่นอย่างน้อยหนึ่งอย่าง (ศัตรู, สิ่งที่เก็บได้, หรือองค์ประกอบสิ่งแวดล้อม) - การโต้ตอบพื้นฐานระหว่างวัตถุ (การชนกัน, การเก็บ, หรือการสื่อสาร) ### ไอเดียเกมที่แนะนำ **เกมง่ายๆ ที่ควรพิจารณา:** - **เกมงู** \u2013 ส่วนของงูตามหัว งูจะกินอาหารที่เกิดขึ้นแบบสุ่ม - **เกมปิงปอง** \u2013 แป้นรับการป้อนข้อมูล ลูกบอลเด้งออกจากกำแพง - **เกมเก็บของ** \u2013 ผู้เล่นเคลื่อนที่ไปรอบๆ เพื่อเก็บไอเท็มและหลบหลีกสิ่งกีดขวาง - **เกมป้องกันฐาน** \u2013 หอคอยตรวจจับและยิงศัตรูที่เคลื่อนที่ ### แนวทางโครงสร้างโค้ด ```javascript // Example starting structure const Messages = { // Define your game messages here }; class EventEmitter { // Your event system implementation } // Choose either class-based OR composition approach // Class-based example: class GameObject { /* base properties */ } class Player extends GameObject { /* player-specific behavior */ } // OR Composition example: const gameObject = { /* base properties */ }; const movable = { /* movement behavior */ }; function createPlayer() { /* combine behaviors */ } ``` ### การทดสอบการใช้งาน **ตรวจสอบว่าโค้ดของคุณทำงานโดย:** - **ทดสอบ** ว่าวัตถุเคลื่อนที่หรือเปลี่ยนแปลงเมื่อมีการเรียกเหตุการณ์ - **ยืนยัน** ว่าวัตถุหลายตัวสามารถตอบสนองต่อเหตุการณ์เดียวกันได้ - **ตรวจสอบ** ว่าคุณสามารถเพิ่มพฤติกรรมใหม่ได้โดยไม่ต้องแก้ไขโค้ดที่มีอยู่ - **ตรวจสอบ** ว่าการป้อนข้อมูลจากคีย์บอร์ด/เมาส์เรียกเหตุการณ์ในเกมได้อย่างถูกต้อง ## แนวทางการส่งงาน **งานที่คุณส่งควรประกอบด้วย:** 1. **ไฟล์ JavaScript** ที่มีการใช้งานเกมของคุณ 2. **ไฟล์ HTML** เพื่อรันและทดสอบเกมของคุณ (สามารถเรียบง่ายได้) 3. **ความคิดเห็น** อธิบายว่าคุณเลือกใช้รูปแบบใดและเหตุผล 4. **เอกสารสั้นๆ** เกี่ยวกับประเภทข้อความและสิ่งที่พวกมันทำ ## เกณฑ์การให้คะแนน | เกณฑ์ | ดีเยี่ยม (3 คะแนน) | เพียงพอ (2 คะแนน) | ต้องปรับปรุง (1 คะแนน) | |----------|---------------------|---------------------|------------------------------| | **รูปแบบสถาปัตยกรรม** | ใช้การสืบทอดหรือการประกอบอย่างถูกต้องพร้อมลำดับชั้นคลาส/วัตถุที่ชัดเจน | ใช้รูปแบบที่เลือกด้วยปัญหาเล็กน้อยหรือไม่สอดคล้องกัน | พยายามใช้รูปแบบแต่การใช้งานมีปัญหาสำคัญ | | **การใช้งาน Pub/Sub** | EventEmitter ทำงานได้อย่างถูกต้องกับประเภทข้อความหลายประเภทและการไหลของเหตุการณ์ที่เหมาะสม | ระบบ pub/sub พื้นฐานทำงานได้พร้อมการจัดการเหตุการณ์บางส่วน | ระบบเหตุการณ์มีอยู่แต่ทำงานไม่เสถียร | | **ฟังก์ชันการทำงานของเกม** | มีองค์ประกอบที่โต้ตอบได้สามอย่างขึ้นไปที่สื่อสารผ่านเหตุการณ์ | มีองค์ประกอบที่โต้ตอบได้สองอย่างพร้อมการสื่อสารเหตุการณ์พื้นฐาน | มีองค์ประกอบหนึ่งที่ตอบสนองต่อเหตุการณ์หรือการโต้ตอบพื้นฐาน | | **คุณภาพของโค้ด** | โค้ดสะอาด มีความคิดเห็นที่ดี พร้อมการจัดระเบียบที่มีเหตุผลและใช้ JavaScript สมัยใหม่ | โค้ดจัดระเบียบได้ดีโดยทั่วไปพร้อมความคิดเห็นที่เพียงพอ | โค้ดทำงานได้แต่ขาดการจัดระเบียบหรือความคิดเห็นที่ชัดเจน | **คะแนนโบนัส:** - **กลไกเกมที่สร้างสรรค์** ที่แสดงให้เห็นการใช้รูปแบบที่น่าสนใจ - **วิธีการป้อนข้อมูลหลายแบบ** (เหตุการณ์คีย์บอร์ดและเมาส์) - **สถาปัตยกรรมที่ขยายได้** ซึ่งสามารถเพิ่มฟีเจอร์ใหม่ได้ง่าย --- **ข้อจำกัดความรับผิดชอบ**: เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้