Jaki jest najbardziej elegancki sposób na wdrożenie systemu porządkowania poleceń dla AI? na przykład w krasnoludzkiej fortecy, gdy zaznaczysz obszar leśny do wycinania drewna, krasnoludy wykonają następującą sekwencję:
- Idź do drzewa
- Posiekaj drzewo
- Dostarcz drewno do magazynu
- Idź do innego drzewa
- i tak dalej..
Mam już polecenie stosu działające nie. 1, która przechodzi ze stanu bezczynności do osiągnięcia docelowej płytki drzewa.
Obawiam się, że byłoby to bałagan, gdy utworzę więcej takich zamówień:
Zbudować dom
- Idź do zapasów
- przynieść drewno na plac budowy
- wróć do zapasów
- Przynieś kamień na plac budowy
- animuj duszka budowlanego
Sadzenie
- Idź do zapasów
- przynieść nasiona na działkę
Browarnictwo
- Idź do zapasów
- Doprowadzić roślinę do spokoju
- animuj duszka do warzenia
Więc moje pytanie brzmi: jak wdrożyć system porządkowania poleceń, taki jak forteca karłowata i jednocześnie unikając kodu spaghetti? czy są jakieś struktury danych, które muszę zbadać? Czy muszę umieścić sekwencję poleceń w osobnym pliku XML?
Odpowiedzi:
Na początku widzisz, że twoje polecenia mają postać listy , więc twoim pierwszym instynktem może być odtworzenie tej struktury, a każdy karzeł będzie przeglądał tę listę po kolei. Sugeruję jednak, aby podzielić listę na etapy , przy czym każdy krok musi spełniać wymagania wstępne , a następnie uruchomić całą komendę w odwrotnej kolejności . Pokażę na przykładzie:
Cięcie drewna
Zaletą tego jest:
Niedogodności:
Logicznie można reprezentować te polecenia jako schemat blokowy, który jest uruchamiany za każdym razem od góry, a to, co zrobisz, zależy od tego, czy na każdym kroku odpowiesz tak / nie. Niezależnie od tego, czy zaimplementujesz to w kodzie, czy w pliku zewnętrznym, takim jak XML, zależy od Ciebie.
źródło
fun
to? ;)Jeśli potrafisz sprawić, by sekwencje były dość ogólne, kodu spaghetti jest niewiele.
W przypadku dostaw, np .: WorkTask działa z WorkPlan. Workplan mówi, jaki rodzaj jednostki zasobów musi wybrać, z jakiego domu, przy użyciu animacji spaceru, przy użyciu animacji pracy, czasu do pracy i wszystkich takich szczegółów. Na koniec WorkTask może wyglądać następująco:
Z powodzeniem stosujemy opisane podejście. W naszej grze mamy ~ 15 zadań. Niektóre najważniejsze:
źródło
Jest to w zasadzie problem z sortowaniem topograficznym.
Masz wykres, każdy węzeł jest zadaniem, które należy wykonać, a niektóre węzły zależą od niektórych innych węzłów (jest to reprezentowane przez krawędź na wykresie od węzła zależnego do węzła, od którego zależy). Chcesz wykonać wszystkie zadania, więc musisz wykonać NIEKTÓRE uporządkowanie węzłów, które jest topograficzne OK (zależne węzły są za węzłami, od których zależą).
Obecnie zwykle istnieje wiele takich porządków (ponieważ niektóre węzły nie mają zależności i można je umieścić gdziekolwiek, a niektóre węzły mają te same zależności i nie są od siebie zależne, więc mogą być w dowolnej kolejności między sobą, a dowolny węzeł może umieść w dowolnym miejscu po zakończeniu zależności i zanim zakończone zostaną węzły zależne).
Możliwe jest również, że nie ma sposobu na posortowanie topografii wykresu - dzieje się tak, gdy na wykresie występują cykle (nie masz drewna, aby uzyskać drewno, musisz posiekać drzewo, aby posiekać drzewo, potrzebujesz siekiery, aby zrobić siekierę potrzebuje drewna). W takim przypadku algorytm powinien prawdopodobnie wskazać graczowi, że tych zadań nie można wykonać.
Możesz także dodawać priorytety do węzłów, a zadaniem może być znalezienie takiego uporządkowania spośród wszystkich porządków, które wypełniają zależności, które mają pierwszeństwo dla węzłów o wyższym priorytecie.
Możesz także dodawać zadania odzyskiwania - najłatwiejszym sposobem będzie po prostu dodanie zadania z limitem czasu do wykresu za każdym razem, gdy zostanie wykonane.
Teraz, jak to rozwiązać - http://en.wikipedia.org/wiki/Topological_sorting
źródło