예제 #1
0
        /// <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);
        }
예제 #2
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));
        }