Menampilkan rentang pada kisi heksagonal

10

Inilah situasinya.

Saya memiliki papan heksagonal, dan sebuah unit di atasnya, dengan kecepatan atau nilai bergerak 4. Medan yang lebih berat memiliki biaya yang berbeda. Ketika saya mengklik unit tersebut, permainan akan menunjukkan kisaran bergerak.

Solusi saya adalah memeriksa setiap hex dalam kisaran 4, dengan pathfinding A *, dan jika biaya path kurang dari 4 maka hex ini berada dalam range. Akhirnya permainan dengan baik menunjukkan kisaran unit itu.

Pertanyaan saya adalah: Apakah ada solusi lain untuk mencari jangkauan pada hex grid atau kotak persegi, karena walaupun saya benar-benar bangga dengan apa yang saya lakukan dalam solusi saya, saya pikir, ini sedikit berlebihan? :))

Apa yang membuat saya mengajukan pertanyaan ini? Saya perhatikan bahwa ketika kecepatan unit adalah 4 atau 6 atau bahkan 8, waktu untuk rentang komputasi untuk komputer saya benar-benar baik, tetapi ketika kecepatannya 10 dan lebih saya perhatikan bahwa saya perlu menunggu beberapa detik untuk menghitung . Nah di game nyata saya agak tidak melihat sesuatu seperti ini dan pathfinding A * saya agak dioptimalkan dengan baik, jadi saya berpikir bahwa solusi saya salah.

Terima kasih atas balasannya.

pengguna23673
sumber
1
Saya setuju dengan Byte56 bahwa algoritma pencarian pertama yang luas adalah solusi yang baik. Ini bukan untuk mengatakan bahwa Anda tidak harus mencoba untuk menjadi kreatif, tetapi sejauh algoritma terkenal itu bagus itu berlaku juga.
theJollySin

Jawaban:

11

Anda benar bahwa A * sedikit berlebihan, tetapi tidak banyak. Anda seharusnya tidak melihat penundaan seperti Anda. A * sebenarnya hanya algoritma Dijikstra yang dimodifikasi . Karena Anda tidak menggunakan posisi ujung (karena posisi ujung Anda hanya "sejauh yang Anda bisa"), menggunakan A * dengan itu menambahkan heuristik tidak diperlukan. Cukup menggunakan Dijikstra atau pencarian pertama yang sederhana akan cukup.

Misalnya, Dikikstra akan tersebar merata di semua arah:

masukkan deskripsi gambar di sini

(Pencarian pertama yang sederhana akan terlihat mirip dengan ini)

Pantau biaya perjalanan ke setiap node. Setelah sebuah node berada pada biaya perjalanan maksimum, jangan memproses node yang terhubung lebih jauh. (Mirip dengan tempat node berjalan ke dinding di bawah).

Jika Anda mengalami masalah kinerja hanya 10 node keluar, Anda akan ingin melihat bagaimana Anda mengakses node. Pencarian pertama yang luas harus dapat menavigasi ratusan node tanpa penundaan yang nyata (tentu saja tidak beberapa detik). Pertimbangkan menyimpan versi dunia Anda yang sederhana dalam format grafik, untuk traversal cepat.

MichaelHouse
sumber
dapatkah Anda menemukan jarak antara dua node menggunakan BFS dan memperhitungkan hambatan akun / bobot yang berbeda?
Luke B.
Biaya perpindahan antar node harus dihitung sebelumnya untuk sebagian besar. Biaya tidak dihitung menggunakan BFS, BFS adalah algoritma untuk melintasi node. Cara Anda menentukan biaya perjalanan dari satu node ke node lainnya tidak tergantung pada bagaimana Anda melintasi node.
MichaelHouse
Terima kasih, sekarang saya mengerti mengapa pemikiran saya salah, kuncinya adalah pernyataan ini "Karena Anda tidak menggunakan posisi akhir (karena posisi akhir Anda hanya" sejauh yang Anda bisa "). Dalam solusi saya memiliki posisi akhir, itu adalah unit. Saya baru saja menyelesaikan masalah dari arah yang salah. Pertama saya menentukan perbatasan, dan kemudian dari sana saya kembali ke unit saya, dengan cara itu saya mungkin pergi berkali-kali melalui node yang sama. ketika kecepatan saya meningkat, jumlah perhitungan juga meningkat. Cara Anda menunjukkan kepada saya, saya akan selalu mengunjungi node sekali. Saya hanya memiliki sudut pandang yang salah, benar-benar terima kasih, ini menyederhanakan banyak.
user23673
4

Amit Patel telah menyediakan sumber yang bagus untuk mendapatkan rentang di situsnya . Dalam artikel tersebut, ia menggunakan algoritme berikut untuk mengumpulkan ubin hex dalam rentang:

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)))

Ini membuat batas selaras dengan kisi hex:

masukkan deskripsi gambar di sini

Ini akan menemukan semua heks dalam jarak tertentu dari heks tengah, jika Anda ingin mempertimbangkan hambatan, gunakan pencarian pertama yang luas dari jawaban saya yang lain.

MichaelHouse
sumber
1

Jika ada yang membutuhkannya, inilah implementasi C # dari algoritma 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;
    }
Allan Haugsted
sumber