Développement
Programmation de l'IA
- Documentation API
- Introduction
- Fichier info.nut
- Fichier main.nut
- Principes de base
- Détermination de chemin routier
- Détermination de chemin ferroviaire
- Sauver / Charger des données
- Choses à savoir
- Squirrel
- Listes
- Traiter les erreurs OTTD
- Tramways
- Bibliothèques de l'IA
- Forum
- FAQ du forum
- Comportement de l'IA
IAs
Tous les articles de la catégorie NonIA
Contents |
Bibliothèques
Pour éviter la duplication de code, et que chaque créateur d'IA fasse encore et toujours le même travail, il y a le système de bibliothèques. Il y a, bien entendu, deux côtés à cela: créer une bibliothèque, et utiliser une bibliothèque.
Utiliser des bibliothèques existantes
Pour utiliser une bibliothèque existante, vous devez simplement la charger dans votre IA. Le faire est très simple. Le modèle du répertoire des bibliothèques est le suivant (bin/ai/library/):
graph/ aystar/ pathfinder/ road/ rail/ queue/ binary_heap/ priority_queue/ fibonacci_heap/
Disons que vous voulez utiliser la file de priorités, vous feriez simplement:
import("queue.priority_queue", "PriorityQueue", 2);
Le premier paramètre est la catégorie et l'implémentation, séparées par un point ('.'). Le paramètre suivant est le nom que la bibliothèque que vous importez prendra, dans ce cas PriorityQueue
. Ce peut être ce que vous voulez, tant que cela n'existe pas déjà. Le dernier paramètre est la version de la bibliothèque que vous attendez. Pour obtenir la version actuelle de la bibliothèque, ouvrez library.nut depuis le répertoire correspondant.
La vérification de la version est très importante. Si vous attendez la version 1, mais que sur certaines machines des utilisateurs, la bibliothèque est en version 2, votre IA refusera de la charger. C'est une bonne chose, car une nouvelle version signifie que quelque chose a changé dans les fonctions existantes, et votre IA fera sans doute des siennes si vous voulez l'utiliser. Ce système de détection de problème précoce devrait éviter de nombreux conflits futurs.
Maintenant, comment utiliser la bibliothèque? C'est simple:
local pq = PriorityQueue(); pq.Insert(2);
Bien sûr, cela dépend de la bibliothèque dont les paramètres doivent être donnés au constructeur, et quelles fonctions existent. Vous devez ouvrir queue/priority_queue/main.nut
pour voir toute la communication.
Créer une bibliothèque
Créer une bibliothèque est comme créer une IA. Vous créez un répertoire dans une catégorie dans bin/ai/library
, et y mettez un fichier appelé 'library.nut
'. Ensuite, c'est quasiment identique à 'info.nut
', comme vous l'avez mis dans le répertoire de votre IA, mais au lieu d'étendre AIInfo
, il étend AILibrary
, et au lieu d'appeler RegisterAI
, vous devez appeler RegisterLibrary
. Tout cela semble logique, non? Un exemple:
class PriorityQueue extends AILibrary { function GetAuthor() { return "Équipe de développement NonIA de OpenTTD"; } function GetName() { return "File de priorités"; } function GetShortName() { return "QUPQ"; } function GetDescription() { return "Une implémentation de la file de priorité"; } function GetVersion() { return 2; } function GetDate() { return "10/06/2008"; } function CreateInstance() { return "PriorityQueue"; } function GetCategory() { return "Queue"; } } RegisterLibrary(PriorityQueue());
Maintenant, ce que vous devez faire est créer un fichier appelé 'main.nut
'. Il doit contenir une classe comme vous l'avez appelée dans CreateInstance()
, comme dans votre IA. Les mêmes règles s'appliquent donc que pour une IA. require()
fonctionne comme attendu, et vous pouvez définir votre classe comme vous l'entendez.
Il y a certaines choses que vous ne pouvez pas faire:
-
Enregistrer 2 bibliothèques dans un même
library.nut
-
Définir plus d'une classe dans le
main.nut
(ou n'importe quel fichier requis). Cependant, vous pouvez définir des sous-classes. Disons que vous avez besoin d'une classe supplémentaire dansPriorityQueue
. Vous pouvez l'appelerPriorityQueue.Subclass
. Pour y accéder depuis votre classe principale, utilisezthis.Subclass
. Voyezgraph.AyStar
pour un exemple de la manière de faire cela.
Bibliothèques multiples en différentes versions
Il peut arriver à chacun de nous d'avoir une IA utilisant la version 1 d'une bibliothèque et une autre utilisant sa version 2. Par exemple, prenons pathfinder.road. Actuellement, la version 2 sera dans ai/library/pathfinder/road, mais où mettre la version 1? Pour cela, nous créons une méthode:
Dans le nom de répertoire de la bibliothèque, tout ce qui est derrière un '.' (point) est ignoré. Donc, vous pouvez appeler 'road' 'road.blabla', ou 'road.2', cela n'a pas d'importance en interne. Ainsi, cela permet d'avoir plusieurs bibliothèques de même nom et de versions différentes. Par exemple, si vous mettez la version 1 de pathfinder.road dans 'pathfinder/road.1', vous pouvez garder la version 2 dans 'pathfinder/road'. Le système chargera les deux, et selon votre ligne d'import, choisira l'une d'elles (ou lancera une erreur si la version demandée n'existe pas ;)).
Le système de collisions fonctionne toujours. Donc si vous mettez la version 2 à la fois dans 'pathfinder/road' et dans 'pathfinder/road.2', il se plaindra qu'il a trouvé deux bibliothèques identiques.
Bibliothèques standard
Il y a plusieurs bibliothèques pour des tâches courantes qui sont livrées avec NonIA. Elles ont été préparées par 'l'équipe de développeurs NonIA de OpenTTD'.
Catégorie: Graphes
AyStar
C'est une implémentation de l'algorithme de détermination de chemin AyStar. Il résout des graphes en trouvant le chemin le plus rapide d'un point à un autre.
Bibliothèques requises: queue.binary_heap
Historique des versions:
- aystar.1: r13461
- aystar.2: r13463
- aystar.3: r13496
- aystar.4: actuel
Catégorie: Détermination de chemin
Road
C'est une implémentation d'une détermination de chemin routier basique? Vous pouvez l'utiliser pour trouver la longueur de routes existantes et/ou construire de nouvelles routes. Depuis la version 3, la construction de tunnels et de ponts est supportée. Pour plus d'information, voyez IA:Détermination de chemin routier.
Bibliothèques requises: graph.aystar
Historique des versions:
- road.1: r13500
- road.2: r13570
- road.3: actuel
Rail
C'est une implémentation d'une détermination de chemin ferroviaire basique. Vous pouvez l'utiliser pour trouver un trajet pour une nouvelle voie ferrée. Pour plus d'information, voyez IA:Détermination de chemin ferroviaire.
Bibliothèques requises: graph.aystar
Historique des versions:
- rail.1: r14382
Catégorie: File
Pile binaire
C'est une implémentation d'une pile binaire de structures de données.
Historique des versions:
- binary_heap.1: actuel
File de priorité
C'est une implémentation d'une file prioritaire de structures de données.
Historique des versions:
- priority_queue.1: r13440
- priority_queue.2: r13447
Pile de Fibonacci
C'est une implémentation d'une pile de Fibonacci de structures de données.
Historique des versions:
- Fibonacci_heap.1: 14380