Libgdx配对游戏数组局部打乱后重复显示旧图片问题排查
问题排查与修复
核心bug原因
你的洗牌逻辑会把已经展示过的元素(数组前previousIndex位)重新交换到当前要展示的区域,导致重复出现。
看这段关键代码:
int j = rand.nextInt(i+1);
生成的随机数j范围是0到i,第二次调用时previousIndex已经是5,循环i从9到6,此时j可能取到0-5之间的数——这些位置的元素是第一次已经展示过的,交换后旧元素就会被带到新展示区域。
另外,你代码里两个数组(字母和对应图片)是分别打乱的,这会导致字母和图片的配对关系错位,属于隐藏问题。
修复方案
- 限制随机数范围,只打乱未使用元素:把
j的生成范围限定在previousIndex到i之间,避免触碰已经展示过的元素区域。 - 同步打乱两个数组:用同一个随机索引
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
相关产品推荐
相关产品推荐

