Library
NoAI Framework

NoAI Strona główna

Rozwój

Kamienie Milowe rozwoju
Sugerowane zmiany API

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
Home page
Typowe błędy
Listy
Poradnik na błędy OTTD
Trams
Biblioteki SI
Forum
Forum FAQ
Zachowanie SI
Użycie krótkich nazw

SIy

TestAI
WrightAI
Convoy
SimpleAI
Porównanie AI
Zobacz forum
Zobacz BaNaNaS
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ć:

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:

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:

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:

Kategoria: Queue

Binary Heap

To jest data structure '(struktura danych)' implementacji binary heap .

Historia Wersji:

Priority Queue

To jest data structure implementacji priority queue .

Historia Wersji:

Fibonacci Heap

To jest data structure implementacji fibonacci heap .

Historia Wersji: