私は現在、ツイスト ライブラリを使用して Python でクライアント/サーバー マルチプレイヤー カードゲーム ソリューションに取り組んでいます。私はPythonにはかなり慣れていませんが、このゲームは実際には自分自身の概念実証であり、そのようなことができることを自分自身に示したいだけです. しかし、私は今この問題で約8時間立ち往生しており、アドバイスが必要です. 次の行と次の説明により、ここで何をしようとしているのかがわかります。
説明:
- サーバーが起動しました
- デモクライアントが接続するとすぐに、サーバーはバックグラウンドでいくつかのことを行います(登録、プレーヤー用のカードの山の作成)
- デモ クライアントがカードゲームを開始するようになりました
- remote_start が呼び出され、特定のプレーヤー (実装予定) によって開始された場合、関数 hoststart が呼び出されます。
プレイヤーの山からカードがクライアントに送信され、印刷されます
クライアントは数字(カードの番号)を押すことができるようになり、それをサーバーに送り返して番号を印刷する必要があります(印刷だけでは意味がありませんが、今私の頭に浮かんだのはそれだけです: P)
ここで問題が始まります:
- Reactor.run() が開始されるとすぐに、スクリプト全体が実行され (ユーザー登録、ゲーム開始)、スクリプト全体が実行された後にクライアントでの入力が行われるように見えます。そのため、入力関数内に数値が入力される前に、入力された数値の送信が行われるため、サーバーに 0 が返されます。
これは説明が非常に複雑だと思いますので、質問があれば質問してください。この問題を解決するにはどうすればよいですか?
クライアントがその間に数値を入力できるように、サーバーを数秒間待機させることはできますか? クライアントで入力を待つ必要がある場合、常に開く新しい接続を開く必要がありますか?
client.py:
PICK = 0
factory = pb.PBClientFactory()
reactor.connectTCP("localhost", PORT, factory)
def1 = factory.getRootObject()
def1.addCallbacks(got_obj1, err_obj1)
ret = reactor.run()
def got_obj1(obj1):
def2 = obj1.callRemote("register","User A")
def2 = obj1.callRemote("start","User A")
def2.addCallback(show)
obj1.callRemote("pick",PICK) # Problem
def show(*var)
data_string = json.dumps(var)
decoded = json.loads(data_string)
for card in decoded[0]:
print(str(card['name'])
PICK = Input("Which card do you want to pick?") # Problem
サーバー.py:
print("Starting server on ", PORT)
rpc = RPCs()
reactor.listenTCP(PORT, pb.PBServerFactory(rpc))
reactor.run()
class RPCs(pb.Root):
sessions = []
def remote_pick(self,pick):
print("picked: ", pick)
def remote_start(self, username):
for session in self.sessions :
if (session.getName() == username):
ret = self.hoststart(username)
return ret
def hoststart(self,username):
pile4client = []
card4pile {}
for session in self.sessions:
if (session.getName() == username):
ret = session.showpile(0)
for card in ret:
card4pile = { "name" : card.getName()}
pile4client .append(card4pile)
return pile4client
class Session():
piles = []
def showpile(self, num):
return self.piles[num]