อัลกอริธึมเส้นทางที่ยาวที่สุดสำหรับการสร้างเขาวงกต roguelike


10

ฉันมีแผนที่แบบกริดที่เรียบง่ายประกอบด้วยห้องพักเช่นนี้ (ทางเข้า A =, B = ออก):

   0 1 2 3
  #########
0 # B # #####
  #########
1 # ### #
  #########
2 # # #
  # # #
3 # # #
  #########
4 # ### #
  #########
5 ### A #
  ### #
6 ### #
  #########

และฉันก็พยายามที่จะสร้างอัลกอริทึมที่เหมาะสมเพื่อสร้างเส้นทางของประตูระหว่างห้องในแบบที่ผู้เล่นต้องสำรวจแผนที่ส่วนใหญ่ก่อนที่จะหาทางออก

ในคำอื่น ๆ ที่ฉันพยายามที่จะหาเส้นทางที่ยาวที่สุดที่เป็นไปได้จาก A ไป B

(ฉันทราบว่าปัญหานี้สามารถแก้ไขได้สำหรับกราฟแบบวนรอบอย่างไรก็ตามในกรณีนี้อาจมีรอบ)

แก้ไข:อีกตัวอย่างหนึ่งที่ห้องเชื่อมต่อกันโดยใช้การเติมน้ำท่วมและทางออกถูกเลือกให้เป็นห้องที่ไกลที่สุดจากทางเข้า:

   0 1 2 3
  #########
0 # B # #
  # # - #####
1 # | # #
  ### # #
2 ### # #
  ### - # - ###
3 # | ###
  # - #######
4 #A | #
  # # #
5 # # #
  # # #
6 # # #
  #########

โปรดทราบว่าเส้นทางสู่ทางออกไม่ใช่เส้นทางที่ยาวที่สุดเท่าที่จะเป็นไปได้


หากคุณบังคับให้ผู้เล่นใช้เส้นทางที่ยาวที่สุดเท่าที่จะเป็นไปได้คุณกำลังสร้างเส้นทางตรงที่อ้างว่าซับซ้อน นี้ไม่ดี.
o0 '

มันไม่เลวเลย (เป็นพื้นฐานของประเภทเกมยิงปืน) แต่คุณต้องระวังว่าคุณกำลังทำอยู่และออกแบบเกมที่เหลือเพื่อให้ทำงานได้ดี

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

คำตอบ:


11

ฉันคิดว่าคุณกำลังทำสิ่งนี้ผิด เส้นทางสูงสุดในกราฟที่มีรอบไม่ได้กำหนดทางเทคนิคเพราะมันไม่มีที่สิ้นสุดหากรอบอยู่ระหว่างจุดเริ่มต้นและจุดสิ้นสุด อาจเป็นวิธีที่ฉลาดที่คุณสามารถขยาย / จำกัดความหมายของเส้นทางสูงสุด แต่ฉันไม่คิดว่านั่นเป็นวิธีที่ดีที่สุดที่นี่

คุณไม่ได้พยายามสร้างแบบจำลองเส้นทางยาวที่แท้จริง (เช่นหุ่นยนต์ที่พยายามสำรวจพื้นที่ในแผนที่ให้มากที่สุด) คุณแค่พยายามให้ผู้เล่นสำรวจห้องต่างๆ

ดังนั้นให้โอกาสผู้เล่นค้นหาทางออกสัดส่วนกับร้อยละของแผนที่สำรวจจนถึงทำให้โอกาสที่ผู้เล่นพบทางออกสัดส่วนถึงร้อยละของแผนที่การสำรวจเพื่อให้ห่างไกลสมมติว่ามีห้อง X ในระดับหนึ่งและผู้เล่นได้สำรวจ Y ในครั้งต่อไปที่ตัวละครเข้ามาในห้องให้ออกจากที่นั่นด้วยความน่าจะเป็น f (Y, X) ตัวอย่างเล็กน้อยของ f อาจเป็น (Y * Y) / (X * X) - เช่นสำหรับ 10 ห้องมีโอกาส 100% ที่ทางออกในห้องสุดท้ายโอกาส 81% มีโอกาสในห้องถัดจากห้องสุดท้าย - และเพียง โอกาส 1% อยู่ในห้องแรก

คุณสามารถปรับแต่งสมการได้ แต่คุณต้องการทำให้เกมรู้สึกถูกต้องและอาจมอบความสามารถบางอย่างให้กับผู้เล่นเพื่อสร้างโอกาส ส่วนสำคัญคืออย่าสร้างทางออกจนกว่าตัวละครจะเข้าสู่ห้องจริง วิธีนี้เป็นภูมิคุ้มกันต่อความรู้ของผู้เล่นของอัลกอริทึมการสร้างดันเจี้ยน; แม้ว่าผู้เล่นจะมีรูปแบบการเคลื่อนไหวที่แปลกประหลาดเช่นการกระโดดของอัศวินใน NetHack หรือการเคลื่อนย้ายทางไกลพวกเขาจะต้องสำรวจห้องเพิ่มเติมเพื่อหาทางออก

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

ในที่สุดฉันเพิ่งจบโร๊คไลค์ที่ทางออกเกิดขึ้นที่อีกด้านหนึ่งของแผนที่จากตัวละครของผู้เล่นและจากนั้นก็เดินสุ่ม บางรายการในดันเจี้ยนทำให้มองเห็นได้บนแผนที่โดยที่ไม่ต้องหิวเร็ว ฉันไม่ได้ทำการวิเคราะห์ใด ๆ แต่มันรู้สึกอย่างแน่นอนว่าฉันต้องสำรวจแผนที่เพิ่มเติมเพื่อค้นหามันและทำให้ระดับความรู้สึกมีเอกลักษณ์


