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 BoxMovingStep(BoxState state, int movingBoxIndex, BoxMovingDirection boxMovingDirection)
        {
            if (state == null)
            {
                throw new ArgumentNullException("state");
            }

            if (movingBoxIndex < 0 || movingBoxIndex >= state.BoxCount)
            {
                throw new ArgumentOutOfRangeException("movingBoxIndex");
            }

            Orignal         = state;
            MovingBoxIndex  = movingBoxIndex;
            MovingDirection = boxMovingDirection;
        }
 protected override BoxMovingStep MakeStep(int boxIdx, BoxMovingDirection direction)
 {
     return(new KakuBoxMovingStep(this, boxIdx, direction));
 }
 protected virtual BoxMovingStep MakeStep(int boxIdx, BoxMovingDirection direction)
 {
     return(new BoxMovingStep(this, boxIdx, direction));
 }