我正在尝试为像Tic-Tac-Toe或checkers / chess这样的游戏编写游戏管理器/控制器:
Game Arbiter:控制游戏的游戏玩法,并将对手的动作转发给每个玩家。还确定移动是否合法
GamePlayer.py
GameArbiter.py
我遇到的问题是仲裁者将如何与玩家沟通?我想使用PIPE.communicate(),但似乎只有在每个.communicate()请求之后Player终止时才有效。我的代码是这样的:
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中)一个可以与多个孩子异步地来回交谈的代表?
答案 0 :(得分:1)
communicate
是一个位于player1.stdin.write
和player1.stdout.read
之上的高级函数。有一种方法可以实现你想要做的事情,但这会给你的代码带来很多复杂性(你需要产生单独的线程来读取另一个进程的stdout,刷新等)。如果您想完成所有这些操作,可以查看communicate
函数的源代码。
更标准的解决方案是使用客户端 - 服务器架构通过网络进行通信
答案 1 :(得分:1)
如果所有这一切都发生在一台机器上,那么我想知道你是否需要单独的流程。
如果目标是将播放器进程移动到单独的计算机上,那么我建议您在典型的客户端 - 服务器模型中使用进程之间的网络通信。在这种情况下,我会推荐Twisted
什么是扭曲?
Twisted是一个事件驱动的网络引擎,用Python编写,并在开源MIT许可下获得许可。
答案 2 :(得分:0)
为什么不让GamePlayer成为无限调用的函数?
或者更好的是,一个游戏中每个玩家都会从中继承的类。