จะกำหนดช่วงของการเคลื่อนไหวที่เป็นไปได้ในเกมวางแผนแบบอิงทางเลี้ยวหรือไม่?


11

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

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

คำถามของฉันคือฉันควรทำอย่างไรในการกำหนดช่วงของตำแหน่งที่ผู้เล่นสามารถเลือกได้

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

ฉันจะกำหนดช่วงที่หน่วยสามารถเคลื่อนที่ได้โดยพิจารณารัศมีการเลี้ยวของมันอย่างไร

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

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


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

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

คุณหมายถึงอะไรช่วงที่ยูนิตสามารถเคลื่อนที่ได้? คุณหมายถึงจุดที่มันสามารถย้ายไป? คุณคุ้นเคยกับพีชคณิตเชิงเส้น (เวกเตอร์) อย่างไร
BlueRaja - Danny Pflughoeft

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

1
@PieterGeerkens ฉันคิดว่าเพราะ OP ไม่ได้ขอรหัสพวกเขากำลังขออัลกอริทึม และได้ให้รายละเอียดเพียงพอเกี่ยวกับสถานการณ์ที่อัลกอริทึมสามารถคิดได้อย่างสมเหตุสมผล นี่เป็นเรื่องปกติและเป็นที่ยอมรับ
MichaelHouse

คำตอบ:


4

สร้างสนามการไหลหรือระยะทางโดยใช้ Dijsktra's

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

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


ไม่ใช่วิธีที่ฉันจะอธิบายแนวคิดหรือฉันจะใช้มันอย่างไร แต่ก็เป็นแนวทางที่ถูกต้อง
Pieter Geerkens

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

@ TAGAGENT: จุดดีฉันไม่คิดอย่างนั้นตลอด อัลกอริทึมนั้นอาจจะเล็กน้อย แต่วิธีการควรใช้งานได้
Sean Middleditch

@PieterGeerkens: ฉันเห็นด้วยว่ามันเป็นคำอธิบายที่ไม่ดี คุณควรทำคำตอบของคุณเองเพื่ออธิบายให้ดีขึ้น
Sean Middleditch

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

4

วิธีการแก้ปัญหากำลังดุร้ายจะ:

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

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

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


3

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

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

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

สมมติว่า 2 มิติในตอนนี้คุณสามารถคาดการณ์ได้ 3:

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

(0,0) - (1,0) - (2,0)
  | \  /  |  \  / |
(0,1) - (1,1) - (2,1)

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

ในการขยายวิธีการนี้ให้สามารถใช้งานได้ด้วยการหมุนลองจินตนาการถึงวิธีการแบบเดียวกันใน 3 มิติ ทิศทาง Z นั้นสอดคล้องกับการหมุน / หันหน้าและเป็นวัฏจักรหมายถึงถ้าคุณเดินทางต่อในทิศทาง + Z คุณจะกลับไปที่จุดเริ่มต้น ตอนนี้โหนดที่เกี่ยวข้องกับตำแหน่งที่อยู่ติดกันจะเชื่อมต่อข้ามใบหน้าที่สอดคล้องกับทิศทางนั้นเท่านั้น คุณวนซ้ำโหนดที่เชื่อมต่อกับโหนดที่สำรวจแล้วตามปกติ ฉันอยากจะแนะนำการ จำกัด ให้ N, NE, E, SE, S, SW, W, NW ในรูปแบบนี้

วิธีแก้ปัญหานี้สามารถบอกคุณได้ว่าพื้นที่ที่สามารถเข้าถึงได้ทั้งหมดรวมถึงเส้นทางที่ดีที่สุดในการไปถึงที่นั่นการหมุนของคุณเมื่อคุณไปถึงที่นั่นเท่าไหร่และทิศทางที่คุณมีเมื่อคุณไปถึงที่นั่น

จากนั้นเมื่อดำเนินการกำหนดเส้นทางจริงคุณมีอิสระที่จะสอดแทรก / ลบล้างเส้นโค้งในแบบของคุณเพื่อทำให้ดูสมจริงยิ่งขึ้น


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

1

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

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

  • การหมุนอย่างต่อเนื่องขณะเคลื่อนที่สูงถึง 45 องศา อันนี้มีเล่ห์เหลี่ยมมากและหวังว่าคนที่คุณจะตามมา การรวมตัวเลขข้ามเส้นทางโดยใช้การประทับเวลาคงที่อาจเป็นวิธีที่ง่ายที่สุดในการเข้าใกล้จุดนี้ กรวยของคุณจะถูก จำกัด โดยสูงสุด (+ X องศาทุกขั้นตอน) และการหมุนต่ำสุด (-X องศาทุกขั้นตอน)

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

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


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

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

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

ตกลงดังนั้นจริง ๆ แล้วดูเหมือนว่าขออภัยลักษณะที่คุณต้องการอาจ จำกัด เกินไปสำหรับอัลกอริทึม Dijkstra ที่เรากำลังพูดถึงข้างต้น: - \ อาจ ฉันจะร่างบางสิ่งออกมาในภายหลังเมื่อฉันกลับถึงบ้าน
TASAGENT

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