【问题标题】:Python scripts communicatePython 脚本通信
【发布时间】:2014-02-11 14:07:38
【问题描述】:

我正在尝试为像井字游戏或跳棋/国际象棋这样的游戏编写游戏管理器/控制器:

Game Arbiter:控制游戏的玩法并将对手的动作传递给每个玩家。还确定移动是否合法

GamePlayer.py

  • 会在仲裁者询问时下棋

GameArbiter.py

  • 将决定哪个玩家先行
  • 将决定移动是否合法
  • 将保留对两位玩家的引用
  • 将要求正确的玩家移动并提供当前游戏状态

我的问题是仲裁者将如何与玩家沟通?我想使用 PIPE.communicate() 但似乎只有在播放器在每个 .communicate() 请求后终止时才有效。我的代码是这样的:

GameArbiter.py:

import subprocess
import sys

player1 = subprocess.Popen([sys.executable, "GamePlayer.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

instruction = "GetMove"
out, _ = player1.communicate(instruction.encode())
print(out.decode())     # process input from player

# do some stuff

instruction = "GetMove"
out, _ = player1.communicate(instruction.encode())
print(out.decode())     # process input from player

GamePlayer.py:

instruction = input()
if(instruction == "GetMove"):
    print("Bc4xc5")
else:
    print("InvalidInstruction")

当然,在第二个 .communicate() python 崩溃后,因为 player1 不再是打开的文件

我的问题是我将如何(在 python 中)编写一个可以主动与多个孩子异步来回交谈的委托?

【问题讨论】:

    标签: python multithreading


    【解决方案1】:

    communicate 是位于player1.stdin.writeplayer1.stdout.read 之上的高级函数。有一种方法可以实现您正在尝试做的事情,但这会给您的代码带来很多复杂性(您需要生成单独的线程来从另一个进程的标准输出读取、刷新等)。如果您想了解所有内容,可以查看communicate 函数的源代码。

    更标准的解决方案是使用客户端-服务器架构通过网络进行通信

    【讨论】:

      【解决方案2】:

      如果这一切都发生在一台机器上,那么我想知道您是否需要有单独的进程。

      如果目标是将播放器进程移动到单独的机器上,那么我建议您在典型的客户端-服务器模型中使用进程之间的网络通信。在这种情况下,我会推荐Twisted

      什么是扭曲?

      Twisted 是一个事件驱动的网络引擎,用 Python 编写并在开源 MIT 许可下获得许可。

      【讨论】:

      • 如果我想在一台计算机上执行此操作但将其模拟为网络,这可能吗?例如,将其编写为在网络上工作,但在一台计算机上运行?
      • 是的,所有网络通信(TCP 套接字等)都可以通过连接到环回地址(对于 ipv4 为 127.0.0.1)而不是远程服务器地址在本地进行
      【解决方案3】:

      为什么不让 GamePlayer 成为一个可以无限调用的函数呢?

      或者更好的是,一个类,游戏中的每个玩家都可以继承它。

      【讨论】:

      • 抽象代码来完成我的目标是一回事,但我不知道如何让它在理论上发挥作用。这是第一位的
      猜你喜欢
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 2013-04-19
      • 2018-08-06
      • 1970-01-01
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多