我正在制作类似纸牌的游戏。下面的方法处理对手的攻击。它应该经过对手的牌(他们之间有两秒钟的延迟)并执行他们的攻击(dealDamage()返回伤害)。首先,它应该检查当前对手是否处于活动状态(即未被杀死),是否已经进攻,如果是,则执行他们的进攻。之后,方法移至下一个活动对手。在最后一个循环之后,它应该停止迭代并转到下一轮。尽管在第一轮比赛中一切都按计划进行,但随后常常在第二轮或最后一轮(当只有一个对手处于活动状态时)崩溃。最多可以有5个对手。我显然缺少一些明显的东西,但是我无法使它正常工作。

编辑
错误发生在while(gm.opponentList.get(i)。可用...
它用于示例索引超出范围:索引4大小4。

public void opponentAttack(){


    this.registerUpdateHandler(new TimerHandler(2f, true, new ITimerCallback() {
        int i = 0;
        @Override
        public void onTimePassed(TimerHandler pTimerHandler) {



            if (i < gm.opponentList.size()) {
                while (gm.opponentList.get(i).isAvailable == false
                        || gm.opponentList.get(i).attacked == true) {
                    i++;
                }
                if (gm.opponentList.get(i).isAvailable == true
                        && gm.opponentList.get(i).attacked == false) {

                    gm.negotiationStrength = gm.negotiationStrength - gm.opponentList.get(i).dealDamage();
                    i++;
                }
                if (gm.negotiationStrength < 1) {
                    gm.negotiationEnded = true;
                    gm.playersTurn = false;
                }
                i = 0;
            }else{

                pTimerHandler.setAutoReset(false);

            }

        }
    }));

    gm.nextRound();

}

最佳答案

  while (gm.opponentList.get(i).isAvailable == false
                        || gm.opponentList.get(i).attacked == true) {
      i++;
  }


如果从不满足退出条件,则继续增加i,当它超过gm.opponentList的大小时将抛出IndexOutBoundExcetion。您可能想在while循环中对照i检查gm.opponentList.size()

07-27 21:13