代码之家  ›  专栏  ›  技术社区  ›  phoenix

使用LibGDX数组时出现IndexOutOfBoundsException错误

  •  0
  • phoenix  · 技术社区  · 10 年前

    我在运行shuffle方法时不断出错。下面是我的洗牌方法。我使用LibGDX在java中编码,并重新排列数组列表。

    public Array<Card> shuffle(){    
        for (int i = 0; i < deckOne.size; i++) {
            int length = deckOne.size;
            int random = (int)Math.floor(Math.random() * length);
    
            Card c = deckOne.removeIndex(random);
            Card temp = deckOne.removeIndex(i);
            deckOne.insert(i, c);
            deckOne.insert(random, temp);    
        }
        return deckOne;
    }
    

    然后我在我的主游戏中调用这个方法: deckOne.shuffle();

    出现此错误

    Exception in thread "LWJGL Application" java.lang.IndexOutOfBoundsException: index can't be >= size: 19 >= 19
    at com.battleforbronze.game.Model.Deck1.shuffle(Deck1.java:57)
    

    我的问题是如何修复这个错误。我看到的关于这个话题的大多数其他问题都是这样的 int i = 0 一定是 int i = 1 .

    任何帮助都将不胜感激。

    1 回复  |  直到 10 年前
        1
  •  0
  •   Tenfour04    10 年前

    这条线

    int random = (int)Math.floor(Math.random() * length);
    

    生成从0到长度的随机整数 包含全部费用 ,因此如果选择最大值( length ),对于数组来说,索引太大,因为索引从零开始。因此,要么减去1: (int)Math.floor(Math.random() * (length - 1)) ,或使用内置的LibGDX函数,该函数返回从0到长度的随机整数 独家 :

    int random = MathUtils.random(length);
    

    但还有另一个问题。您从牌组中取出两张牌,然后使用在缩小阵列之前获取的索引插入它们。当你到达牌组的末尾(i==length-1)时,当你尝试插入新的牌时,它的索引对于现在较小的数组(现在的长度为-2)来说太大了。

    对于您在循环的最后四行中要做的事情,已经有了一种方便的方法:

    deckone.swap(i, random);
    

    事实上,已经有一种方便的方法可以洗牌整个数组,这样整个方法就可以替换为

    deckone.shuffle();