SI:Library/Pl

From OpenTTD
Jump to: navigation, search



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 w PriorityQueue. Możesz go nazwać PriorityQueue.Subclass . Aby uzyskać do niego dostęp z głównej klasy, użyj this.Subclass. Zobacz graph.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
Personal tools