List <List <MapNode> > GenerateNormalLayers(int numberOfLayers) { List <List <MapNode> > layers = new List <List <MapNode> >(); MapNode starterNode = new MapNode(MapNodeType.Start, 0); // Every map starts with a layer of one (starter) node. layers.Add(new List <MapNode>() { starterNode }); for (int i = 1; i < numberOfLayers - 1; i++) { int numberOfNodesInLayer = rand.Next(2, 4); List <MapNode> nodesThisLayer = new List <MapNode>(); for (int j = 0; j < numberOfNodesInLayer; j++) { MapNode nextNode = GenerateNode(i, j); nodesThisLayer.Add(nextNode); } nodesThisLayer.Shuffle(); layers.Add(nodesThisLayer); } for (int layer = 0; layer < layers.Count; layer++) { List <MapNode> thisLayer = layers[layer]; thisLayer.ForEach(node => { if (layer < layers.Count - 1) { List <MapNode> nextLayer = layers[layer + 1]; node.AddChild(nextLayer.GetRandomElement()); } if (layer != 0 && node.parents.Count == 0) { List <MapNode> lastLayer = layers[layer - 1]; node.AddParent(lastLayer.GetRandomElement()); } }); } MapNode endNode = new MapNode(MapNodeType.End, numberOfLayers - 1); List <MapNode> previousLayer = layers[numberOfLayers - 2]; previousLayer.ForEach(terminalPathNode => endNode.AddParent(terminalPathNode)); layers.Add(new List <MapNode>() { endNode }); // Place store randomly in one of two final (non-exit) layers. if (numberOfLayers > 2) { int layersCount = layers.Count; int shopLayer = rand.Next(layersCount - 3, layersCount - 2); layers[shopLayer].GetRandomElement <MapNode>().nodeType = MapNodeType.Store; } return(layers); }