有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用LibGDX数组的java IndexOutOfBoundsException错误

我在运行我的洗牌方法时不断出错。下面是我的洗牌方法。Im使用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) 个答案

  1. # 1 楼答案

    这条线

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

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

    int random = MathUtils.random(length);
    

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

    在循环的最后四行中,已经有了一种方便的方法:

    deckone.swap(i, random);
    

    实际上,已经有一种方便的方法可以洗牌整个数组,这样就可以用

    deckone.shuffle();