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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:15:43