/// <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)); }
/// <summary> /// 指定座標が通れるかどうかを確認します。 /// </summary> /// <param name="point">座標を指定します。</param> /// <returns></returns> public bool CheckPath(MapPoint point) { return(CheckPath(point.X, point.Y)); }