Cüce Hisarı Komutanlığı Sipariş Mimarisi


21

AI için bir komut siparişi sistemi uygulamanın en zarif yolu nedir? Örneğin, odun kesimi için ormanlık bir alanı işaretlerken cüce kalesinde, cüceler aşağıdaki sıralamayı yapacaktır:

  1. Ağaca git
  2. Ağacı doğrayın
  3. Odunu stoğa teslim edin
  4. Başka bir ağaca git
  5. ve bunun gibi..

Ben zaten çalışan bir yığın komutu var. Boşta durumundan ağacın hedef döşemesine ulaşmak için 1.

Korktuğum şey, bunun gibi daha fazla emir oluşturduğumda bunun nasıl karışacağı.

Ev inşa et

  1. Stoka git
  2. ahşap inşaat alanına getirmek
  3. stoğa geri dön
  4. İnşaat alanına taş getir
  5. sprite canlandırmak

Ekim

  1. Stoka git
  2. tarlayı tarlaya getirmek

bira

  1. Stoka git
  2. Bitkiyi hareketsiz duruma getir
  3. demleme sprite canlandırmak

Öyleyse sorum şu, cüce kalesi gibi bir emir düzenini nasıl uygularım ve aynı zamanda spagetti kodundan da kaçınırım? Çalışmam gereken veri yapıları var mı? Komut sırasını ayrı bir xml dosyasına koymam gerekir mi?


1
Cüce Kale aslında böyle bir sisteme sahip değil. Cücelere her seferinde bir görev verilir ve boştaki cüceler yapacak bir şey arar. ("Hey, kesmek için işaretlenmiş bir ağaç var - onu doğramak zorundayım!" / "Hey, stokta olmayan bir ağaç var - onu birine
vermeliyim

1
Cücelere oyuncu tarafından hiçbir şey atanmaz, ancak tam olarak Jed T.'nin yukarıda tanımladığı mimari olan sistem tarafından "görevlendirilir". Sipariş yaratın ve sistem bu siparişi yerine getirmek için bireysel bileşen görevlerini atar.
Attackfarm,

2
Bunun Görev Tahsisi ve Çizelgeleme olarak adlandırıldığını ve çeşitli mühendislik alanlarında yoğun olarak çalışıldığını unutmayın. İlgilenebilecek bu sorunu tartışan birçok makale bulacaksınız.
TonioElGringo

@Tamckfarm Sistem bütün görevlere önceden karar vermez; ne de aynı cüceye birden fazla görev atamaz. Bir görev başlangıçta atanır ve tamamlandığında, başka bir görevin kullanılabilir duruma getirilmesi sonucunu doğurur.
kullanıcı253751

Yanıtlar:


27

İlk başta komutlarınızın bir liste biçiminde olduğunu görüyorsunuz , bu nedenle ilk içgüdünüz bu yapıyı yeniden oluşturmak olabilir ve her cüce bu listede sırayla ilerler. Düşündüğüm şey listeyi adımlara ayırmak, her adımda önkoşullar mevcut ve ardından tüm komutu tersten çalıştırıyorsunuz . Bir örnek göstereyim:

Ahşap kesme

  • Odun taşıyor muyum ve stokta mıyım? Evet : bırak
  • Odun mu taşıyorum? Evet : bir stoğa git
  • Ağaca mıyım? Evet : kes
  • Her şeye hayır : ağaca git

Bunun avantajları:

  • Uygulaması çok basit
  • Esnek - bu listeyi özgürce ayrıştırabilir, öğe ekleyebilir, öğeleri kaldırabilir, öğeleri birleştirebilirsiniz
  • Hiçbir devlet - Herhangi bir durumda herhangi bir cüce için üstten Bu listeyi çalışabilir ve cüce sadece doğru olanı yapacağız TM

Dezavantajları:

  • Döngülerde sıkışmak kolaydır, çünkü hiçbir durum yoktur ve takılma konusunda farkındalık yoktur

Mantıksal olarak, bu komutları, her seferinde en baştan çalıştırılan bir akış şeması olarak gösterebilirsiniz ve yaptığınız şey, her adımda evet / hayır cevabını vermenize bağlı olarak değişir. Bunu kodda veya XML gibi harici bir dosyada uygulamanız size kalmış.


2
Bu aynı zamanda statü geçersiz kılma komutlarını geçersiz kılma avantajına da sahiptir, Acıktım mı? evet ise her şeyi bırakın ve ahşap taşıma işine benzer bir şekilde yiyin;
cırcır ucube

7
@ ratchetfreak "Kalemin güvenliğinin sivillere saldırmaması için bu canavarla savaşmama güvendiğini biliyorum, ama Tanrım, midem hırladı!" Bu konuda DF gibi fazla yapmamaya çalışın: P
Albay Otuz İki

Sanırım bu, planlanan paketlenmiş eser eserine izin veren (ya da en azından kullanılan) ne kullandığını andırıyor ( bunun nedeni, söz konusu döngüye neden olan yasaklı bir öğeden kaynaklanıyordu)
Destrictor

3
@ColonelThirtyTwo İçinde nerede fun? ;)
Lasse

