ลดจำนวนขอบของกราฟทำให้เชื่อมต่อ


10

ฉันกำลังออกแบบเกมที่มีคุกใต้ดินที่สร้างแบบสุ่ม ฉันต้องการดูสิ่งนี้เป็นกราฟที่เชื่อมต่อและไม่มีทิศทางซึ่งโหนดเป็นห้องและขอบเป็นประตูหรือทางเดิน จากนั้นฉันเลือกโหนด "ด้าน" เป็นทางเข้าดันเจี้ยนฉันคำนวณระยะทางระหว่างทางเข้านี้และโหนดอื่น ๆ ทั้งหมดและตัดสินใจว่าหนึ่งในโหนดที่ไกลที่สุดคือ "เป้าหมาย" ของดันเจี้ยน (ที่ตั้งของสมบัติเจ้านาย เจ้าหญิง ฯลฯ )

ฉันเห็น 2 วิธีในการสร้างภูมิประเทศของดันเจี้ยนสุดท้าย:

  • สร้างกราฟสุ่มครั้งแรกจากนั้นลองเติมโลก 2d ด้วยห้องพักในสถานที่สุ่มโดยคำนึงถึงการเชื่อมต่อที่ขอบ ฉันคิดว่านี่อาจเป็นเรื่องยากเพราะการสร้างห้องอาจ "ล็อค" พยายามที่จะติดตั้งห้องในที่ที่เป็นไปไม่ได้
  • สร้างห้องแรกโดยวางแบบสุ่มในตำแหน่งที่ต้องการจากนั้นจับคู่ผลลัพธ์กับโหนดและขอบ ฉันตัดสินใจที่จะลองสิ่งนี้

ความคิดของฉันประกอบด้วย:

  • ก่อนอื่นให้สร้างห้องขนาดใหญ่ที่มีห้องใต้ดินทั้งหมด
  • วางผนังด้านในห้องใหญ่ที่ตำแหน่งสุ่มแบ่งห้องใหญ่เป็นห้องเล็ก 2 ห้องที่แตกต่างกัน
  • จากนั้นฉันก็แบ่งห้องแต่ละห้องออกเป็น 2 จนกว่าจะมีขนาดเล็กเกินไปหรือจำนวนห้องทั้งหมดถึงจำนวนสูงสุด (หรือเงื่อนไขอื่น ๆ ) ห้องใหม่แต่ละห้องเป็นโหนด
  • เมื่อเสร็จแล้วฉันจะตรวจสอบแต่ละห้องและค้นหาห้องอื่นที่อยู่ติดกันโดยทำเครื่องหมาย 2 โหนดว่าเชื่อมต่อกันด้วยขอบ

ด้วยวิธีนี้ฉันจึงมั่นใจได้ว่าห้องพักทุกห้องมีตำแหน่งที่เป็นไปได้ในโลก 2D และแมปอย่างถูกต้องโดยกราฟที่เชื่อมต่อ

ปัญหาของฉันคือมีประตูและทางเดินเชื่อมต่อห้องมากเกินไป

ดังนั้นฉันต้องการอัลกอริทึมที่ลดจำนวนขอบของกราฟที่ไม่ได้เชื่อมต่อที่ไม่ได้เชื่อมต่อแต่ให้เชื่อมต่อกับมัน (โหนดทั้งหมดสามารถเข้าถึงได้) ในตอนท้าย


ความคิดของคุณนั้นเป็นแผนภูมิการค้นหาแบบไบนารีถ้าคุณต้องการทราบ ฉันใช้มัน มันทำให้ดันเจี้ยนค่อนข้างดีและใช้งานง่าย :)
The คอมมิวนิสต์ Duck

2
FYI: กราฟที่สมบูรณ์มีขอบระหว่างจุดยอดคู่ทั้งหมดดังนั้น (ไม่อนุญาตให้สมมุติว่ามีขอบที่ซ้ำกัน) คุณไม่สามารถลบขอบใด ๆ และยังมีกราฟที่สมบูรณ์ ระยะเวลาที่เหมาะสมเป็นกราฟที่เกี่ยวโยงกัน
Michael Madsen

แผนภูมิการค้นหาแบบทวิภาค, กราฟที่เชื่อมต่อ, ด้านขวา ฉันแย่มากกับชื่อดั้งเดิมของสิ่งต่าง ๆ
Splo

คำตอบ:


13

ใช้อัลกอริทึมของ Primเพื่อรับแผนผังการสแปนต่ำสุดสำหรับกราฟของคุณ (เพิ่มน้ำหนักแบบสุ่มหรือเพิ่มน้ำหนักที่สูงขึ้นใกล้กับทางเข้าหรือทำอัลกอริทึมที่คุณต้องการ) และเพิ่มประตู / ขอบบางส่วนโดยการสุ่ม วิธีนี้คุณจะได้เชื่อมต่อห้องพักทั้งหมดและเส้นทางที่ซ้ำซ้อนสองสามอย่าง


1
โอ้ถูกต้องต้นไม้ที่ทอดขั้นต่ำแน่นอน! ความคิดที่ดีขอบคุณ
Splo


0

เครื่องกำเนิดไฟฟ้าดันเจี้ยนบางส่วนในรายการนี้จาก Inkwell Ideasเป็นโอเพ่นซอร์สหรือจัดทำเอกสารเกี่ยวกับอัลกอริทึม Google จะให้ข้อมูลมากมายแก่คุณด้วยการค้นหา '[programminglanguagename] dungeon generator' น่าเสียดายที่รายการโปรดของฉันไม่สามารถค้นพบได้ด้วยวิธีใดวิธีหนึ่งทั้งๆที่เป็นเอกสารที่ดีที่สุดที่ฉันเคยพบและฉันจำชื่อไม่ได้เมื่อฉันทำมันหายไปจากฮาร์ดไดรฟ์ผิดพลาดเมื่อเร็ว ๆ นี้ ฉันจะอัปเดตคำตอบนี้หลังจากทำการกู้คืนบนไดรฟ์นั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.