예제 #1
0
파일: Map.cs 프로젝트: gewl/Hamminatics
    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);
    }