Bunun için bildirimsel sembolik eylem planlamasının kullanılmamasını şiddetle tavsiye ederim. Temelde hata ayıklamak imkansızdır ve istenmeyen davranışlar kolayca ortaya çıkabilir. Her görev için işlem sırasını prosedürel bir şekilde kodlamak çok daha kolaydır.
mklingen

10

Dizileri oldukça genel hale getirebilirseniz, çok fazla makarna kodu yoktur.

Teslimat durumunda örneğin: WorkTask bir WorkPlan ile çalışır. Workplan, ne tür bir kaynak birimini seçmesi gerektiğini, ne tür bir evden, hangi yürüyüş animasyonunu kullandığını, hangi iş animasyonunu kullandığını, çalışma zamanını ve tüm bu ayrıntıları anlatıyor. Sonuçta WorkTask şöyle görünebilir:

  1. Haritada% resource1% bulun
  2. % Animation_1% kullanarak bu konuma gidin
  3. % Time% için% animation_2% kullanarak yerinde çalış
  4. % Req_resource1% dizisini% req_count1% sayımında alın
  5. % Animasyon% 'ı kullanarak% home% konumuna gidin
  6. % Animasyon_6% içinde% time_2% için
  7. vb..

Tanımlanan yaklaşımı başarıyla kullanıyoruz. Oyunumuzda ~ 15 görevimiz var. Bazı önemli noktalar:

  • Görevler birim eylemleri verir (oraya girin, girin, çıkın, buraya gidin, kalın, çalışın, gidin)
  • İşlem, Bitti veya İptal edildi durumuyla sona erer ve bunu Göreve iletir
  • Her şey kodlanmış (çözümleyici, arayüz yöntemleri, geriye dönük uyumluluk yazmaya gerek yok)
  • Her görev yalnızca birkaç ortak yöntemle soyut Task sınıfını uygular (yarat, çalıştır, kaydet, yükle)
  • Genellikle modül başına bir görev, ancak benzer görevler bir modülde
  • Çok benzer görevler bir sınıf içindedir ve birkaç IF tarafından yönetilir (eve teslim veya birime teslim)
  • Her görevin uygun bir şekilde kilitlenmesi ve kaynakların kilidinin açılması gerekir (HERHANGİ bir birimde birim ölürse, kilitlediği kaynak serbest bırakılmalıdır)

2
Cüce kaleye benzeyen oyunda kullandığımız sistem budur. Görevler davranış ağaçları ile gerçekleştirilir. Kaynaklar davranışlarla kilitlenir ve hatalarla kilitlenir. En iyi yanıtla açıklanan eylem planlama yaklaşımından hata ayıklamak çok daha sağlam ve kolaydır
mklingen

5

Yani bu temelde topografik sıralama problemidir.

Bir grafiğiniz var, her düğüm yapılması gereken bir görevdir ve bazı düğümler bazı diğer düğümlere dayanır (bu, grafiğe bağlı düğüme bağlı olduğu düğüme bağlı olan bir kenarla temsil edilir). Tüm görevleri yapmak istiyorsunuz, bu yüzden topografik olarak uygun olan düğümlerin bazı sıralamasını tamamlamanız gerekir (bağlı olan düğümler bağlı oldukları düğümlerin peşindedir).

Şimdi, genellikle bu tür birçok düzen vardır (çünkü bazı düğümlerin bağımlılığı yoktur ve herhangi bir yere konulabilir ve bazı düğümler aynı bağımlılıklara sahiptir ve birbirlerine bağımlı değildir, bu yüzden kendi aralarında ve herhangi bir düğüm olabilir. Bağımlılıklar yapıldıktan sonra ve buna bağlı olarak düğümler yapılmadan önce herhangi bir yere konulmalıdır).

Bir grafik topoğrafyası sıralamanın da mümkün olmaması mümkündür - bu, grafikte döngüler olduğunda gerçekleşir (odunsuz, odun elde etmek için bir ağaç kesmek, balta yapmak, balta yapmak için ağaç kesmek gerekir. ahşap gerekir). Bu durumda, algoritma muhtemelen oyuncuya bu görevlerin yapılamayacağını belirtmelidir.

Ayrıca düğümlere öncelikler ekleyebilirsiniz ve görev, ilk önce daha büyük öncelikli düğümlere sahip olan bağımlılıkları tamamlayan tüm siparişler arasında böyle bir sıralama bulmak olabilir.

Ayrıca yinelenen görevler ekleyebilirsiniz - en kolay yol muhtemelen, her seferinde tekrar grafiğe zaman aşımı olan görevi eklemektir.

Şimdi nasıl çözülür - http://en.wikipedia.org/wiki/Topological_sorting

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.