Exemplo n.º 1
0
        public void TryPortSpots(List <Boat> boats, Port port, List <int[]> spots)
        {
            var positionsToCheck = spots.OrderBy(portSpotSize)
                                   .ThenBy(firstSpot)
                                   .ToList();

            foreach (int[] position in positionsToCheck)
            {
                int         max          = position[1];
                List <Boat> boatsToCheck = boats.Where(notAssigned).OrderBy(boatSize).ToList();

                foreach (Boat boat in boatsToCheck)
                {
                    int currentSpot = position[0];

                    if (currentSpot > max)
                    {
                        break;
                    }
                    //array index 0, därför -1
                    int spotsToTake = (int)boat.Size - 1;

                    //eftersom listan med nya båtar är sorterade efter storleksordning kan man anta att
                    //nästa båt inte heller får plats, därav break
                    bool boatIsTooBig = !boatCanPark(port, currentSpot, max, spotsToTake);

                    if (boatIsTooBig)
                    {
                        break;
                    }
                    bool spotTaken = port.OccupiedSpots[currentSpot];

                    int  rowboatsOnSpot       = port.Boats.Count(boat => anotherBoatOnSameSpot(boat, currentSpot) && boatIsRowboat(boat));
                    int  rowboatsLeftToAssign = boatsToCheck.Count(boat => boatIsRowboat(boat) && notAssigned(boat));
                    bool rowboatCanPark       = boatIsRowboat(boat) && (rowboatsOnSpot == 1 || !spotTaken);


                    if (rowboatCanPark)
                    {
                        //hur många roddbåtar som det är kvar och hur många det är på platsen, är det
                        //redan en roddbåt på platsen så kommer inte det få plats en till, då plussas position[0] på med 1
                        //så får nästa båt försöka klämma sig in
                        //från nästa plats och är det här den sista som inte har en hamnplats ska samma sak ske
                        position[0]      += rowboatsOnSpot == 1 || rowboatsLeftToAssign == 1 ? 1 : 0;
                        boat.AssignedSpot = new int[1] {
                            currentSpot
                        };
                        port.AddBoat(boat);
                        continue;
                    }

                    //är platsen upptagen ska startpositionen för nästa båt bli 1 högre,
                    else if (spotTaken)
                    {
                        position[0]++;
                        continue;
                    }


                    //special regler för motorbåt, den ska bara få 1 hamnplats, och behöver inte en array med 2 index
                    else if (boat is Motorboat)
                    {
                        boat.AssignedSpot = new int[1] {
                            currentSpot
                        };
                        position[0]++;
                        port.AddBoat(boat);
                        continue;
                    }

                    else
                    {
                        //nästa båt ska börja kolla efter en plats
                        //från den sista båtens andra position
                        //dvs om en båt fick plats {22,24} ska nästa börja kolla från 25
                        int end        = currentSpot + spotsToTake;
                        int newMinimum = end + 1;
                        boat.AssignedSpot = new int[2] {
                            currentSpot, end
                        };
                        position[0] = newMinimum;
                        port.AddBoat(boat);
                        continue;
                    }
                }
            }
        }
Exemplo n.º 2
0
 /// <summary>
 /// Lägger till en kaj i listan med kajer
 /// </summary>
 /// <param name="p"></param>
 public void AddPort(Port p)
 {
     Ports.Add(p);
 }