2d döşemeli bir oyunda bir varlık için olası hareketleri bulma


10

Bunun için belirli bir arama terimi ile ilgili sorunlar yaşıyorum, ama bir 2D sıra tabanlı strateji oyunu (yani FF: Taktikler, Yangın Amblemi, Advance Wars) olası hareketleri bulma hakkında nasıl giderdim.

resim açıklamasını buraya girin

Bu noktada arazi (hatta çarpışma) hakkında çok fazla düşünmüyorum. Sadece X varlığının 5 taşı taşıyabildiğini ve bundan 2 tane daha uzak taşı atayabildiğini anlamak için hangi algoritmayı kullanabileceğimi merak ediyorum.

İki nokta arasındaki mesafeyi bulmak için Dijkstra gibi bir şey kullanabileceğimi biliyorum. Olası bir uygulama oyuncuların bulunduğu yerden başlayıp Dijkstra tarafından geri gönderilen mesafe hareket sayısından daha büyük olana kadar oradan ayrılır.

Birisinin beni doğru yöne yönlendirip yönlendiremeyeceğini merak ediyorum (yani algoritmaların, tekniğin, makalelerin adı).


Bence bir arama terimi için yol bulma deniyor mu? Eğer yol bulmayı kullanırsanız, ihtiyacınız olan
şeylerle

Bu esas olarak yol bulmanın bir parçasıdır (hareket maliyetleri için meta verilerin hesaplanması). Yalnızca menzil dahilindeki konumları siz belirlersiniz, ancak aynı zamanda alacağınız rotayı da belirlemezsiniz.
Mario

1
Sıra tabanlı FFTactics ise gerçek zamanlı değildir (RTS). : p
Alayric

2d olarak, Taksi / Manhattan hesaplama kullanabilirsiniz en.wikipedia.org/wiki/Taxicab_geometry
Gerben Jacobs

Yanıtlar:


5

Bence sınırlı bir Dijkstra tam olarak kullanmak istediğiniz şey. Dijkstra'nın iki nokta arasındaki mesafeyi bulmasının yolu, bir başlangıç ​​düğümünden her düğüme olan mesafeyi haritalaması ve daha sonra bu mesafe haritasından en kısa yolu 'seçmesidir. Hemen hemen aynı şeyi yapmak istersiniz, ancak belirli bir noktaya giden yol yerine çıktı olarak oluşturduğu mesafe düğümü grafiğini istemeniz yeterlidir.

Yapmak isteyeceğiniz bir değişiklik, maksimum hareket aralığınızı zaten aşmış olan düğümlerden mesafeyi hesaplamayı atlamaktır. Ardından, birimin gidebileceği tüm düğümlerin ve bir kenarlığın düğüm grafiğine sahip olacaksınız, bu yüzden sadece hareket payından daha büyük bir mesafeye sahip düğümleri kesin.

Viyola.

Başka bir deyişle, sorunuzda açıkladığınız şey yapmanız gereken şeydir. Ayrıca, başka hesaplamalar yapmaya gerek kalmadan, yolu bulma için çıktıyı kullanabilme avantajına sahiptir.


Bence Dijkstra's bu durumda aşırıya kaçmış. OP'nin tüm olası hareket hedeflerine giden bir yola ihtiyacı yoktur, sadece bir ajanın oraya gidip gelemeyeceği konusunda bir evet / hayır cevabı. Kullanıcı bir yol seçtikten sonra bir yolu hesaplayabilir.
Michael Kristofik

Bir hedefe karar verildikten sonra yolu hesaplamak için Dijkstra'nın algoritmasını kullanmanın maliyeti, hemen ön planda kullanmakla aynıdır (yol için A * gibi sezgisel bir yaklaşım kullanmıyorsanız). Dijkstra, hem 'nereye gidebilirim' hem de 'oraya nasıl gidebilirim?' Sorularını cevaplayacağından önden yapmamak artık gereksiz işler yaratır. Ayrıca, hareket maliyetini değiştiren çevreye komplikasyonların eklenmesine izin verir, ancak bu uygulama için gerekli olmayabilir. Ayrıca, yaklaşım uygulayıcı için yararlı olan iyi belgelenmiştir.
TASagent

1
Mario'nun cevabını incelerken, aslında mesafeyi tersine çevirdiği ve Dijkstra olduğunu söylemediğinden Dijkstra'nın algoritmasını açıklar.
TASagent

1
Dijkstra olduğunu söyleyemem, çünkü gerçekten en kısa bir rota aramıyorsunuz veya belirli bir noktaya ulaşmaya çalışmıyorsunuz. Aslında Dijkstra Algoritmasının ilk kısmı, bu doğru. Dijkstra kullanarak ifadelerinizdeki sorun yanıltıcı olabilir ve bence Michael'ı da şaşırtan şey budur. Muhtemelen Dijkstra'yı her alan / hücre için bir kez kullanmanızı önerdi.
Mario

1
Bu yaklaşımı iyi çalıştığı için kullanmak ve engelleri aşmak çok kolay.
NRaf

12

Şu anda düşünebildiğim en basit (ve muhtemelen en naif) yaklaşım:

  • Karakterinizden başlayın ve çevredeki tüm alanları steps - 1 .
  • Yeni işaretli tüm alanların üzerinde yineleme yapın ve bir kez daha çevreleyen alanlarını işaretleyin steps - 1 nerede stepsyeni alan zaten yüksek sayı olmadıkça, şimdiki alanın adım numarası olacaktır.
  • Adımlarınız bitene kadar son adımı tekrarlayın.

1
Bu algoritmanın bir adı vardır: Taşkın Dolgusu .
Michael Kristofik

6
@MichaelKristofik: Ben buna ilk arama denir . Taşkın dolgusu mesafeleri takip etmez.
BlueRaja - Dany Pflughoeft

2

Bence aradığınız şey Manhattan Mesafesi olabilir . Hiçbir engel olmadığını varsayarsak, bir kareye yalnızca aşağıdaki durumlarda ulaşılabilir olduğunu söyleyebilirsiniz:

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

Daha sonra engeliniz olacaksa bu algoritma gitmek için doğru yön olmayabilir; adapte etmenin olası bir yolu, 'gölgeler' oluşturan engellere sahip olmayı ve en yakın noktadan yeniden değerlendirmeyi içerebilir.

EDIT (Çünkü şimdi biraz daha fazla boş zamanım var):

'Gölgeler' ile böyle bir şey kastediyorum, eğer 0 ulaşılabilir bir kareyse, C karakterdir ve X bir engeldir:

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

(5, 2) bir engel olduğundan, x> = 5 AND y <= 2 ile hiçbir şeye erişemeyeceğinizi varsayarak başlıyorsunuz. Daha sonra başka bir kareden yeniden hesaplayabilirsiniz; (5, 1) 'e gitmek isterseniz manhattan mesafesini (4, 1) hesaplayabilir ve bu karakterin + (4, 1) mesafesinin oyuncunun hareket mesafesinden daha az olup olmadığını görebilirsiniz.

Bu oldukça önemsiz bir örnektir, ancak birden fazla engeliniz ve / veya biraz daha uzun hareket aralığınız varsa, karmaşıklığı kaldırabilmelidir.

Programlama karmaşıklığında ya da yürütme verimliliğinde sadece sel doldurmaktan daha iyi olsa da, hiçbir fikrim yok. Sorunu çözmenin daha ilginç bir yolu gibi görünüyordu.


Gölgeleri dökerek ne demek istiyorsun?
NRaf

1
Açıklama için düzenlendi.
Kalay Sihirbazı
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.