我目前正在使用扭曲库在 python 中开发客户端/服务器多玩家纸牌游戏解决方案。我对 python 很陌生,这个游戏实际上是对我自己的概念证明,因为我只是想向自己展示,我可以做这样的事情。但我现在在这个问题上停留了大约 8 个小时,我需要一些建议。以下几行和以下描述应该让您知道,我想在这里做什么:
描述:
- 服务器已启动
- 演示客户端一连接,服务器就会在后台做一些事情(注册,为玩家创建一堆卡片)
- 演示客户端现在开始()纸牌游戏
- 调用 remote_start 并调用函数 hoststart 如果它由某个播放器启动(待实现)
玩家堆中的卡片被发送到客户端并打印出来
客户端现在应该能够按下一个数字(卡号),然后应该将其发送回服务器以打印出该数字(仅打印没有意义,但这是我现在唯一想到的事情: P)
现在这里开始问题:
- 启动 reactor.run() 后,似乎执行了整个脚本(用户注册,游戏启动),并且在执行整个脚本后完成了客户端的输入。因此在输入函数中输入数字之前完成了输入数字的发送,因此向服务器返回 0。
我认为这很难解释,所以请提出任何可能出现的问题。我该如何解决这个问题?
我可以以某种方式让服务器等待几秒钟,以便客户端能够在此期间输入数字吗?如果必须等待客户端上的输入,我是否需要打开一个始终打开的新连接?
客户端.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]