Example #1
0
    public bool ConstructNewRandomBody() // returns false if body fails to be constructed
    {
        myDNA.ClearDNA();                // making a new random body, gotta clear out old data in DNA
        nodes.Clear();
        joints.Clear();
        // This loop attempts to create a body by creating a node in a valid location, then connecting it to an existing node
        for (int i = 0; i < gd.numberOfNodes; i++)
        {
            Vector3 position = GetValidSpaceForNode();
            if (position == ILLEGALVECTOR)
            {
                return(false);
            }
            GameObject newlyCreatedNode = gd.lb.GetNode(position);
            newlyCreatedNode.GetComponent <Rigidbody>().useGravity = true; // The new node must use gravity
            nodes.Add(newlyCreatedNode);

            if (i != 0) // If this is the first node, we just let it exist, otherwise we need to connect it to something
            {
                if (!GetValidConnectionToNode(nodes.Count - 1, Random.Range(0, i)))
                {
                    gd.lb.ReturnNode(newlyCreatedNode);
                    nodes.Remove(newlyCreatedNode);
                    i--;
                }
                else
                {
                    myDNA.AddToPositions(newlyCreatedNode.transform.position - origin); // This position is added in
                }
            }
            else
            {
                myDNA.AddToPositions(newlyCreatedNode.transform.position - origin);
            }
        }
        // At this point we've created a bot that is an acyclic graph. in order to introduce the possibility of
        // cyclic structures we throw on an additional attempt to build a few connections

        // This next part splits the nodes into groups, then attempts to pair up two of those nodes in either group
        // once we successfully do this numberOfExtraConnections times (or 50 attempts) we jump out of the loop
        int count = 0;
        int loop  = 0;

        while (count < gd.additionalConnections && loop < 10)
        {
            loop++;
            int divider = Random.Range(1, nodes.Count - 1);
            if (GetValidConnectionToNode(Random.Range(0, divider), Random.Range(divider, nodes.Count)))
            {
                count++;
            }
        }
        return(true);
    }
Example #2
0
    public void SaveBot()
    {
        RemoveExtraNodes();
        DNA savedDNA = new DNA();

        foreach (GameObject node in nodes)
        {
            savedDNA.AddToPositions(node.transform.position);
        }

        foreach (BuilderTempInstruction bti in tempJoints)
        {
            savedDNA.AddToInstructions(new Instruction(nodes.IndexOf(bti.baseNode), nodes.IndexOf(bti.tailNode), Vector3.zero, 0));
        }

        gd.editorDNA = savedDNA;

        /*
         * File.Delete("C:\\iterBot\\DNA.txt");
         * File.Create("C:\\iterBot\\");
         * File.Create("C:\\iterBot\\DNA.txt");
         * StreamWriter writer = new StreamWriter("C:\\iterBot\\DNA.txt", true);
         * writer.WriteLine(savedDNA.toData());
         * writer.Close();
         */
    }