如何用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; }
关键逻辑说明
- 边界与终止检查:每次递归先判断坐标是否合法,遇到已打开单元格或炸弹直接返回,避免数组越界和无限递归。
- 空白展开触发:当当前单元格周围无炸弹时,遍历8个方向的相邻单元格,递归调用
Open方法,实现连锁展开。 - 炸弹数量计算:示例里是实时计算,实际开发建议在游戏初始化、放置完炸弹后,一次性计算所有单元格的周围炸弹数,提升运行效率。
内容的提问来源于stack exchange,提问作者Khyran Bush Student
相关产品推荐
相关产品推荐

