C#中用If语句设置二维数组元素访问限制及游戏边界判定
嘿,咱们一步步来解决你的这两个需求,结合游戏场景给你实用的C#代码示例:
1. 使用C#的If语句实现二维数组元素的访问限制
二维数组访问最容易踩的坑就是索引越界异常,用If语句可以很直观地规避这个问题——核心思路就是在访问前判断目标索引是否落在数组的合法范围内。
假设我们有一个游戏网格用二维数组存储,下面是一个封装好的安全访问方法:
// 定义示例游戏网格(5行5列) GridCellState[,] gameGrid = new GridCellState[5, 5]; // 安全访问网格元素的方法,返回是否访问成功,同时输出对应值 bool TryAccessGridCell(int row, int col, out GridCellState cellState) { cellState = default; // 用If判断行索引是否合法 if (row < 0 || row >= gameGrid.GetLength(0)) { Console.WriteLine("行索引超出网格范围!"); return false; } // 再用If判断列索引是否合法 if (col < 0 || col >= gameGrid.GetLength(1)) { Console.WriteLine("列索引超出网格范围!"); return false; } // 索引合法,返回对应单元格状态 cellState = gameGrid[row, col]; return true; }
这个方法会先检查行和列的索引是否在有效区间内,只有合法才会返回对应元素,避免抛出IndexOutOfRangeException,非常适合游戏里的网格操作场景。
2. 游戏边界规则实现
根据你的需求,我们需要实现:点击圆形时,找到符合条件的可移动空位并标红,同时排除带蓝色叉号的越界区域。先明确规则细节:
- 前提:点击的位置必须是存在圆形的有效位置
- 条件1:该圆形有相邻的圆形(上下左右/八方向,这里以常用的四方向为例)
- 条件2:相邻圆形的同一方向侧有空位
- 排除:带蓝色叉号的区域视为越界,不能作为可移动位置
第一步:定义基础数据结构
先给网格元素的状态和位置做结构化定义:
// 网格单元格的状态枚举 public enum GridCellState { Empty, // 空位 HasCircle, // 存在圆形 OutOfBounds // 带蓝色叉号的越界区域 } // 网格位置结构体,方便存储行列坐标 public struct GridPosition { public int Row { get; set; } public int Col { get; set; } public GridPosition(int row, int col) => (Row, Col) = (row, col); }
第二步:实现核心逻辑
下面是网格管理器类的核心代码,包含点击后的可移动位置计算和越界判断:
public class GameGridManager { private GridCellState[,] _grid; private int _totalRows; private int _totalCols; // 初始化网格 public GameGridManager(int rows, int cols) { _totalRows = rows; _totalCols = cols; _grid = new GridCellState[rows, cols]; // 这里可以初始化网格,比如设置某些位置为OutOfBounds(带蓝色叉号) } // 处理圆形点击,返回所有可移动的空位(后续可对这些位置标红) public List<GridPosition> GetValidMoveTargets(GridPosition clickedCirclePos) { var validTargets = new List<GridPosition>(); // 先判断点击的位置是否是有效圆形(防止误点空位/越界区域) if (_grid[clickedCirclePos.Row, clickedCirclePos.Col] != GridCellState.HasCircle) { return validTargets; } // 定义四个相邻方向(上下左右,可根据需求扩展为八方向) var directions = new List<GridPosition> { new GridPosition(-1, 0), // 上 new GridPosition(1, 0), // 下 new GridPosition(0, -1), // 左 new GridPosition(0, 1) // 右 }; foreach (var dir in directions) { // 第一步:找到点击圆形的相邻位置 var neighborPos = new GridPosition(clickedCirclePos.Row + dir.Row, clickedCirclePos.Col + dir.Col); // 检查相邻位置是否合法且存在圆形 if (IsPositionValid(neighborPos) && _grid[neighborPos.Row, neighborPos.Col] == GridCellState.HasCircle) { // 第二步:找到相邻圆形旁的空位(同一方向再走一步) var targetPos = new GridPosition(neighborPos.Row + dir.Row, neighborPos.Col + dir.Col); // 检查目标位置是否合法、是空位,且不是越界区域 if (IsPositionValid(targetPos) && _grid[targetPos.Row, targetPos.Col] == GridCellState.Empty) { validTargets.Add(targetPos); // 这里调用UI方法标红该位置,比如: // UIManager.Instance.MarkPositionAsRed(targetPos); } } } return validTargets; } // 辅助方法:判断位置是否在网格内且不是越界区域 private bool IsPositionValid(GridPosition pos) { // 先判断是否超出网格范围 if (pos.Row < 0 || pos.Row >= _totalRows || pos.Col < 0 || pos.Col >= _totalCols) return false; // 带蓝色叉号的区域直接视为无效 return _grid[pos.Row, pos.Col] != GridCellState.OutOfBounds; } }
关键逻辑说明
IsPositionValid是核心过滤方法,既排除了网格外的位置,也排除了带蓝色叉号的越界区域- 点击后先遍历所有方向,找到存在的相邻圆形,再往同一方向寻找空位,符合条件的就加入可移动列表并触发标红
- 如果相邻位置本身是越界区域或者没有圆形,直接跳过该方向的判断
内容的提问来源于stack exchange,提问作者user2963022
相关产品推荐
相关产品推荐

