Comment coderiez-vous un moteur d'IA pour permettre la communication dans n'importe quel langage de programmation?

8

J'ai développé un jeu de société iPhone à deux joueurs. Les joueurs sur ordinateur (AI) peuvent être locaux (dans le code du jeu) ou exécutés à distance sur un serveur. Dans le deuxième cas, les codes client et serveur sont codés en Lua. Sur le serveur, le code AI réel est distinct du code de socket TCP et du code coroutine (qui génère une instance distincte d'IA pour chaque client qui se connecte).

Je veux pouvoir isoler davantage le code AI afin que cette partie puisse être un module codé par n'importe qui dans la langue de son choix. Comment puis-je faire ceci? Quelles techniques / technologies permettraient la communication entre le code socket / coroutine Lua TCP et le module AI?

TokyoDan
la source
swig.org me vient à l'esprit ..
Jari Komppa
swig est c / c ++ dans d'autres langues. Lua vers d'autres langues a besoin d'un itinéraire différent.
David Young

Réponses:

8

Un schéma de messagerie basé sur socket peut être utilisé pour permettre à n'importe quel langage arbitraire d'interagir avec l'IA. Vous pouvez utiliser des messages binaires, du xml, du texte, etc. Définissez simplement clairement le format du message et les messages que vous enverrez et recevrez.

Cette technique fonctionne relativement bien pour une gestion de communication légère à modeste. Il y a bien sûr une pénalité de latence, mais comme votre jeu est un style de jeu de société, il n'a pas besoin d'être exécuté en temps réel.

David Young
la source
J'utilise déjà des sockets pour faire passer l'IA du serveur AI au client iOS. Tout est à Lua. Je veux savoir comment une routine AI, codée en Python, par exemple (sur le serveur) pourrait communiquer avec la routine de socket Lua (sur le serveur). Par exemple, Python AI envoie son déplacement à la routine de socket Lua qui utilise ensuite le socket TCP pour relayer le déplacement vers le client iOS.
TokyoDan
Réponse ci-dessous mais la communication socket à socket peut être utilisée pour communiquer entre deux processus ou programmes sur le même ordinateur. De la même manière que deux programmes communiquant sur Internet. Sauf que vous n'avez pas besoin de toute cette gestion TCP / IP.
David Young
0

Pour n'importe quelle langue X, vous ne pouvez pas savoir quelle fonction d'interopérabilité il possède ou n'a pas - aucune langue n'est censée fournir des fonctionnalités d'interopérabilité. Le plus fiable est le style C, car c'est (presque certainement) ce que votre système d'exploitation utilise, bien que cela ne signifie pas que le langage l'expose réellement.

Le plus indépendant serait peut-être d'utiliser un canal nommé fourni par le système d'exploitation et d'envoyer, par exemple, des messages XML. Cependant, c'est un peu extrême - les schémas d'encapsulation les plus courts ne permettent pas d'encapsuler le langage de création.

DeadMG
la source
Les tuyaux sont une approche utile, surtout si vous voulez que quelque chose soit rapide et sale. Il n'est cependant pas très évolutif et beaucoup plus lent que la communication directe de socket à socket.
David Young
Peut-être que je manque quelque chose. Je suis nouveau dans ce domaine. Je pensais que les sockets étaient utilisées pour obtenir des informations d'un ordinateur à un autre, quelque part sur le net. Les sockets peuvent-ils également être utilisés pour la communication entre deux programmes / processus / coroutines exécutés sur le même ordinateur?
TokyoDan
Oui! vous communiquez essentiellement sur un socket localhost qui ne sera pas réellement acheminé en dehors de la carte Ethernet. Avec la communication par socket, vous pouvez parler à un autre programme sur le même ordinateur ou à un autre programme sur un autre ordinateur. Il est géré exactement de la même manière.
David Young
Merci. Même si cela est possible, la routine AI non Lua devrait coder les routines de communication de socket. Je veux m'éloigner de ça. Je veux juste que l'IA non Lua envoie une chaîne comme "Déplacer P1 vers X Y" vers mon code de socket Lua sur le serveur. Le code de socket Lua relaiera la chaîne au client iOS.
TokyoDan
Vous pouvez alors essayer d'utiliser directement les tuyaux. Laissez votre côté serveur Lua générer un processus enfant qui est votre programme AI non Lua. Vous pouvez communiquer avec le processus enfant via ses canaux d'entrée et de sortie. lua-users.org/wiki/ExtensionProposal
David Young