除非轮到玩家,否则 TBMP 不会获得游戏更新

Posted

技术标签:

【中文标题】除非轮到玩家,否则 TBMP 不会获得游戏更新【英文标题】:TBMP not getting game updates unless it is player's turn 【发布时间】:2018-11-21 10:41:06 【问题描述】:

我正在尝试将 TBMP 包含在我的麻将游戏中,这个问题已经困扰我几个月了,我离解决它还差得远。

我在一个游戏中有四个玩家,游戏逆时针进行。所以假设你有四个玩家在一张桌子上:

                        Player 3
           ---------------------------
Player 4 |                                |    Player 2
           ---------------------------
                       Player 1

现在轮到玩家 1,数据通过 JSON 推送到游戏数据中,并通知玩家 2 轮到他了。玩家 3 和 4 也收到了比赛更新发生的通知,但是当他们查询游戏数据时,它会返回过时的游戏信息,除非轮到他们,否则他们会获得准确的当前游戏数据。

我希望所有玩家在每一回合后都得到更新,而不是在轮到他们的时候一次性获得所有更新。

我注册一个更新监听器如下:

mTurnBasedMultiplayerClient.registerTurnBasedMatchUpdateCallback(mMatchUpdateCallback);

我有一个按如下方式处理更新的函数:

private TurnBasedMatchUpdateCallback mMatchUpdateCallback = new TurnBasedMatchUpdateCallback() 
  @Override
  public void onTurnBasedMatchReceived(@NonNull TurnBasedMatch turnBasedMatch) 

     int turnStatus = turnBasedMatch.getTurnStatus();

     // OK, it's active. Check on turn status.
     switch (turnStatus) 
        case TurnBasedMatch.MATCH_TURN_STATUS_MY_TURN:

           MainActivity.mTurnData = 
             MahjongTurn.unpersist(turnBasedMatch.getData());
           setLocalGameValues();
           state = GameState.Playing;
           return;

        case TurnBasedMatch.MATCH_TURN_STATUS_THEIR_TURN:

           MainActivity.mTurnData = 
             MahjongTurn.unpersist(turnBasedMatch.getData());
           setLocalGameValues();
           state = GameState.MultiWait;
           return;
     


  

  @Override
  public void onTurnBasedMatchRemoved(@NonNull String matchId) 
     game.showToast("A match was removed.");
     state = GameState.MultiWait;
     return;
  

;

无论如何,监听器已正确注册,我可以看到我的监听器被调用,但对 turnBasedMatch.getData() 的调用仅在轮到玩家时才返回正确的游戏数据。

所以玩家 4 仅在轮到他时才从玩家 1、玩家 2 和玩家 3 获得更新。他会收到比赛有更新的通知,但无法知道当前的比赛数据是什么样的。

这就是它的工作方式吗?我做错了吗?

【问题讨论】:

你查过turn taking GPGS的轮班指南吗,还有github repo的代码参考。 是的,我已经检查了流程和示例。示例完美运行,但它们是一个非常简单的案例。我的游戏要复杂得多。在示例中,它们仅在调用侦听器进行游戏更新时才创建 Toast。我实际上是在尝试更新游戏数据并根据更新显示更新的游戏,但是,游戏数据不会改变以反映更新(在我的情况下)。 调试时,代码有没有进入过 THEIR_TURN 开关?此外,您在两种开关状态下都重复了代码。除了一行(状态变量)之外,每个状态中的所有代码实际上都是相同的。我会将所有代码移到切换发生之前,并将状态作为每个切换案例中的唯一行。 谢谢蒂莫西。是的,我知道代码很草率,但就是这样,因为我正在尝试将部分注释掉,直到它正常工作。就问题而言,是的,我可以验证它确实获得了 THEIR_TURN 和 MY_TURN 的回调,但是游戏数据是陈旧的,直到它是 MY_TURN。 【参考方案1】:

一种解决方法是将所有转弯存储在消息数据中。这样,我可以将游戏数据视为消息队列并重播所有内容直到当前回合。这并不理想,但确实有效。

【讨论】:

以上是关于除非轮到玩家,否则 TBMP 不会获得游戏更新的主要内容,如果未能解决你的问题,请参考以下文章

轮到您启用和禁用按钮

练习:尼姆游戏

除非从 NetBeans 运行,否则 Java Canvas drawString 不会加粗文本

简单博弈论

博弈论Nim游戏:台阶集合拆分(AcWing)

iOS 设计模式实现