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

如何用C#实现扫雷中选中单元格及周边空白单元格的展开功能

C#扫雷:实现空白单元格自动展开功能

要实现扫雷里的空白区域连锁展开,得在你现有Open方法基础上加入递归遍历周边单元格的逻辑——核心思路是:当打开的单元格周围没有炸弹时,自动遍历它的8个相邻单元格,重复执行打开操作,直到遇到带炸弹提示的单元格为止。

先明确Cell类需要补充的属性

你的cells二维数组里的每个Cell对象,至少需要这几个属性(现有代码只用到了Open):

  • bool Open:是否已打开
  • bool Bomb:是否是炸弹
  • int AdjacentBombs:存储周围的炸弹数量

修改后的完整实现代码

// 打开单元格,若为空白则自动展开周边区域
public bool Open(int row, int column)
{
    // 边界判断:坐标超出棋盘范围直接返回
    if (row < 0 || row >= Dimension || column < 0 || column >= Dimension)
        return false;

    Cell cell = cells[row, column];
    
    // 已打开的单元格/炸弹单元格直接返回(点击炸弹的游戏结束逻辑可自行补充)
    if (cell.Open || cell.Bomb)
        return false;

    // 标记当前单元格为已打开
    cell.Open = true;

    // 计算当前单元格周围的炸弹数(也可以在游戏初始化时提前算好,这里做实时计算示例)
    int adjacentBombs = CalculateAdjacentBombs(row, column);
    cell.AdjacentBombs = adjacentBombs;

    // 如果周围没有炸弹,递归遍历8个方向的相邻单元格
    if (adjacentBombs == 0)
    {
        // 8个方向的坐标偏移:上下左右+四个对角线
        int[] rowOffsets = { -1, -1, -1, 0, 0, 1, 1, 1 };
        int[] colOffsets = { -1, 0, 1, -1, 1, -1, 0, 1 };

        for (int i = 0; i < 8; i++)
        {
            int newRow = row + rowOffsets[i];
            int newCol = column + colOffsets[i];
            // 递归打开相邻单元格
            Open(newRow, newCol);
        }
    }

    return true;
}

// 辅助方法:计算指定单元格周围的炸弹数量
private int CalculateAdjacentBombs(int row, int column)
{
    int bombCount = 0;
    // 8个方向的偏移量
    int[] rowOffsets = { -1, -1, -1, 0, 0, 1, 1, 1 };
    int[] colOffsets = { -1, 0, 1, -1, 1, -1, 0, 1 };

    for (int i = 0; i < 8; i++)
    {
        int checkRow = row + rowOffsets[i];
        int checkCol = column + colOffsets[i];
        // 检查坐标是否在棋盘内,且对应单元格是炸弹
        if (checkRow >= 0 && checkRow < Dimension && checkCol >= 0 && checkCol < Dimension)
        {
            if (cells[checkRow, checkCol].Bomb)
                bombCount++;
        }
    }
    return bombCount;
}

关键逻辑说明

  1. 边界与终止检查:每次递归先判断坐标是否合法,遇到已打开单元格或炸弹直接返回,避免数组越界和无限递归。
  2. 空白展开触发:当当前单元格周围无炸弹时,遍历8个方向的相邻单元格,递归调用Open方法,实现连锁展开。
  3. 炸弹数量计算:示例里是实时计算,实际开发建议在游戏初始化、放置完炸弹后,一次性计算所有单元格的周围炸弹数,提升运行效率。

内容的提问来源于stack exchange,提问作者Khyran Bush Student

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:10:25