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; } } } }
/// <summary> /// Lägger till en kaj i listan med kajer /// </summary> /// <param name="p"></param> public void AddPort(Port p) { Ports.Add(p); }