2014-02-11 140 views
0

我試圖寫一個遊戲像井字棋或西洋跳棋/國際象棋的作品像這樣的遊戲管理器/控制器:Python腳本溝通

遊戲仲裁者:控制遊戲和繼電器對手的遊戲移動到每個玩家。還確定是否一個舉動是一個法律問題

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後()蟒崩潰因爲PLAYER1不再是開放文件

我的問題是我將如何寫(在Python中)一個代表誰可以積極地與多個孩子來回與異步異議?

回答

0

爲什麼不讓GamePlayer成爲無限調用的函數?

或者更好的是,一個遊戲中的每個玩家可以從中繼承的類。

+0

抽象代碼來完成我的目標是一回事,但我不知道如何讓它在理論上起作用。這是第一 – Parad0x13

1

communicate是一個高級功能,它位於player1.stdin.writeplayer1.stdout.read之上。有一種方法可以實現你正在嘗試做的事情,但是這會給你的代碼帶來很多複雜性(你需要產生單獨的線程來讀取另一個進程的標準輸出,刷新等)。如果你想通過所有你可以檢查communicate函數的源代碼。

更標準的解決方案是使用客戶端 - 服務器架構。如果這一切是一臺機器上發生的事情在網絡上

1

進行溝通,然後如果你需要有獨立的過程我會懷疑。

如果目標是將播放器進程移到單獨的機器上,那麼我建議您在典型的客戶端 - 服務器模型中使用進程之間的網絡通信。在這種情況下,我會推薦Twisted

什麼是扭曲的?

Twisted是一個事件驅動的網絡引擎,用Python編寫,並以開放源代碼的MIT許可證授權。

+0

如果我想在一臺電腦上做到這一點,但它可以作爲一個網絡模擬它可能嗎?例如寫它在網絡上工作,而不是在一臺計算機上運行它? – Parad0x13

+0

是的,所有網絡通信(TCP套接字等)都可以通過連接到環回地址(127.0.0.1 for ipv4)而不是遠程服務器地址 –