public KakuBoxMovingStep(KakuBoxState state, int movingBoxIndex, BoxMovingDirection boxMovingDirection)
            : base(state, movingBoxIndex, boxMovingDirection)
        {
            var movingBox = state[movingBoxIndex];

            switch (boxMovingDirection)
            {
            case BoxMovingDirection.Up:
                kakuPushingPoint = new Point(movingBox.X, movingBox.Y - 1);
                break;

            case BoxMovingDirection.Down:
                kakuPushingPoint = new Point(movingBox.X, movingBox.Y + 1);
                break;

            case BoxMovingDirection.Left:
                kakuPushingPoint = new Point(movingBox.X + 1, movingBox.Y);
                break;

            case BoxMovingDirection.Right:
                kakuPushingPoint = new Point(movingBox.X - 1, movingBox.Y);
                break;

            default: break;
            }
        }
        public bool Check(BoxMovingStep movingStep)
        {
            KakuBoxState state = (KakuBoxState)movingStep.Final;

            var finds = queue.FindSameBoxState(state);

            if (finds.Count > 0)
            {
                foreach (var find in finds)
                {
                    if (find.Kaku.Equals(state.Kaku))
                    {
                        return(false);
                    }
                    else
                    {
                        var newMap = new ExtendedMap(this.map, find.Boxs);

                        PointToPointPathFinder pathFinder = new PointToPointPathFinder(newMap, find.Kaku);

                        if (pathFinder.HasPath(state.Kaku))
                        {
                            return(false);
                        }
                    }
                }
            }
            return(true);
        }
        public override bool Equals(Object obj)
        {
            KakuBoxState s = obj as KakuBoxState;

            if (object.ReferenceEquals(s, null))
            {
                return(false);
            }

            return(kaku == s.kaku && base.Equals(obj));
        }
Beispiel #4
0
        static void Main(string[] args)
        {
            Map map = new Map(new Point[] { new Point(0, 0), new Point(0, 1), new Point(3, 0), new Point(4, 0), new Point(5, 0), new Point(1, 3)
                                            , new Point(3, 2), new Point(3, 4) });

            map.XDownBound = 0;
            map.XUpBound   = 5;
            map.YDownBound = 0;
            map.YUpBound   = 4;

            KakuBoxState start = new KakuBoxState(new Point(5, 4), new Point[] { new Point(1, 2), new Point(3, 3), new Point(4, 2) });
            BoxState     end   = new BoxState(new Point[] { new Point(2, 1), new Point(2, 2), new Point(2, 4) });

            KakuBoxMovingFinder finder = new KakuBoxMovingFinder(map, start);

            Stopwatch sw = new Stopwatch();

            sw.Start();

            var path = finder.FindPath(end);

            sw.Stop();

            if (path.Count > 0)
            {
                Console.WriteLine("Find it!");

                foreach (var state in path)
                {
                    Console.WriteLine(state.ToString());
                }
            }
            else
            {
                Console.WriteLine("No answer. Are you kidding me!");
            }
            Console.WriteLine("Total used time:{0}", sw.Elapsed.TotalSeconds);
            Console.ReadLine();
        }