แสดงช่วงบนตารางหกเหลี่ยม


10

นี่คือสถานการณ์

ฉันมีกระดานหกเหลี่ยมและหน่วยบนมันมีค่าความเร็วหรือการเคลื่อนย้าย 4.Diffrent ภูมิประเทศมีค่าใช้จ่ายที่แตกต่างกันเมื่อฉันคลิกที่หน่วยเกมจะแสดงช่วงการเคลื่อนที่

ทางออกของฉันคือการตรวจสอบแต่ละ hex ในช่วง 4 กับ A * pathfinding และถ้าค่าพา ธ น้อยกว่า 4 แล้ว hex นี้อยู่ในช่วงเกมสุดท้ายแสดงให้ฉันเห็นช่วงของหน่วยนั้น

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

อะไรทำให้ฉันถามคำถามนี้ฉันสังเกตเห็นว่าเมื่อความเร็วหน่วยเป็น 4 หรือ 6 หรือแม้กระทั่ง 8 ช่วงเวลาในการคำนวณสำหรับคอมพิวเตอร์ของฉันนั้นดีมาก แต่เมื่อความเร็วเท่ากับ 10 ขึ้นไปฉันสังเกตว่าฉันต้องรอสองสามวินาทีในการคำนวณ . ดีในเกมจริงฉันไม่เห็นอะไรเช่นนี้และการหาเส้นทาง A * ของฉันนั้นได้รับการปรับให้เหมาะสมดังนั้นฉันคิดว่าโซลูชันของฉันผิด

ขอบคุณสำหรับคำตอบใด ๆ


1
ฉันเห็นด้วยกับ Byte56 ว่าอัลกอริทึมการค้นหาแบบกว้างเป็นทางออกที่ดี นี่ไม่ได้เป็นการบอกว่าคุณไม่ควรพยายามสร้างสรรค์ แต่เท่าที่อัลกอริธึมที่รู้จักกันดีมันเป็นสิ่งที่ดีที่มีผลดี
theJollySin

คำตอบ:


11

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

ตัวอย่างเช่น Dikikstra จะกระจายอย่างเท่าเทียมกันในทุกทิศทาง:

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

(การค้นหาแบบกว้างอย่างแรกจะมีลักษณะคล้ายกับนี้)

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

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


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

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

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

4

มิตเทลได้จัดให้มีทรัพยากรที่ดีเยี่ยมสำหรับการรับช่วงในเว็บไซต์ของเขา ในบทความเขาใช้อัลกอริทึมต่อไปนี้สำหรับการรวบรวมไทล์ฐานสิบหกภายในช่วง:

for each -N  Δx  N:
    for each max(-N, x-N)  Δy  min(N, x+N):
        Δz = xy
        results.append(H.add(Cubex, Δy, Δz)))

สิ่งนี้จะสร้างขอบเขตที่สอดคล้องกับตารางฐานสิบหก:

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

นี่จะค้นหา hexes ทั้งหมดภายในระยะทางที่กำหนดของ hex กลางหากคุณต้องการพิจารณาอุปสรรคให้ใช้การค้นหาความกว้างแรกจากคำตอบอื่นของฉัน


1

ในกรณีที่ทุกคนต้องการนี่คือการใช้ C # ของอัลกอริทึมของ Patel:

IEnumerable<Hex> GetRange(Hex center, int range)
    {
        var inRange = new List<Hex>();
        for (int q = -range; q <= range; q++)
        {
            int r1 = Math.Max(-range, -q - range);
            int r2 = Math.Min(range, -q + range);
            for (int r = r1; r <= r2; r++)
            {
                inRange.Add(center.Add(new Hex(q, r, -q - r)));
            }
        }

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