ค้นหาการเคลื่อนไหวที่เป็นไปได้สำหรับเอนทิตีในเกม 2d ที่เรียงต่อกัน


10

ฉันมีปัญหาที่จะเกิดขึ้นกับคำค้นหาที่เฉพาะเจาะจงสำหรับเรื่องนี้ แต่จะมีวิธีการอย่างไรในการค้นหาความเคลื่อนไหวที่เป็นไปได้ในเกมวางแผนกลยุทธ์แบบเลี้ยว 2 มิติ (เช่น FF: Tactics, Fire Emblem, Advance Wars)

ป้อนคำอธิบายรูปภาพที่นี่

ฉันไม่ได้คิดมากเกี่ยวกับภูมิประเทศ (หรือแม้แต่การปะทะกัน) ณ จุดนี้ ฉันแค่สงสัยว่าอัลกอริธึมที่ฉันสามารถใช้เพื่อหาว่าเอนทิตี X สามารถย้าย 5 ไทล์และโจมตี 2 ไทล์ไกลกว่านั้น

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

แค่สงสัยว่ามีใครบางคนชี้ให้ฉันในทิศทางที่ถูกต้อง (เช่นชื่อของอัลกอริทึมเทคนิคบทความ ฯลฯ )


ฉันคิดว่ามันเรียกว่าการค้นหาเส้นทางสำหรับคำค้นหาหรือไม่ หากคุณใช้การค้นหาเส้นทางคุณสามารถมีเคาน์เตอร์เพื่อจัดการกับสิ่งที่คุณต้องการ
Exikle

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

1
มันไม่ใช่แบบเรียลไทม์ (RTS) ถ้ามันเป็นà la FFTactics แบบเลี้ยว : p
Alayric

ใน 2d คุณสามารถใช้การคำนวณ Taxicab / แมนฮัตตันen.wikipedia.org/wiki/Taxicab_geometry
Gerben Jacobs

คำตอบ:


5

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

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

ไวโอลินใหญ่

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


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

ค่าใช้จ่ายในการใช้อัลกอริทึมของ Dijkstra ในการคำนวณเส้นทางหลังจากที่ปลายทางได้รับการตัดสินใจแล้วนั้นเกือบจะเหมือนกับการใช้งานแบบตรงไปตรงมา การไม่ทำอย่างนั้นเป็นการสร้างงานซ้ำซ้อนเนื่องจาก Dijkstra จะตอบคำถามทั้งสองว่า 'ฉันจะไปได้ที่ไหน' และ 'ฉันจะไปที่นั่นได้อย่างไร' นอกจากนี้ยังช่วยให้การเพิ่มของภาวะแทรกซ้อนต่อสภาพแวดล้อมที่เปลี่ยนค่าใช้จ่ายการเคลื่อนไหวแม้ว่ามันอาจจะไม่จำเป็นสำหรับการใช้งาน นอกจากนี้วิธีการได้รับการบันทึกไว้อย่างดีซึ่งเป็นประโยชน์ต่อผู้ปฏิบัติ
TASAGENT

1
เมื่อมองไปที่คำตอบของมาริโอเขาอธิบายอัลกอริทึมของ Dijkstra จริง ๆ ยกเว้นเขากลับระยะห่างและไม่พูดถึงมันคือ Dijkstra
TASAGENT

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

1
การลงเอยด้วยการใช้วิธีการนี้ทำได้ดีและง่ายต่อการจัดการกับอุปสรรค
NRaf

12

วิธีที่ง่ายที่สุด (และไร้เดียงสาที่สุด) ที่ฉันสามารถนึกได้ตอนนี้:

  • เริ่มที่ตัวละครของคุณและทำเครื่องหมายเขตข้อมูลโดยรอบทั้งหมดเป็น steps - 1เริ่มต้นที่ตัวละครของคุณและทำเครื่องหมายเขตโดยรอบทั้งหมด
  • ย้ำกว่าสาขาการทำเครื่องหมายใหม่ทั้งหมดและอีกครั้งที่ทำเครื่องหมายเขตโดยรอบของพวกเขาเป็นsteps - 1ที่stepsจะเป็นจำนวนขั้นตอนฟิลด์ปัจจุบันเว้นแต่เขตข้อมูลใหม่มีจำนวนที่สูงขึ้นแล้ว
  • ทำซ้ำขั้นตอนสุดท้ายจนกระทั่งคุณหมดขั้นตอน

1
ขั้นตอนวิธีการนี้มีชื่อ: เติมน้ำท่วม
Michael Kristofik

6
@MichaelKristofik: ฉันจะเรียกมันกว้างค้นหาแรก การเติมน้ำท่วมไม่สามารถติดตามระยะทางได้
BlueRaja - Danny Pflughoeft

2

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

| TOX-fromX | + | toY-fromY | <maxMoveDistance

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

แก้ไข (เพราะตอนนี้ฉันมีเวลาว่างเพิ่มเล็กน้อย):

โดย 'เงา' ฉันหมายถึงสิ่งนี้ถ้า 0 เป็นสี่เหลี่ยมที่เข้าถึงได้ C คือตัวอักษรและ X เป็นอุปสรรค:

 012345678
0    0
1   00
2  000X
3 000C000
4  00000
5   000
6    0
 012345678

เนื่องจาก (5, 2) เป็นสิ่งกีดขวางคุณเริ่มโดยสมมติว่าคุณไม่สามารถไปถึงสิ่งใดด้วย x> = 5 AND y <= 2 จากนั้นคุณสามารถคำนวณใหม่จากตารางอื่น ถ้าคุณต้องการไปที่ (5, 1) คุณสามารถคำนวณระยะทางแมนฮัตตันจาก (4, 1) และดูว่า + ระยะทางจากตัวละครถึง (4, 1) นั้นน้อยกว่าระยะการเคลื่อนที่ของผู้เล่นหรือไม่

นี่เป็นตัวอย่างที่ค่อนข้างง่าย แต่ถ้าคุณมีอุปสรรคหลายอย่างและ / หรือมีช่วงการเคลื่อนไหวที่ยาวขึ้นเล็กน้อยมันควรจะสามารถจัดการกับความซับซ้อนได้

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


คุณหมายถึงอะไรโดยการหล่อเงา
NRaf

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