コード例 #1
0
    /// <summary>
    /// Вращение всех shape так, чтобы не пропали соединения с коннекторами. Также генерирует shape-ы, если у повернутого shape есть свободные выходы в соседние пустые ноды.
    /// </summary>
    private static void RandomSafeRotateWithGenerationAllShapes()
    {
        //количество подключенных коннекторов в начале этой функции
        int connectedConnectorsMaxCount = ConnectorsManager.GetConnectedCount();

        foreach (var node in NodesGrid.Grid)
        {
            if (node.Shape != null)
            {
                Direction currentDir = node.Shape.CurrentDirection;
                RandomRotateShape(node.Shape);

                int connectedCount = ConnectorsManager.GetConnectedCount();

                //возврат к состоянию до рэндомного вращения
                if (connectedCount < connectedConnectorsMaxCount)
                {
                    node.Shape.FastRotateToDirection(currentDir);
                }

                connectedConnectorsMaxCount = Mathf.Max(connectedConnectorsMaxCount, connectedCount);
            }

            //генерация ноды, если свободная клетка
            List <KeyValuePair <Node, Direction> > nodes = NodesGrid.FindAvailableNeighborNodesForShapeSides(node);
            foreach (var nodeDirPair in nodes)
            {
                GenerateRecursively(nodeDirPair.Key, nodeDirPair.Value.GetOpposite());
            }
        }
    }
コード例 #2
0
    private static void GenerateRecursively(Node node, Direction prevOutDirection)
    {
        if (!node.IsAvailable)
        {
            return;
        }

        CreateShape(node, typeof(TeeShape));
        FastRotateToConnection((TeeShape)node.Shape, prevOutDirection);

        //генерация ноды, если свободная клетка
        List <KeyValuePair <Node, Direction> > nodes = NodesGrid.FindAvailableNeighborNodesForShapeSides(node);

        foreach (var nodeDirPair in nodes)
        {
            GenerateRecursively(nodeDirPair.Key, nodeDirPair.Value.GetOpposite());
        }
    }