C#遍历二维数组上下左右元素,实现跳棋游戏结束条件求助
解决跳棋游戏结束条件的上下左右遍历逻辑
嘿,我来帮你搞定这个跳棋游戏里的上下左右遍历逻辑,进而完成游戏结束条件的判断~
第一步:实现上下左右四方向遍历方法
你已经有了8方向的相邻元素扫描方法,现在咱们针对上下左右四个方向做一个简化版的方法,核心是做好数组边界检查,避免索引越界:
public static IEnumerable<T> FourDirectionalAdjacentElements<T>(T[,] arr, int row, int column) { int totalRows = arr.GetLength(0); int totalCols = arr.GetLength(1); // 检查上方元素(行索引减1,列不变) if (row - 1 >= 0) yield return arr[row - 1, column]; // 检查下方元素(行索引加1,列不变) if (row + 1 < totalRows) yield return arr[row + 1, column]; // 检查左侧元素(列索引减1,行不变) if (column - 1 >= 0) yield return arr[row, column - 1]; // 检查右侧元素(列索引加1,行不变) if (column + 1 < totalCols) yield return arr[row, column + 1]; }
这个方法会逐个校验四个方向的索引是否在数组的合法范围内,只有合法的位置才会返回对应的元素,完全不用担心越界报错的问题。
第二步:结合游戏规则判断游戏结束
接下来咱们把这个遍历方法用到游戏结束条件的判断里。根据你的描述,场上的棋子是Ellipse,被移除的位置是Border,假设你的游戏结束条件是所有剩余棋子都没有可移动的空位,可以参考下面的判断逻辑:
public bool CheckIfGameOver(UIElement[,] gameBoard) { int boardRows = gameBoard.GetLength(0); int boardCols = gameBoard.GetLength(1); // 遍历整个棋盘的每一个位置 for (int row = 0; row < boardRows; row++) { for (int col = 0; col < boardCols; col++) { // 找到当前位置的未被移除的棋子 if (gameBoard[row, col] is Ellipse currentChessPiece) { // 获取该棋子上下左右的相邻元素 var adjacentPositions = FourDirectionalAdjacentElements(gameBoard, row, col); // 检查相邻位置中是否存在可移动的空位(这里以Border作为空位判断依据) if (adjacentPositions.Any(pos => pos is Border)) { // 只要有一个棋子还能移动,游戏就没结束 return false; } } } } // 所有棋子都没有可移动的位置,触发游戏结束 return true; }
小提示
如果你的跳棋规则支持跳跃吃子(比如跳过对方棋子落到空位),那可以在这个基础上扩展逻辑:比如先检查上下左右的相邻元素,如果是对方棋子,再检查该棋子外侧的位置是否是空位,这样就能判断是否可以进行跳跃操作啦。
内容的提问来源于stack exchange,提问作者user2963022
相关产品推荐
相关产品推荐

