Beispiel #1
0
        private List <Location> GetWalkableAdjacentSquares(int x, int y, string[] map, Car car)
        {
            var proposedLocations = new List <Location>()
            {
                new Location {
                    X = x, Y = y - 1
                },
                new Location {
                    X = x, Y = y + 1
                },
                new Location {
                    X = x - 1, Y = y
                },
                new Location {
                    X = x + 1, Y = y
                },
            };

            if (proposedLocations[0].Y == -1)
            {
                proposedLocations[0] = new Location {
                    X = x, Y = 59
                }
            }
            ;
            if (proposedLocations[1].Y == 60)
            {
                proposedLocations[1] = new Location {
                    X = x, Y = 0
                }
            }
            ;
            if (proposedLocations[2].X == -1)
            {
                proposedLocations[2] = new Location {
                    X = 59, Y = y
                }
            }
            ;
            if (proposedLocations[3].X == 60)
            {
                proposedLocations[3] = new Location {
                    X = 0, Y = y
                }
            }
            ;

            Pos jarda       = new Pos(0, 0);
            Pos jarda2      = new Pos(0, 0);
            Pos korforgalom = new Pos(0, 0);

            //switch (car.Direction)
            //{
            //    case "UP":
            //        jarda.PosX = car.Position.PosX + 1; jarda.PosY = car.Position.PosY;
            //        jarda2.PosX = car.Position.PosX + 1; jarda2.PosY = car.Position.PosY + 1;
            //        korforgalom.PosX = car.Position.PosX - 1; jarda.PosY = car.Position.PosY;
            //        break;
            //    case "DOWN":
            //        jarda.PosX = car.Position.PosX - 1; jarda.PosY = car.Position.PosY;
            //        jarda2.PosX = car.Position.PosX - 1; jarda2.PosY = car.Position.PosY - 1;
            //        korforgalom.PosX = car.Position.PosX + 1; jarda.PosY = car.Position.PosY;
            //        break;
            //    case "LEFT":
            //        jarda.PosX = car.Position.PosX; jarda.PosY = car.Position.PosY - 1;
            //        jarda2.PosX = car.Position.PosX + 1; jarda2.PosY = car.Position.PosY - 1;
            //        korforgalom.PosX = car.Position.PosX - 1; jarda.PosY = car.Position.PosY;
            //        break;
            //    case "RIGHT":
            //        jarda.PosX = car.Position.PosX; jarda.PosY = car.Position.PosY + 1;
            //        jarda2.PosX = car.Position.PosX - 1; jarda2.PosY = car.Position.PosY + 1;
            //        korforgalom.PosX = car.Position.PosX + 1; jarda.PosY = car.Position.PosY;
            //        break;
            //}

            //foreach (Location l in proposedLocations)
            //{
            //    if ()
            //}


            return(proposedLocations.Where(l => map[l.Y][l.X] == 'S' || map[l.Y][l.X] == 'Z').ToList());
        }
Beispiel #2
0
        public Routing FindRoute(int StartX, int StartY, int TargetX, int TargetY, Car car)
        {
            this.myCar = car;
            Location current = null;
            var      start   = new Location {
                X = StartX, Y = StartY
            };
            var target = new Location {
                X = TargetX, Y = TargetY
            };
            var openList   = new List <Location>();
            var closedList = new List <Location>();
            int currentDistanceFromStart = 0;

            route  = new List <Location>();
            target = CheckRoad(target.X, target.Y, map);

            openList.Add(start);

            while (openList.Count > 0)
            {
                var lowest = openList.Min(l => l.distanceScore);
                current = openList.First(l => l.distanceScore == lowest);
                closedList.Add(current);
                openList.Remove(current);

                if (closedList.FirstOrDefault(l => l.X == target.X && l.Y == target.Y) != null)
                {
                    break;
                }

                var adjacentSquares = GetWalkableAdjacentSquares(current.X, current.Y, map, car);
                currentDistanceFromStart++;

                foreach (var adjacentSquare in adjacentSquares)
                {
                    if (closedList.FirstOrDefault(l => l.X == adjacentSquare.X && l.Y == adjacentSquare.Y) != null)
                    {
                        continue;
                    }

                    if (openList.FirstOrDefault(l => l.X == adjacentSquare.X && l.Y == adjacentSquare.Y) == null)
                    {
                        adjacentSquare.distanceFromStart  = currentDistanceFromStart;
                        adjacentSquare.distanceFromTarget = ComputeEndDistance(adjacentSquare.X, adjacentSquare.Y, target.X, target.Y);
                        adjacentSquare.distanceScore      = adjacentSquare.distanceFromStart + adjacentSquare.distanceFromTarget;
                        adjacentSquare.previousLocation   = current;
                        openList.Insert(0, adjacentSquare);
                    }
                    else
                    {
                        if (currentDistanceFromStart + adjacentSquare.distanceFromTarget > adjacentSquare.distanceScore)
                        {
                            adjacentSquare.distanceFromStart = currentDistanceFromStart;
                            adjacentSquare.distanceScore     = adjacentSquare.distanceFromStart + adjacentSquare.distanceFromTarget;
                            adjacentSquare.previousLocation  = current;
                        }
                    }
                }
            }

            while (current != null)
            {
                this.route.Add(new Location {
                    X = current.X, Y = current.Y
                });
                current = current.previousLocation;
            }

            this.route.Reverse();
            return(this);
        }