ทำความเข้าใจกับข้อกำหนด
- ผู้เล่นทุกคนมีศัตรูที่อยู่ติดกันจำนวน จำกัด
ก่อนอื่นเรากำลังพูดถึงจุดเกิดของผู้เล่นไม่ใช่ตำแหน่งปัจจุบันของผู้เล่นตามจุดที่กำหนดในเกม เพิ่งออกไปให้พ้นทาง
ที่อยู่ติดกันถูกกำหนดอย่างดีเมื่อเราพูดถึงกราฟ เราสามารถคิดถึงแผนที่ที่แสดงถึงความสามารถในการเดินเรือบนแผนที่ - จากนี้ไปใน "กราฟ"
ถ้าโหนดสามารถมีจุดวางไข่ได้มากที่สุดการพูดถึงสิ่งเหล่านั้นว่า "อยู่ติดกัน" ก็สมเหตุสมผลแล้ว หมายเหตุ: ฉันจะไม่ จำกัด โหนดที่จะมีจุดวางไข่เดียวที่มากที่สุดด้วยเหตุผลที่จะปรากฏในภายหลัง
ในการสร้างกราฟเราจะต้องพิจารณาสิ่งต่าง ๆ เช่นกำแพงสะพานบันไดจุดเทเลพอร์ตหรือแม้แต่พิจารณาพื้นที่การบินหากมีผู้เล่นที่สามารถบินได้ แต่ละโหนดแสดงตำแหน่งที่สามารถผ่านได้ การเชื่อมต่อแต่ละหมายถึงการเคลื่อนไหวที่เป็นไปได้
หมายเหตุ: ทราบขนาดและรูปร่างของโหนดและทำงานกับโหนดที่อยู่ติดกันจริง ๆ อย่าพิจารณาจุดต่อจุด อย่าพิจารณาการเชื่อมต่อที่มีความยาว นอกจากนี้ยังใช้โหนดนูน
สามารถสร้างกราฟล่วงหน้าได้แล้ว (แผนที่ถูกสร้างโดยนักออกแบบ) ไม่เช่นนั้นสามารถสร้างได้ทันทีหากสร้างแผนที่แบบสุ่ม
- ผู้เล่นทุกคนมีโอกาสเท่ากันในการเผชิญหน้ากับศัตรูที่อยู่ติดกัน
ฉันจะถือว่าศัตรูเป็นผู้เล่นคนอื่น อีกครั้งเพียงแค่ออกไปให้พ้นทาง
สมมติว่าผู้เล่นแต่ละคนเดินสุ่มความน่าจะเป็นในการค้นหาผู้เล่น ณ จุดที่กำหนด - บนพื้นที่ราบไม่มีสิ่งกีดขวาง - จะได้รับจากฟังก์ชั่น (เกาส์เซียน) ของระยะทางถึงจุดเกิด - จากนี้ไป " ฟังก์ชั่น"
เนื่องจากเรากำลังทำงานกับกราฟเราจะใส่คำอธิบายประกอบบนกราฟแทน
- ขนาดแผนที่ไม่จำเป็นต้องเพิ่มสัดส่วนตามจำนวนผู้เล่น
หากเรามีข้อ จำกัด ในการมีจุดวางไข่เดียวต่อโหนดดังนั้นหากต้องการเพิ่มผู้เล่นมากขึ้นเราจะต้องใช้โหนดขนาดเล็กกว่า หากเราตัดสินใจกราฟก่อนที่เราจะทราบจำนวนผู้เล่นที่เรามีเราอาจต้องแบ่งโหนดสำหรับเกมนั้น ๆ
- ข้อ จำกัด เหล่านี้ไม่ได้ถูกบังคับใช้กับช่องว่างที่ไม่สามารถใช้ได้โดยพลการ
ฉันไม่ได้ตั้งใจจะเพิ่มอุปสรรคในการแก้ปัญหา ถึงอย่างนั้นฉันก็ต้องจัดการกับอุปสรรค หากพวกเขาไม่ได้อยู่ที่นั่นการดำเนินการจะง่ายขึ้น
วิธีการแก้
เราพยายามที่จะวาง N spawn points เพื่อให้โอกาสที่จะได้พบกับผู้เล่นคนอื่นในทุก ๆ spawn points นั้นเท่ากัน
เราสามารถรับการวัดข้อผิดพลาดเป็นผลรวมของความแตกต่างของโอกาสกับค่าเฉลี่ยของโอกาส เราพยายามที่จะลดให้น้อยที่สุด (อันที่จริงแล้วเราต้องการทำให้มันเป็น 0)
ในการทำเช่นนั้นเราจำเป็นต้องรู้ถึงโอกาสในการเผชิญหน้ากับผู้เล่นในแต่ละโหนดของกราฟ
ในการคำนวณโอกาสนั้นให้เริ่มด้วยศูนย์ เนื่องจากโอกาสในการค้นหาผู้เล่นบนโหนดที่กำหนดเมื่อไม่มีผู้เล่นจะเป็นศูนย์ จากนั้นสำหรับแต่ละจุดวางไข่ให้เดินกราฟเพื่อเพิ่มโอกาสที่ใส่หมายเหตุประกอบไว้มูลค่าของฟังก์ชันสำหรับจุดวางไข่ปัจจุบัน
หมายเหตุ 1: การเพิ่มหรือย้ายจุดวางไข่จะส่งผลต่อโอกาสที่จะพบผู้เล่นทุกแผนที่
หมายเหตุ 2: การติดตามจำนวนจุดวางไข่แต่ละครั้งที่มีผลต่อโอกาสจะทำให้สิ่งต่าง ๆ ง่ายขึ้น
หมายเหตุ 3: เนื่องจากโหนดมีขนาดเท่าใดคุณจะได้รับข้อผิดพลาด = ศูนย์ขึ้นอยู่กับขนาดของโหนด คุณสามารถแม่นยำยิ่งขึ้นด้วยการทำงานกับช่วงของค่า (โอกาสน้อยที่สุดและโอกาสสูงสุดขึ้นอยู่กับตำแหน่งเฉพาะของจุดวางไข่ภายในโหนด)
วางจุดวางไข่โดยการสุ่มจากนั้นเริ่มเคลื่อนที่ในลักษณะที่ว่าข้อผิดพลาดมีขนาดเล็กลง (พิจารณาการเคลื่อนไหวที่เป็นไปได้และถ้าหากข้อผิดพลาดนั้นลดลงให้เก็บไว้มิฉะนั้นเปลี่ยนกลับ) และดำเนินการต่อไปจนกว่าเราจะไม่สามารถปรับปรุงเพิ่มเติมได้อีก (การทำซ้ำมากเกินไปโดยไม่มีการปรับปรุงหรือข้อผิดพลาดเป็นศูนย์)
หมายเหตุ 4: เมื่อย้ายจุดวางไข่คุณสามารถใช้โอกาสที่จะพบผู้เล่น (ยกเว้นจุดเกิดที่คุณจะย้าย) เพื่อสุ่มเลือกตำแหน่งใหม่สำหรับจุดวางไข่เช่นตำแหน่งที่มีโอกาสพบผู้เล่นใกล้ชิดกับ ค่าเฉลี่ยมีแนวโน้มมากขึ้น ฉันเตือนคุณว่าการย้ายจุดวางไข่จะส่งผลต่อค่าเฉลี่ย
พฤติกรรมที่คาดหวังก็คือจุดเกิดที่อยู่ใกล้กันมากเกินไปจะแยกออกจากกันและเกิดจุดที่ห่างกันมากเกินไป จนกว่าพวกเขาจะถึงสมดุล
หากการวนซ้ำที่กำหนดคุณมีจุดวางไข่หลายจุดบนโหนด (ซึ่งไม่น่าเป็นไปได้เนื่องจากมันควรจะแยกออกจากกัน แต่เป็นไปได้ถ้าคุณมีโหนดใหญ่พอ) ให้แยกโหนดและดำเนินการแก้ไขต่อไป การแบ่งโหนดใด ๆ นั้นถูกต้อง
วิธีการแก้ปัญหาข้างต้นจะเข้าหา error = zero แต่ไม่รับประกันว่าจะถึงศูนย์ คุณสามารถดำเนินการได้จนกว่าจะถึงจุดต่ำสุดในพื้นที่ ... ตามทฤษฎีแล้วคุณสามารถแบ่งโหนดเพื่อทำให้เป็นศูนย์ได้อย่างแน่นอน ... แต่นั่นก็เท่ากับการปรับแต่งพิกัดจุดวางไข่!
ลองจำลองการอบอ่อนเพื่อย้ายจุดวางไข่ภายในโหนด ถึงแม้ว่าจริงๆแล้วมันอาจไม่คุ้มค่าที่จะต้องใส่ใจกับรายละเอียดในระดับดังกล่าว
ฉันต้องการทำให้ชัดเจนว่าผลลัพธ์สำหรับแผนที่แบบเรียบไม่มีสิ่งกีดขวางจะไม่กระจายจุดอย่างสม่ำเสมอ หากแผนที่มีขอบ (นั่นคือถ้ามันไม่พันรอบ) ก็จะมีจุดวางไข่ใกล้กับขอบมากขึ้นนั่นเป็นเพราะจุดที่อยู่ตรงกลางสามารถเข้าถึงได้จากทิศทางที่มากขึ้นซึ่งเป็นการเพิ่มโอกาสในการเผชิญหน้า ผู้เล่นคนอื่น ๆ ดังนั้นให้แต้มแยกออกจากกันใกล้กับศูนย์