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

游戏开发:如何正确检测二维数组中≥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;
    }

问题分析

  1. 计数器未重置:遇到不同元素或空元素时,counter没有归零,导致中间断档的相同元素会累加之前的计数。比如['b','b',' ','b','b']中,前两个b让counter变成2,遇到空元素不重置,后面两个b又把counter加到4,触发了删除逻辑。
  2. 删除逻辑不准确:边遍历边调用deleteRows(i,j),没有记录连续段的起始位置,根本不知道要删哪一段,只会误删当前位置及之前的元素。
  3. 结果统计错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:45:25