游戏开发:如何正确检测二维数组中≥3个连续元素并删除?
修复二维数组连续元素消除逻辑的错误
开发了一款类《糖果传奇》的消除游戏,规则是在二维数组的行/列中找出3至7个连续的非空相同元素,计分后删除这些元素。比如数组
['a', 'b', 'b', 'b', 'a']处理后应该是['a', '', '', '', 'a'],但当前代码会把['b', 'b', ' ', 'b', 'b']误判为符合条件并全删,得到['', '', '', '', '']的错误结果,问题出在计数器逻辑上。
现有问题代码
public int[] checkRows() { int[] results = new int[BOARD_SIZE]; for (int i = 0; i < BOARD_SIZE; i++) { int counter = 1; int counterHead = 1; int j = 0; while (j < BOARD_SIZE) { if (j+1 < BOARD_SIZE) { if (getBoard()[i][j].getType() == getBoard()[i][j+1].getType() && getBoard()[i][j].getType() != ' ') { counter++; } } if (counter >= 3) deleteRows(i, j); j++; } results[i] = counter; } return results; }
问题分析
- 计数器未重置:遇到不同元素或空元素时,
counter没有归零,导致中间断档的相同元素会累加之前的计数。比如['b','b',' ','b','b']中,前两个b让counter变成2,遇到空元素不重置,后面两个b又把counter加到4,触发了删除逻辑。 - 删除逻辑不准确:边遍历边调用
deleteRows(i,j),没有记录连续段的起始位置,根本不知道要删哪一段,只会误删当前位置及之前的元素。 - 结果统计错误:
results[i]只存了每行最后一个counter值,完全无法反映实际消除的元素数量。
修复后的代码
public int[] checkRows() { int[] results = new int[BOARD_SIZE]; for (int i = 0; i < BOARD_SIZE; i++) { int currentCount = 1; char currentType = getBoard()[i][0].getType(); int startIndex = 0; int rowEliminateCount = 0; // 记录该行消除的元素总数 // 遍历当前行的每个元素(从第2个开始) for (int j = 1; j < BOARD_SIZE; j++) { char nextType = getBoard()[i][j].getType(); // 当前元素和下一个元素相同且非空,计数+1 if (nextType != ' ' && nextType == currentType) { currentCount++; } else { // 遇到中断,检查之前的连续段是否符合3-7的要求 if (currentCount >= 3 && currentCount <= 7) { deleteRowSegment(i, startIndex, j - 1); rowEliminateCount += currentCount; } // 重置计数、当前类型和起始索引 currentCount = 1; currentType = nextType; startIndex = j; } } // 处理行尾的最后一段连续元素 if (currentCount >= 3 && currentCount <= 7) { deleteRowSegment(i, startIndex, BOARD_SIZE - 1); rowEliminateCount += currentCount; } results[i] = rowEliminateCount; } return results; } // 精准删除指定行的连续段区间 private void deleteRowSegment(int row, int start, int end) { for (int j = start; j <= end; j++) { getBoard()[row][j].setType(' '); // 设置为空元素 } }
修复说明
- 新增
startIndex跟踪连续段的起始位置,确保只删除真正连续的区间。 - 遇到元素中断时立即检查之前的连续段长度,符合条件才调用删除方法。
- 新增
deleteRowSegment方法,精准删除指定区间的元素,避免误删。 results数组现在记录每行实际消除的元素总数,更贴合需求。- 额外处理行尾的连续段,防止遗漏行末的有效消除项。
内容的提问来源于stack exchange,提问作者Pablo pelotazos
相关产品推荐
相关产品推荐