การสร้างแบบไดนามิกดูเหมือนความคิดที่ดีทีเดียวตราบใดที่ผู้เล่นไม่ได้สังเกต มิฉะนั้นฉันคิดว่าพวกเขาจะรู้สึกโกงมาก ฉันชอบความคิดที่ท่วมท้น
ผู้ใช้ไม่พบ

2
ข้อเสนอทั้งหมดของคุณคือการโกงผู้เล่น อย่าโทษฉันในการปรับคณิตศาสตร์เพื่อไม่ต้องใช้แบบจำลองโลก ;) แต่คุณสามารถใช้เทคนิคการออกแบบเพื่อให้น่ากินมากขึ้น - ตัวอย่างเช่นทางออกถูกวางไว้ก่อน แต่คีย์ที่จำเป็นต้องใช้มันถูกสร้างขึ้นในวิธีที่ฉันอธิบายหรือวางบนสัตว์ประหลาดที่วางไข่หลังจากสำรวจ X ห้อง / ฆ่าสัตว์ประหลาด X หรือการเปิดประตูต้องใช้สวิตช์ X พลิกหนึ่งตัวในแต่ละห้อง ฯลฯ ...

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

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

แต่ฉันยอมรับว่าฉันคิดผิดว่าเป็นปัญหาการค้นพบ "A ถึง B" ฉันตระหนักว่าการหาทางออกเป็นผลมาจากอัลกอริทึมแทนที่จะเป็นเป้าหมาย
ไม่พบผู้ใช้

6

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

อย่างไรก็ตามฉันกังวลว่าอัลกอริทึมแบบสแปนนิ่งจะมีแนวโน้มที่จะสร้างกิ่งก้านที่ปลายตาย

แก้ไข:ผลลัพธ์ของการใช้อัลกอริทึมที่ใช้ Kruskal และวางทางออกที่ส่วนท้ายของสาขาที่ยาวที่สุด:

   0 1 2 3
  #########
0 #A | #
  # ##### - #
1 # # #
  ### #
2 ### #
  ### #
3 ### #
  ### - #####
4 # | #
  # - ##### - #
5 # ### #
  # - #######
6 # # B #
  # # - #
7 # | #
  #########

1
ฉันจะแนะนำ Primm ด้วย :-), +1 ฉันคิดว่า backtrack เป็นส่วนสำคัญของเกมมากมายเช่นกัน ... ตรวจสอบ diablo 2
Mr.Gando

2

นี่คือสิ่งที่จะทำเล่นด้วย:

Connect each room with a door to another room.
N = 0.75*TotalNumberOfRooms
Until (pathSize > N) {
  Use A* pathing to get a path from A to B. (G being size of room, or # of monsters)
  if (pathSize < N) remove a connection/door
  if (noPath) choose a different door/connection
  if (room.doors < 1) choose a different door/connection
}

ฉันจะเอาประตูออกไปตามทางแบบสุ่มไม่เช่นนั้นคุณก็จบลงด้วย 1 ประตูที่ทางออกและประตูเริ่มต้นมากมาย

ฉันคิดว่านี่O(n^2)ไม่ค่อยดีสำหรับแผนที่ขนาดใหญ่


วิธีการแก้ปัญหาที่สง่างามมากในหลักการ ครั้งต่อไปฉันควรลองนึกถึงสิ่งนี้ก่อนที่จะใช้เทคนิคที่ซับซ้อน
ไม่พบผู้ใช้

สง่างามอาจจะ แต่มันจะเป็นโปรเซสเซอร์หมู O (n ^ 2) จะไม่ขยายขนาดด้วยแผนที่ขนาดใหญ่
Stephen Furlani


1

ฉันเชื่อว่าคุณมีคำตอบที่ดีอยู่แล้ว แต่นี่คือ $ 0.02 ของการแก้ปัญหาเชิงทฤษฎี

สิ่งที่คุณต้องการไม่ใช่เส้นทางที่ยาวที่สุด แต่เป็นเส้นทางที่สั้นที่สุด คุณต้องการห้องที่อยู่ไกลที่สุดเนื่องจากคุณกำลังพิจารณาเส้นทางที่สั้นที่สุดไปยังห้อง นี่อาจฟังดูสับสน แต่มันง่ายในการคำนวณ

  1. เริ่มที่ห้องเริ่มต้นของคุณ ทำเครื่องหมายแต่ละเพื่อนบ้าน 1. ห่างจากห้องเริ่มต้น 1
  2. สำหรับแต่ละห้องที่มีเครื่องหมาย 1 ให้เยี่ยมชมเพื่อนบ้านที่ไม่มีเครื่องหมายแต่ละคนและทำเครื่องหมาย 2 พวกเขาอยู่ห่างจากจุดเริ่มต้น 2 ระยะ
  3. ดำเนินการต่อไปจนกว่าคุณจะครอบคลุมทุกห้อง ห้องที่มีจำนวนสูงสุดอยู่ห่างจากจุดเริ่มต้นมากที่สุด

การคำนวณเส้นทางที่ยาวที่สุดจริง ๆ (จะไม่ใช้เวลานานเกินไปสำหรับห้อง 10 ห้อง) จะไม่ทำงานเพราะคุณไม่สามารถทำให้ผู้เล่นใช้เส้นทางที่ยาวที่สุด ดังนั้นการวางทางเข้าและออกในสองห้องไกลที่สุดคือทางออกที่ดีที่สุด ในการค้นหาสิ่งนี้ให้คำนวณห้องที่ไกลที่สุดจากห้องสุ่ม จากนั้นหาห้องที่ไกลที่สุด นี่เรียกว่าการหาเส้นผ่านศูนย์กลางของกราฟโปรด Google

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