private static ColorWeight GetMaxColorWeight(ColorSpot moveSpot) { int maxColorIndex = LINQExstensions.MaxIndex(moveSpot.ColorsWeights, x => x.TileNumber); ColorWeight maxColorWeight = moveSpot.ColorsWeights[maxColorIndex]; return(maxColorWeight); }
private static void MergeColorWeightData(ColorWeight colorWeight, ColorWeight moveSpotSameColorWeight, int moveSpotId) { moveSpotSameColorWeight.NeighborsSpotsIds.AddRange(colorWeight.NeighborsSpotsIds); moveSpotSameColorWeight.NeighborsSpotsIds = moveSpotSameColorWeight.NeighborsSpotsIds.Distinct().ToList(); if (moveSpotSameColorWeight.NeighborsSpotsIds.Contains(moveSpotId)) { moveSpotSameColorWeight.NeighborsSpotsIds.Remove(moveSpotId); } }
public static byte?ChangeColor(List <ColorSpot> colorSpots) { byte? newColor; ColorSpot moveSpot = Program.StartSpot; ColorWeight maxColorWeight = GetMaxColorWeight(moveSpot); newColor = moveSpot.Color = maxColorWeight.Color; MergeWithMaxColorWeightNeigbors(colorSpots, moveSpot, maxColorWeight); moveSpot.SpotTiles.ForEach(x => x.Color = moveSpot.Color); return(newColor); }
private static void GetColorWeight(List <IGrouping <byte, Tile> > colorSpotsGroups, ColorSpot spot, IGrouping <byte, IGrouping <byte, Tile> > color) { ColorWeight colorWeight = new ColorWeight { Color = color.Key }; var colorNeighbours = color.ToList(); foreach (IGrouping <byte, Tile> neighbour in colorNeighbours) { colorWeight.NeighborsSpotsIds.Add(colorSpotsGroups.IndexOf(neighbour)); colorWeight.TileNumber += neighbour.Count(); } spot.ColorsWeights.Add(colorWeight); }
private static void MergeColorWeights(ColorSpot moveSpot, ColorSpot neighbor) { foreach (ColorWeight colorWeight in neighbor.ColorsWeights) { if (moveSpot.ColorsWeights.Any(x => x.Color == colorWeight.Color)) { var moveSpotSameColorWeight = moveSpot.ColorsWeights.First(x => x.Color == colorWeight.Color); MergeColorWeightData(colorWeight, moveSpotSameColorWeight, moveSpot.Id); } else { ColorWeight newColorWeight = new ColorWeight() { Color = colorWeight.Color }; MergeColorWeightData(colorWeight, newColorWeight, moveSpot.Id); moveSpot.ColorsWeights.Add(colorWeight); } } }
private static void MergeWithMaxColorWeightNeigbors(List <ColorSpot> colorSpots, ColorSpot moveSpot, ColorWeight maxColorWeight) { List <ColorSpot> maxColorNeighbors = new List <ColorSpot>(); Program.MergedIds.AddRange(maxColorWeight.NeighborsSpotsIds); foreach (int id in maxColorWeight.NeighborsSpotsIds) { var colorSpot = colorSpots.First(x => x.Id == id); maxColorNeighbors.Add(colorSpot); colorSpots.Remove(colorSpot); } foreach (ColorSpot neighbor in maxColorNeighbors) { MergeColorWeights(moveSpot, neighbor); moveSpot.SpotTiles.AddRange(neighbor.SpotTiles); moveSpot.ColorsWeights.First(x => x.Color == maxColorWeight.Color).NeighborsSpotsIds.Remove(neighbor.Id); } CleanupEmptyColorWeights(moveSpot); TilesNumbersRecalculate(colorSpots, moveSpot); }