Beispiel #1
0
        private bool TryMove(int dx, int dy)
        {
            //preconditions
            if (dx * dy != 0)
            {
                throw new InvalidOperationException("Only horizontal or vertical movement allowed.");
            }
            if (dx < -1 || dx > 1)
            {
                throw new ArgumentException(nameof(dx));
            }
            if (dy < -1 || dy > 1)
            {
                throw new ArgumentException(nameof(dy));
            }

            var x = PlayerX + dx;
            var y = PlayerY + dy;

            if (x < 0 || x >= Width || y < 0 || y >= Height)
            {
                return(false);
            }

            //Wall
            if (Walls.Any(wall => wall.Item1 == x && wall.Item2 == y))
            {
                return(false);
            }

            var step = new Step();

            //Crate
            var crate = Crates.FirstOrDefault(c => c.X == x && c.Y == y);

            if (crate != null)
            {
                var x0 = x + dx;
                var y0 = y + dy;
                if (Walls.Any(wall => wall.Item1 == x0 && wall.Item2 == y0) || Crates.Any(c => c.X == x0 && c.Y == y0))
                {
                    return(false);
                }

                step.Crate     = crate;
                step.OldCrateX = crate.X;
                step.OldCrateY = crate.Y;

                crate.X += dx;
                crate.Y += dy;
            }

            step.OldPlayerX = PlayerX;
            step.OldPlayerY = PlayerY;
            _steps.Push(step);
            PlayerX += dx;
            PlayerY += dy;
            return(true);
        }