/// <summary> /// 袋小路かどうかを確認します。 /// </summary> /// <param name="mapData">迷路データを指定します。</param> /// <param name="point">確認する座標を指定します。</param> /// <returns></returns> private static bool CheckFukuroKoji(IReadOnlyList <IReadOnlyList <bool> > mapData, MapPoint point) { var width = mapData[0].Count; var height = mapData.Count; var walls = 0; MapPoint pt; pt = point.Offset(0, 1, Direction.Left); walls += pt.X < 0 ? 1 : (mapData[pt.Y][pt.X] ? 0 : 1); pt = point.Offset(0, 1, Direction.Up); walls += pt.Y < 0 ? 1 : (mapData[pt.Y][pt.X] ? 0 : 1); pt = point.Offset(0, 1, Direction.Right); walls += pt.X >= width ? 1 : (mapData[pt.Y][pt.X] ? 0 : 1); pt = point.Offset(0, 1, Direction.Down); walls += pt.Y >= height ? 1 : (mapData[pt.Y][pt.X] ? 0 : 1); return(walls == 3); }
/// <summary> /// 位置と向きから迷路の状態を取得します。 /// </summary> /// <param name="point">調べたい位置を指定します。</param> /// <param name="direction">調べたい向きを指定します。</param> /// <returns>指定された位置と向きにおける迷路の状態を返します。</returns> public MapStatus GetMapStatus(MapPoint point, Direction direction) { if (MapData == null) { return(MapStatus.None); } var left = -1; var right = -1; // 現在の位置から見て // 左の確認 var left0 = CheckPath(point.Offset(1, 0, direction)); // 右の確認 var right0 = CheckPath(point.Offset(-1, 0, direction)); // 目の前の確認 var stop0 = CheckPath(point.Offset(0, 1, direction)); if (!stop0) { // 行き止まりだったらここで確定 return(GetStatus(0, left0 ? 0 : -1, right0 ? 0 : -1)); } // 一歩進んだ位置から見て // 左の確認 var left1 = CheckPath(point.Offset(1, 1, direction)); // 右の確認 var right1 = CheckPath(point.Offset(-1, 1, direction)); // 目の前の確認 var stop1 = CheckPath(point.Offset(0, 2, direction)); if (!stop1) { // 行き止まりだったらここで確定 if (left0) { left = 0; } else if (left1) { left = 1; } if (right0) { right = 0; } else if (right1) { right = 1; } return(GetStatus(1, left, right)); } // 二歩進んだ位置から見て // 左の確認 var left2 = CheckPath(point.Offset(1, 2, direction)); // 右の確認 var right2 = CheckPath(point.Offset(-1, 2, direction)); // 目の前の確認 var stop2 = CheckPath(point.Offset(0, 3, direction)); if (left0 && left2) { left = 3; } else if (left0) { left = 0; } else if (left1) { left = 1; } else if (left2) { left = 2; } if (right0 && right2) { right = 3; } else if (right0) { right = 0; } else if (right1) { right = 1; } else if (right2) { right = 2; } return(GetStatus(stop2 ? -1 : 2, left, right)); }