Rozwój
Programowanie SI
- Dokumentacja API
- Wprowadzenie
- plik info.nut
- plik main.nut
- Podstawy
- Poszukiwacz drogi
- Użycie pathfinder`a kolei
- Zapis / Odczyt danych
- Dobrze wiedzieć
- Squirrel
- Listy
- Poradnik na błędy OTTD
- Trams
- Biblioteki SI
- Forum
- Forum FAQ
- Zachowanie SI
- Użycie krótkich nazw
SIy
Wszystko kategorii NoAI
Contents |
Biblioteki (Libraries)
Aby uniknąć powielania kodu, a każdy twórca AI wykonujący tę samą pracę w kółko, istnieje system bibliotek. Istnieją oczywiście dwie strony: tworzenie biblioteki i korzystanie z biblioteki.
Korzystanie z istniejących bibliotek
Aby skorzystać z istniejącej biblioteki, wystarczy załadować ją do swojej AI. Jest to bardzo proste. Układ katalogu biblioteki (bin/ai/library/):
graph/ aystar/ pathfinder/ road/ rail/ queue/ binary_heap/ priority_queue/ fibonacci_heap/
Powiedz, że chcesz użyć Priority Queue, po prostu to robisz:
import("queue.priority_queue", "PriorityQueue", 2);
Pierwszy parametr to kategoria i implementacja podzielone kropką ('.') . Następny parametr to nazwa importowanej biblioteki, w tym przypadku PriorityQueue
. Może to być dowolne, o ile jeszcze nie istnieje. Ostatni parametr to wersja, której spodziewasz się w bibliotece. Aby pobrać bieżącą wersję biblioteki, otwórz plik library.nut z odpowiedniego katalogu.
Sprawdzenie wersji jest bardzo ważne. Jeśli spodziewasz się wersji 1, ale na komputerze niektórych użytkowników biblioteka znajduje się w wersji 2, twoja sztuczna inteligencja odmówi załadowania. To dobra rzecz, ponieważ nowa wersja oznacza, że coś się zmieniło w stosunku do istniejących funkcji, a twoja sztuczna inteligencja najprawdopodobniej zareaguje, jeśli z niej skorzystasz. Ten system wczesnego wykrywania problemów powinien uniknąć wielu konfliktów w przyszłości.
Jak korzystać z biblioteki? Prosty:
local pq = PriorityQueue(); pq.Insert(2);
Oczywiście zależy od biblioteki, jakie parametry należy podać konstruktorowi i jakie funkcje istnieją. Będziesz musiał otworzyć queue/priority_queue/main.nut
, aby zobaczyć całą dokumentację.
Tworzenie biblioteki
Tworzenie biblioteki jest jak tworzenie SI . Tworzysz katalog w kategorii w bin/ai/library
i umieszczasz w nim plik o nazwie 'library.nut
' . Teraz jest to prawie identyczne z 'info.nut
' , jak umieszczasz w swoim katalogu AI, ale zamiast rozszerzać AIInfo
, rozszerza on AILibrary
, a zamiast dzwonić do RegisterAI
, musisz zadzwonić do RegisterLibrary
. Wszystko ma sens, prawda? Przykład:
class PriorityQueue extends AILibrary { function GetAuthor() { return "OpenTTD NoAI Developers Team"; } function GetName() { return "Priority Queue"; } function GetShortName() { return "QUPQ"; } function GetDescription() { return "An implementation of a Priority Queue"; } function GetVersion() { return 2; } function GetDate() { return "2008-06-10"; } function CreateInstance() { return "PriorityQueue"; } function GetCategory() { return "Queue"; } } RegisterLibrary(PriorityQueue());
Teraz musisz utworzyć plik o nazwie 'main.nut
' . Powinien zawierać klasę, którą nazwałeś w CreateInstance()
, tak jak w twojej sztucznej inteligencji. Wtedy te same zasady obowiązują jak AI. require()
działa zgodnie z oczekiwaniami i możesz zdefiniować swoją klasę, jak tylko chcesz.
Są rzeczy, których nie możesz zrobić:
-
Zarejestruj 2 biblioteki w jednym
library.nut
-
Zdefiniuj więcej niż 1 klasę w
main.nut
(lub dowolnym wymaganym pliku). Możesz jednak zdefiniować podklasy (sub-classes). Powiedz, że potrzebujesz dodatkowej klasy wPriorityQueue
. Możesz go nazwaćPriorityQueue.Subclass
. Aby uzyskać do niego dostęp z głównej klasy, użyjthis.Subclass
. Zobaczgraph.AyStar
, aby zobaczyć, jak to się robi.
Wiele bibliotek różnych wersji
Wszystkim nam się stanie, że masz jedną sztuczną inteligencję używającą wersji 1 biblioteki, a drugą używającą wersji 2. Na przykład bierzemy pathfinder.road. Teraz wersja 2 będzie w ai/library/pathfinder/road , ale gdzie należy umieścić wersję 1? W tym celu stworzyliśmy metodę:
W nazwie katalogu biblioteki wszystko kryje się za dowolnym '.' (kropka) jest ignorowany. Możesz więc nazwać 'road' 'road.blabla', lub 'road.2' , to nie ma znaczenia dla elementów wewnętrznych. Teraz pozwala to również na wiele bibliotek o tej samej nazwie i różnych wersjach. Na przykład, jeśli umieścisz wersję 1 pathfinder.road w 'pathfinder/road.1' , a wersję 2 zachowaj w 'pathfinder/road' . System załaduje oba i na podstawie linii importu wybierz jedną z nich (lub zgłasza błąd, jeśli żądana wersja nie istnieje;)).
System kolizji nadal działa. Więc jeśli umieścisz wersję 2 zarówno w 'pathfinder/road' jak i 'pathfinder/road.2' , narzeka, że znalazła dwie równe biblioteki.
Standardowe biblioteki
Istnieje kilka bibliotek dla typowych zadań w pakiecie z NoAI. Zostały one przygotowane przez 'Zespół programistów OpenTTD NoAI' (OpenTTD NoAI Developers Team).
Kategoria: Wykres
AyStar
To implementacja AyStar pathfinding algorithm . Rozwiązuje wykresy, znajdując najszybszą trasę z jednego punktu do drugiego.
Wymagane biblioteki: queue.binary_heap
Historia wersji:
- aystar.1: r13461
- aystar.2: r13463
- aystar.3: r13496
- aystar.4: current
Kategoria: Pathfinder
Droga
Jest to implementacja podstawowego identyfikatora drogi. Możesz go użyć, aby znaleźć długość istniejących tras i / lub zbudować nowe trasy. Od wersji 3 obsługiwane jest budowanie tuneli / mostów. Aby uzyskać więcej informacji, zobacz AI:RoadPathfinder
Wymagane biblioteki: graph.aystar
Historia wersji:
- road.1: r13500
- road.2: r13570
- road.3: current
Kolej
Jest to implementacja podstawowego identyfikatora torów kolejowych. Możesz go użyć, aby znaleźć ścieżkę dla nowych kolei. Aby uzyskać więcej informacji, zobacz AI:RailPathfinder
Wymagane biblioteki: graph.aystar
Historia Wersji:
- rail.1: r14382
Kategoria: Queue
Binary Heap
To jest data structure '(struktura danych)' implementacji binary heap .
Historia Wersji:
- binary_heap.1: current
Priority Queue
To jest data structure implementacji priority queue .
Historia Wersji:
- priority_queue.1: r13440
- priority_queue.2: r13447
Fibonacci Heap
To jest data structure implementacji fibonacci heap .
Historia Wersji:
- Fibonacci_heap.1: 14380