IA:Bibliothèque/Fr

From OpenTTD
Jump to: navigation, search



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 dans PriorityQueue. Vous pouvez l'appeler PriorityQueue.Subclass. Pour y accéder depuis votre classe principale, utilisez this.Subclass. Voyez graph.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
Personal tools