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 NonIAPour commencer, le langage pour écrire votre IA est Squirrel. Squirrel est un langage de script très simple, ressemblant à C++. Pour une introduction à Squirrel, voyez la page Introduction à Squirrel. La raison pour laquelle nous avons choisi Squirrel est qu'il est très similaire à C++.
Dans cette introduction, nous allons vous guider à travers le processus de création d'une IA basique. Ce faisant, nous vous expliquerons les principes de base que vous devez connaître pour créer une IA, et une IA dans OpenTTD. Pour une maîtrise avancée de l'IA, nous vous suggérons d'acheter un bon livre. Le résultat final de ce tutoriel peut se trouver dans le répertoire 'example'.
Contents |
Créer votre propre IA
Il peut y avoir différentes manières de commencer.
Vous pouvez vouloir télécharger une IA existante et la modifier, si sa licence le permet (au moment où ces lignes sont écrites, toutes les IA connues sont libres de droit). Vous pouvez partir de "IA Wright" et construire partir d'elle.
Le guide suppose que vous voulez démarrer votre IA de rien. IA:TestAI est un exemple d'une IA minimale avec des paramètres utilisateurs. Vous pouvez examiner ou copier ce code pour voir ce que vous devez avoir pour commencer.
Une règle générale de programmation sur le pouce est d'écrire une bonne documentation pour votre IA, afin qu'après quelques jours ou quelques mois, vous puissiez vous souvenir facilement de ce que les fonctions sont supposées faire. Diviser l'IA en petits fichiers logiques aidera aussi à l'organiser. Certains auteurs d'IA utilisent des commentaires de style Doxygen pour leur permettre de produire automatiquement une documentation de qualité.
Fichiers de Squirrel indispensables
- Trouvez votre répertoire d'installation de OpenTTD. Sur Windows, ce devrait être C:\Program Files\OpenTTD; sous Linux, /usr/share/games/openttd
-
Créez un nouveau répertoire pour votre IA sous le répertoire
ai
. Par exemple, vous pouvez créer le répertoireMaNouvelleIA
-
Vous pouvez aussi créer un nouveau répertoire sous
content_download/ai
(situé dans votre répertoire~/.openttd
sur Linux, et dans le répertoireDocuments/OpenTTD
de l'utilisateur sous Windows), mais cette méthode n'est PAS recommandée, car vous risquez d'écraser vos fichiers si vous mettez votre IA sur Bananas et, comme elle est située dans un répertoire utilisateur, elle ne fonctionnera que pour cet utilisateur particulier.
-
Vous pouvez aussi créer un nouveau répertoire sous
-
Créez un fichier appelé
info.nut
. Ceci est important, car le chargeur Squirrel le recherchera, ainsi quemain.nut
, dans tous les sous-répertoires. S'il ne trouve pasinfo.nut
, le répertoire est considéré comme autre chose, et votre IA ne sera pas chargée.
La hiérarchie de votre répertoire devrait désormais ressembler à ceci:
$OpenTTD_Dir/ | ai/ | MaNouvelleIA/ | info.nut | main.nut
Ouvrez info.nut
puis continuez à lire la section suivante.
Enregistrer
Vous voulez faire savoir à OpenTTD que vous avez une IA que vous voulez appliquer à une compagnie. Pour cela, vous devez ajouter une classe qui étend AIInfo
:
class MaNouvelleIA extends AIInfo { function GetAuthor() { return "Écrivain d'IA débutant"; } function GetName() { return "MaNouvelleIA"; } function GetDescription() { return "Un exemple d'IA en suivant le tutoriel sur http://wiki.openttd.org/"; } function GetVersion() { return 1; } function GetDate() { return "17/03/2007"; } function CreateInstance() { return "MaNouvelleIA"; } function GetShortName() { return "XXXX"; } function GetAPIVersion() { return "1.0"; } }
Le résultat de cela est de dire à OpenTTD comment s'appelle votre IA, sa version, et d'autres informations générales. Après cela, vous devez créer une instance de la classe. Squirrel:
/* Informer le cœur que nous sommes une IA */ RegisterAI(MaNouvelleIA());
C'est suffisant pour initialiser votre IA. Mais nous n'en sommes pas encore à la faire démarrer. Nous n'avons pas encore une vraie IA, seulement un morceau de code qui dit ce qu'est votre IA, et qui l'a écrite. Alors, faisons donc une classe qui sera notre IA.
Votre première IA
Pour cela, créez un fichier main.nut
dans le même répertoire, et faites une classe qui étende AIController
. Voyez Style de codage pour les recommandations de formatage.
class MaNouvelleIA extends AIController { function Start(); }/ function MaNouvelleIA::Start() { while (true) { AILog.Info("Je suis une toute nouvelle IA avec une fonction périodique appelé MaNouvelleIA et je suis au tic " + this.GetTick()); this.Sleep(50); } }
Ce premier bloc crée la classe en étendant AIController
. Le second bloc crée une fonction Start()
, qui est appelée une fois au démarrage de votre IA. Si vous sortez de cette fonction, votre IA se terminera. Donc, nous créons une boucle while()
qui ne s'arrête jamais.
Vous n'avez pas trop à vous inquiéter sur le fait que votre IA encombre le jeu en occupant tout le CPU de votre machine (et donc en stoppant le jeu lui-même), le moteur lui-même s'endormira tous les X codes d'opération, pour forcer une répartition équitable et permettre au jeu de tourner de façon régulière. Vous pouvez toutefois mettre l'IA en sommeil manuellement en appelant la commande Sleep()
. Vous verrez, quand nous démarrerons notre IA dans un moment, que cela imprime une ligne sur votre console tous les 50 tics.
Démarrez un nouveau jeu et regardez dans l'écran du menu principal pour les paramètres de l'IA. Là, sélectionnez votre IA pour la lancer. Vous n'avez besoin que de redémarrer le jeu chaque fois que vous modifiez le fichier info.nut. Assurez-vous de modifier l'heure de démarrage de votre IA pour ne pas avoir à l'attendre.
Conseil:
Sur Windows Vista, vous pouvez avoir besoin de lancer openttd.exe
en tant qu'administrateur. Faites soit un clic droit et choisissez "Lancer en tant qu'administrateur" chaque fois, ou désactiver l'UAC pour les administrateurs ([1]).
Si OpenTTD ne tourne pas comme administrateur, les répertoires de l'IA seront invisibles à l'exécutable, et charger une IA provoquera une erreur "L'IA nommée 'XYZ' est inconnue ou non adaptée".
Si vous ouvrez la fenêtre de débogage de l'IA, qui se trouve sous l'icône du point d'interrogation, vous verrez une jolie ligne indiquant que nous sommes actifs. Vous pouvez aussi démarrer manuellement votre IA nouvellement créée en tapant la commande
start_ai MaNouvelleIA
dans la console du jeu (ouverte par la touche `)
Si vous changez le code ailleurs que dans info.nut, vous pouvez utiliser la commande de console restart
pour redémarrer le jeu depuis le début. Ou vous pouvez simplement utiliser le bouton "Recharger IA" dans la fenêtre de débogage de l'IA.
Toutes les erreurs rencontrées, à la fois à la compilation et à l'exécution, sont envoyées dans la fenêtre de débogage de l'IA. Si votre info.nut ne se charge pas, vous ne verrez pas les erreurs, sauf si vous activez la console de débogage depuis la ligne de commande du jeu. -d ai=5.
Vous pouvez rediriger la sortie de la console du jeu en ouvrant celle-ci et en tapant
developer 2
Activez la sortie des ordres print
et AILog.*
de votre IA en tapant
debug_level ai=4
Vous pouvez défiler dans la fenêtre de la console avec les touches SHIFT-PGUP, SHIFT-PDOWN et SHIFT-FLÈCHE(haut/bas).
Ainsi, vous avez votre première IA. Bien entendu, nous avons maintenant besoin d'y ajouter de nouvelles fonctions. Pour cela, nous vous recommandons de continuer avec le chapitre suivant, principes de base. Vous avez juste à savoir que tout votre code doit aller dans Start()
. Une autre chose que vous devriez savoir: ne créez jamais de variable globale. Gardez tout dans l'instance de votre classe. Mais c'est simplement une règle de vie, et si vous ne savez pas ce que cela signifie, ce n'est pas très important pour le moment.