Wie würden Sie eine KI-Engine codieren, um die Kommunikation in einer beliebigen Programmiersprache zu ermöglichen?

8

Ich habe ein iPhone-Brettspiel für zwei Spieler entwickelt. Computerspieler (KI) können entweder lokal (im Spielcode) oder remote auf einem Server ausgeführt werden. Im zweiten Fall werden sowohl Client- als auch Servercode in Lua codiert. Auf dem Server ist der tatsächliche AI-Code vom TCP-Socket-Code und vom Coroutine-Code getrennt (wodurch für jeden Verbindungsclient eine separate AI-Instanz erzeugt wird).

Ich möchte in der Lage sein, den AI-Code weiter zu isolieren, damit dieser Teil ein Modul sein kann, das von jedem in der Sprache seiner Wahl codiert wird. Wie kann ich das machen? Welche Techniken / Technologien würden die Kommunikation zwischen dem Lua TCP-Socket / Coroutine-Code und dem AI-Modul ermöglichen?

TokyoDan
quelle
swig.org kommt mir in den Sinn ..
Jari Komppa
swig ist c / c ++ zu anderen Sprachen. Lua zu anderen Sprachen braucht einen anderen Weg.
David Young

Antworten:

8

Ein Socket-basiertes Messaging-Schema kann verwendet werden, um es einer beliebigen Sprache zu ermöglichen, mit der KI zu interagieren. Sie können binärbasierte Nachrichten, XML, Text usw. verwenden. Definieren Sie einfach klar, wie das Nachrichtenformat lautet und welche Nachrichten Sie senden und empfangen.

Diese Technik eignet sich relativ gut für leichte bis bescheidene Kommunikationshandhabung. Damit ist natürlich eine Latenzstrafe verbunden, aber da Ihr Spiel ein Brettspielstil ist, muss es nicht in Echtzeit ausgeführt werden.

David Young
quelle
Ich verwende bereits Sockets, um die KI vom KI-Server auf den iOS-Client zu verschieben. Alles ist in Lua. Ich möchte wissen, wie eine in Python codierte KI-Routine (auf dem Server) mit der Lua-Socket-Routine (auf dem Server) kommunizieren kann. Beispielsweise sendet die Python-KI ihre Verschiebung an die Lua-Socket-Routine, die dann den TCP-Socket verwendet, um die Verschiebung an den iOS-Client weiterzuleiten.
TokyoDan
Unten beantwortet, aber die Kommunikation von Socket zu Socket kann verwendet werden, um zwischen zwei Prozessen oder Programmen auf demselben Computer zu kommunizieren. Auf die gleiche Weise wie zwei Programme, die über das Internet kommunizieren. Nur dass Sie nicht die gesamte TCP / IP-Verarbeitung benötigen.
David Young
0

Für jede Sprache X können Sie nicht wissen, welche Interop-Funktion sie hat oder nicht - es wird nicht erwartet, dass eine Sprache Interoperationsfunktionen bietet. Am zuverlässigsten ist der C-Stil, da dies (mit ziemlicher Sicherheit) das ist, was Ihr Betriebssystem verwendet, obwohl dies nicht bedeutet, dass die Sprache es tatsächlich verfügbar macht.

Am unabhängigsten wäre es vielleicht, eine vom Betriebssystem bereitgestellte Named Pipe zu verwenden und beispielsweise XML-Nachrichten zu senden. Dies ist jedoch ein bisschen extrem - die meisten Kapselungsschemata hören auf, die Autorensprache zu kapseln.

DeadMG
quelle
Rohre sind ein nützlicher Ansatz, insbesondere wenn Sie etwas schnell und schmutzig testen möchten. Es ist jedoch nicht sehr skalierbar und viel langsamer als die direkte Kommunikation von Socket zu Socket.
David Young
Vielleicht fehlt mir etwas. Ich bin neu in diesem Bereich. Ich dachte, Sockets würden verwendet, um Informationen von einem Computer auf einen anderen Computer irgendwo im Internet zu übertragen. Können Sockets auch für die Kommunikation zwischen zwei Programmen / Prozessen / Coroutinen verwendet werden, die auf demselben Computer ausgeführt werden?
TokyoDan
Ja! Sie kommunizieren im Grunde genommen über einen Localhost-Socket, der nicht außerhalb der Ethernet-Karte geleitet wird. Bei der Socket-Kommunikation können Sie mit einem anderen Programm auf demselben Computer oder einem anderen Programm auf einem anderen Computer sprechen. Es wird genauso behandelt.
David Young
Vielen Dank. Selbst wenn dies möglich ist, müsste die Nicht-Lua-AI-Routine Socket-Kommunikationsroutinen codieren. Ich möchte davon wegkommen. Ich möchte nur, dass die Nicht-Lua-KI einen String wie "Move P1 to X Y" an meinen Lua-Socket-Code auf dem Server sendet. Der Lua-Socket-Code leitet die Zeichenfolge an den iOS-Client weiter.
TokyoDan
Sie können dann versuchen, Pipes direkt zu verwenden. Lassen Sie Ihre serverseitige Lua einen untergeordneten Prozess erzeugen, der Ihr Nicht-Lua-KI-Programm ist. Sie können mit dem untergeordneten Prozess über die In- und Out-Pipes kommunizieren. lua-users.org/wiki/ExtensionProposal
David Young