You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Libgdx配对游戏数组局部打乱后重复显示旧图片问题排查

问题排查与修复

核心bug原因

你的洗牌逻辑会把已经展示过的元素(数组前previousIndex位)重新交换到当前要展示的区域,导致重复出现。

看这段关键代码:

int j = rand.nextInt(i+1);

生成的随机数j范围是0到i,第二次调用时previousIndex已经是5,循环i从9到6,此时j可能取到0-5之间的数——这些位置的元素是第一次已经展示过的,交换后旧元素就会被带到新展示区域。

另外,你代码里两个数组(字母和对应图片)是分别打乱的,这会导致字母和图片的配对关系错位,属于隐藏问题。

修复方案

  1. 限制随机数范围,只打乱未使用元素:把j的生成范围限定在previousIndex到i之间,避免触碰已经展示过的元素区域。
  2. 同步打乱两个数组:用同一个随机索引j同时交换字母和图片数组的元素,保证配对关系不被破坏。

修复后的代码:

// 调用方式保持不变
Shuffle(alphabets, previousIndex +5, pictures, previousIndex + 5);

public void Shuffle(Image[] firstCol, int sizeFirst, Image[] secondCol, int sizeSecond){
    // 仅在未使用的元素区间内洗牌
    for (int i = sizeFirst-1 ; i > previousIndex; i--) {
        // 生成previousIndex到i之间的随机索引,避免已展示元素被卷入
        int j = rand.nextInt(i - previousIndex + 1) + previousIndex;
        
        // 同步交换两个数组的元素,维持字母与图片的配对关系
        Image temp = firstCol[i];
        firstCol[i] = firstCol[j];
        firstCol[j] = temp;

        temp = secondCol[i];
        secondCol[i] = secondCol[j];
        secondCol[j] = temp;
    }
    previousIndex += 5;
    ShowAlphabets(firstCol, secondCol);
}

额外说明

  • 若previousIndex初始值为0,每次调用后累加5,直到25(最后一组仅1个元素),可保证所有元素仅展示一次。
  • 必须同步打乱两个数组,否则会出现字母和对应图片不匹配的问题。

内容的提问来源于stack exchange,提问作者Md Humza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:27:25