0

我目前正在使用扭曲库在 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]

4

1 回答 1

0

传递obj1show它并调用它callRemote的显示。像这样的东西:

def got_obj1(obj1):
   ...
   def2.addCallback(show, obj1)

def show(value, obj1):
   ...
   PICK = Input("Which card do you want to pick?")
   obj1.callRemote("pick",PICK)
于 2013-04-15T16:27:00.063 回答