Kule savunma oyunu için dinamik yol algoritması


16

Bir Kule Savunması yapıyorum ve bunun için iyi bir yol algoritmasına ihtiyacım var.

Dijkstra hakkında düşündüm ama dinamik olabilecek birine ihtiyacım var; tam bir yeniden hesaplama olmadan bir kenar kaldırıldığında veya eklendiğinde kendini güncelleyebilmelidir.

Eğer yardımcı olursa C # kodlama.

Yanıtlar:


8

Aradığınız önemli ölçüde farklı bir şey olmadığı sürece genellikle A * kullanmak isteyeceksiniz.


A * 'ya aşina değilsem, dinamik olarak değişen ortamları nasıl ele alırım? Her karede yeniden hesaplansın mı? Çarpışmalarda mı?
Justin L.

1
Genel olarak her kareyi böyle basit bir oyunda yeniden yönlendirirsiniz. Harita ızgarası çok küçük olacak ve en fazla yüzlerce temsilci sayısı olacaktır. Eğer bir şekilde büyük bir performans sorunu haline gelirse, ihtiyaç duyulanlar dışında ağacı yeniden inşa etmeyerek daha sonra optimize edebilirsiniz.
coderanger

6
Eğer yavaşsa, önerilerim: her mafya için yolu hesaplamayın. Muhtemelen, hepsi aynı yolu izliyorlar. Ben sadece yeni kule yerleşimini tekrar hesaplıyorum ve kule mevcut yolda . O zaman bile, Sadece blok karenin önündeki yoldaki noktalarda canavarlar için bir kireç yapın, onu geçmiş ve bu nedenle umursamadığınız çeteler için değil. Ve sonra, yol bulmayı kısaltmak için, oradan yolu zaten bildiğiniz için, engellenen kareden sonra karenin yolunu bulmak için sınırlandırabilirsiniz.
seanmonstar

4
Aslında, "mafya" "mobil nesne" için endüstri (ve MMO / MUD oyuncu) lingo olduğunu.

3
Ne olursa olsun, MUD1'e dayanan uzun süredir var ve birçok yayında ortaya çıkacak kadar standart. en.wikipedia.org/wiki/Mob_%28computer_gaming%29

19

Benzer bir sorunu çözmem gerekiyordu: sürekli değişen "maliyetler" ve engellerle büyük labirent benzeri bir ızgarada yol bulma.

Mesele şu ki, kule savunma oyununda, onlar için yolu çözmesi gereken varlıkların sayısı genellikle grafikteki düğüm sayısından çok daha fazladır. A * bunu işlemek için en uygun algoritma değildir , çünkü her şey değiştiğinde bunu yeniden çözmeniz gerekir. Sadece bir yol bulmanız gerekiyorsa uygun, ancak benim durumumda farklı yerlerde görünebilen ve her birinin kendi yolu olan varlıkları ele alabilmem gerekiyordu.

Floyd-Warshall benim durumumda için bir düğüm değişir, zaman bütün komşularıyla o düğüme maliyetini yeniden hesaplar özel bir algoritma yazdı gerçi algoritması, çok daha uygun ve daha sonra eğer komşular o çağrılır değiştirildi onlara özyinelemeli.

Oyunun başlangıcında, bu algoritmayı tüm "hedef" düğümlerimde çalıştırıyorum. Daha sonra, tek bir düğüm her değiştiğinde (örneğin, geçilemez hale geldiğinde), sadece o düğümde çalıştırırım ve değişiklik etkilenecek ve durdurulacak tüm düğümlere yayılır. Bu nedenle, küresel yeniden hesaplamaya gerek yoktur ve algoritma, yol bulmayı gerektiren varlıkların sayısından tamamen bağımsızdır.

Algoritmam temelde (sözde kod) gibi bir şeydi:

update_node method in Node class:
    $old <- $my_score
    find $neighbor node among all neighbors such that
        $neighbor.score + distance_to($neighbor) is minimal
    $my_score <- $neighbor.score + distance_to($neighbor)
    $next_node <- $neighbor
    if ($my_score != $old)
        for each $neighbor
            $neighbor.update_node()

İlk puan, düğümün bir hedef mi yoksa bir tür engel mi olduğuna bağlı olarak.


1
CPU yükü değiştikçe bunu dinamik olarak çerçevelere yaymak da kolay olacaktır.
tenpn

A *, kullanılacak doğru algoritma olmadığı için +1.
Ricket

5

TD'mde kullandığım rota algoritması, oyunda var olduğum varlıkların sayısı nedeniyle normal A * yolundan geriye doğru. Amaçdan kötü adamlara yönelmek yerine, hedeften tahtadaki her boş kareye yöneldim.

Bu çok uzun sürmez, sadece "maliyetlerinizi" bulana kadar kartı yinelemeye devam edersiniz ve engellenen rotalar için iyi geri bildirim sağlar (bunları yapıyorsanız). Floyd'un algoritmasını kullanmak, veriye bağlı aramalar yapmadığı için A * ile karşılaştırıldığında hızlı ve önbellek dostudur, sadece akışlardaki verileri yükler ve çalışır.

