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