Làm thế nào bạn sẽ mã hóa một công cụ AI để cho phép giao tiếp bằng bất kỳ ngôn ngữ lập trình nào?


8

Tôi đã phát triển một trò chơi bảng iPhone hai người chơi. Người chơi máy tính (AI) có thể là cục bộ (trong mã trò chơi) hoặc chạy từ xa trên máy chủ. Trong trường hợp thứ 2, cả mã máy khách và máy chủ đều được mã hóa bằng Lua. Trên máy chủ, mã AI thực tế tách biệt với mã ổ cắm TCP và mã coroutine (tạo ra một phiên bản AI riêng cho mỗi máy khách kết nối).

Tôi muốn có thể cách ly mã AI hơn nữa để phần đó có thể là một mô-đun được mã hóa bởi bất kỳ ai trong ngôn ngữ họ chọn. Tôi có thể làm cái này như thế nào? Những công nghệ / công nghệ nào sẽ cho phép giao tiếp giữa mã socket / coroutine Lua TCP và mô-đun AI?


swig.org đến với tâm trí ..
Jari Komppa

swig là c / c ++ sang các ngôn ngữ khác. Lua đến các ngôn ngữ khác cần một tuyến đường khác.
David Young

Câu trả lời:


8

Một lược đồ nhắn tin dựa trên ổ cắm có thể được sử dụng để cho phép mọi ngôn ngữ tùy ý tương tác với AI. Bạn có thể sử dụng tin nhắn dựa trên nhị phân, xml, văn bản, v.v. Chỉ cần xác định rõ định dạng tin nhắn là gì và tin nhắn bạn sẽ gửi và nhận.

Kỹ thuật này hoạt động tương đối tốt để xử lý giao tiếp từ nhẹ đến khiêm tốn. Tất nhiên có một hình phạt độ trễ liên quan đến nó, nhưng vì trò chơi của bạn là một kiểu trò chơi bảng nên nó không phải chạy trong thời gian thực.


Tôi đã sử dụng các socket để chuyển AI từ máy chủ AI sang máy khách iOS. Mọi thứ đều ở Lua. Tôi muốn biết làm thế nào một thói quen AI, được mã hóa bằng Python, ví dụ (trên máy chủ) có thể giao tiếp với thói quen ổ cắm Lua (trên máy chủ). Ví dụ, Python AI gửi di chuyển đến thói quen ổ cắm Lua, sau đó sử dụng ổ cắm TCP để chuyển tiếp di chuyển đến máy khách iOS.
TokyoDan

Đã trả lời bên dưới nhưng giao tiếp ổ cắm với ổ cắm có thể được sử dụng để giao tiếp giữa hai quy trình hoặc chương trình trên cùng một máy tính. Theo cách tương tự như hai chương trình giao tiếp qua internet. Ngoại trừ bạn không cần tất cả xử lý TCP / IP.
David Young

0

Đối với bất kỳ ngôn ngữ X nào, bạn không thể biết tính năng interop nào nó có hoặc không có - không có ngôn ngữ nào được dự kiến ​​sẽ cung cấp bất kỳ tính năng tương tác nào. Đáng tin cậy nhất là kiểu C, vì đó là (gần như chắc chắn) những gì HĐH của bạn sử dụng, mặc dù điều này không có nghĩa là ngôn ngữ thực sự phơi bày nó.

Có lẽ độc lập nhất sẽ là sử dụng một đường ống có tên do HĐH cung cấp và gửi qua các thông báo XML. Tuy nhiên, đây là một kế hoạch đóng gói cực kỳ khó khăn, hầu hết dừng lại trong việc gói gọn ngôn ngữ tác giả.


Ống là một cách tiếp cận hữu ích đặc biệt là nếu bạn muốn một cái gì đó để kiểm tra nhanh và bẩn. Mặc dù vậy, nó không có khả năng mở rộng và chậm hơn nhiều so với kết nối trực tiếp với ổ cắm.
David Young

Có lẽ tôi đang thiếu một cái gì đó. Tôi mới biết điều này. Tôi nghĩ rằng các socket được sử dụng để lấy thông tin từ máy tính này sang máy tính khác ở đâu đó trên mạng. Ổ cắm cũng có thể được sử dụng để liên lạc giữa hai chương trình / quy trình / coroutines chạy trên cùng một máy tính?
TokyoDan

Vâng! về cơ bản bạn đang liên lạc qua một ổ cắm localhost mà thực tế sẽ không định tuyến bên ngoài thẻ ethernet. Với giao tiếp ổ cắm, bạn có thể nói chuyện với một chương trình khác trên cùng một máy tính hoặc một chương trình khác trên một máy tính khác. Nó được xử lý chính xác như nhau.
David Young

Cảm ơn. Ngay cả khi điều này là có thể, thói quen AI không phải Lua sẽ phải mã hóa các thói quen giao tiếp ổ cắm. Tôi muốn thoát khỏi điều này. Tôi chỉ muốn AI không phải Lua gửi một chuỗi như "Di chuyển P1 đến X Y" tới mã ổ cắm Lua của tôi trên máy chủ. Mã ổ cắm Lua sẽ chuyển tiếp chuỗi đến máy khách iOS.
TokyoDan

Bạn có thể thử sử dụng ống trực tiếp sau đó. Hãy để máy chủ của bạn Lua sinh ra một quy trình con là chương trình AI không phải Lua của bạn. Bạn có thể giao tiếp với tiến trình con thông qua các đường ống vào và ra. lua-users.org/wiki/ExtensionProposal
David Young
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.