Kartınızın sınırsız maliyete ayarlanmasıyla başlayın, ardından hedef kareyi sıfır maliyete ayarlayın, ardından komşu bir hücrenin mevcut maliyet artı seyahat maliyetinden daha düşük olup olmadığını kontrol etmek için kartın üzerinde tekrarlayın. Seyahat maliyeti sezgisel olarak koyduğunuz yerdir (benim durumumda, çapraz olarak seyahat etmenin maliyeti sınırsızdı, ancak bir kuleden seyahat etme maliyeti yüksekti, bu yüzden kulelerden yemek yemelerine izin verildi, ancak hiç yoktu seçim)

Maliyetler ızgarasına sahip olduğunuzda, hücrelerdeki en dik maliyet gradyanını test ederek hızlıca bir "akış" ızgarası oluşturabilirsiniz. Bu büyük miktarlarda kötü adamlar için gerçekten iyi çalışıyor çünkü hiçbiri yol bulmak zorunda değil, sadece sanal tabelaları takip ediyorlar.

Başka bir faydası, bu yolu sadece engelleri her ayarladığınızda (veya oyunumda, kulelerinizden biri sürünürse) çalıştırmanız gerektiğidir. Bir sürünme / çetenin alana girdiği her seferinde (saniyede binlerce çete ve onlarca ile baş ağrısı olurdu).


4

Pathfinding hızlıdır ve normal bir kule savunma oyununun boyutundaki bir şeyde, bir şey değiştiğinde tam bir A * veya Dijkstra geçişi yapmakta sorun yaşamayacaksınız. Tam bir yenileme için milisaniyenin altında konuşuyoruz. Her türlü uyarlanabilir yol bulma, korkunç derecede karmaşık hale gelir. Dünyanın en büyük kule savunma ızgarasını yapmadığınız sürece, basit bir şekilde yapın.


1
Tower Defense'nin yol bulmanın hızlı olmadığı cep telefonlarında popüler olduğunu belirtmek gerekir . Özellikle Sidekick veya Android 1.6 gibi biraz eski cihazlarda.
seanmonstar

1
Geliştiriciler, A * ve Dijkstra gibi yol bulma algoritmalarını onlarca yıldır daha az güçlü bir donanımda kullanıyorlar (Game Boy'u düşünün). Oyun için yeterli bir ekrana sahip olacak kadar yeni bir telefonun, uygulamanın makul derecede verimli olması şartıyla bir sorunu olmamalıdır. Burada tartışılan bazı şık optimizasyonlar var: harablog.files.wordpress.com/2009/06/beyondastar.pdf
Mike Strobel

+1. Kendi DTD klonumu geliştirirken de aynı sonuca vardım. Yolları aşamalı olarak güncellemeyi denedim ama algoritma çok karmaşık hale geldi. Üzerinde bir gün geçirdikten sonra, her değişiklik için tam bir yeniden hesaplamaya geçtim. Bu işe yaradı ve birkaç ince ayar ile yeterince hızlı yapmayı başardım.
finnw


2

Bu, çözümünüz için aşırı olabilir, ancak ileriye doğru değil, geriye doğru yönlendirmeyi düşünün.

Bir TD oyununda, düşmanlar genellikle belirli bir hedefe ulaşmaya çalışıyor. Bu hedeften ilk düşmana geriye doğru ilerleyin, ardından bu yolu önbelleğe alın. Sonraki düşmanlar için yol oluşturmada, ilk yolu başlangıç ​​noktası olarak kullanın ve bu şekilde devam edin. Birden fazla düşman etkileşme noktanız veya birden fazla hedefiniz varsa, başlangıç ​​için önbelleğe alınmış bir dizi yolunuz vardır.


1

Yol noktası yol bulma muhtemelen bir td oyunu için en iyisi olacaktır, çünkü genellikle AI doğrudan bir yolu takip eder. Temel olarak düğümlerinizi veya geçiş noktalarınızı ayarlayıp sonra geçiş yoluna doğru "ai" işaretine sahip olursunuz ve bir sonraki geçiş noktasına gitmesi, yüzleşmesi ve ona doğru hareket etmesi için yeterince yaklaştığında ona doğru yürürsünüz.


Bu sadece kulelerin yalnızca yolun kenarına yerleştirilebileceği TD oyunları için geçerlidir - kulelerin tahtada herhangi bir yere yerleştirilmesine izin veren oyunlar için değil.
Iain

evet başlangıçta yazar hangi türü istediğini belirtmedi, bu yüzden dinamik olmadığını varsaydım.
Loktar

1

Birisi sorduğundan, oyuncu bir kuleyi her yerleştirdiğinde veya kaldırdığında yolu yeniden hesaplayarak dinamik olarak değişen ortamlara hitap edersiniz ve bu yolu sadece bellekte saklarsınız. Ortam her karede değişmez.

Bazı TD oyunlarının belirlenmiş bir yolu olduğunu ve kuleleri yerleştirmenize izin vermediğini unutmayın, böylece yol bulmayı kolay bir şekilde çözerler: bir yolu kodlayarak ve engellemenize izin vermeyerek :)


1

Basit bir çözüm hile yapmaktır.

Çıkmaz uç olmadığından emin olmak için haritayı önceden tasarlayın. Ardından her kavşakta, karakteri bir rota seçmesini sağlayan bir tetikleyici ekleyin (örnek: her zaman sola dönün, her zaman sağa dönün veya rastgele).


1
Muhtemelen kullanıcının haritayı anında oluşturduğu Masaüstü TD gibi bir şeyden bahsediyor. Yine de güzel bir çözüm olabilecek "aptal" düşmanlar için, daha iyi AI ile düşmanları biraz güçlendirme yapabilirsin.
coderanger
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.