From 72b40aec2addc7b28170ba9364bc0429149b3299 Mon Sep 17 00:00:00 2001 From: majortom6 Date: Sun, 26 Feb 2017 07:07:11 -0600 Subject: -added more detailed mutation function, eventually a normal distrobution will be implemented -added roll function, which takes a float ie (.15) and returns a true that percent of the time --- src/dna.cpp | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/dna.cpp b/src/dna.cpp index c3ffd9c..5d3fc8f 100644 --- a/src/dna.cpp +++ b/src/dna.cpp @@ -11,21 +11,45 @@ DNA::DNA() expectedPregnancyTime = CREATURE_EXP_PREG_TIME; expectedAge = CREATURE_EXP_AGE; sizeMax = CREATURE_SIZE_MAX; + mutationPercent = CREATURE_MUTATION_PERCENT; + mutationChance = CREATURE_MUTATION_CHANCE; } DNA DNA::combine(DNA D) { DNA N; + + N.maxHealth = (maxHealth + D.maxHealth)/2; + N.speed = (speed + D.speed)/2; + N.reach = (reach + D.reach)/2; + N.bestSense = (bestSense + D.bestSense)/2; + N.bite = (bite + D.bite)/2; + N.amountToGrow = (amountToGrow + D.amountToGrow)/2; + N.expectedPregnancyTime = (expectedPregnancyTime + D.expectedPregnancyTime)/2; + N.expectedAge = (expectedAge + D.expectedAge)/2; + N.sizeMax = (sizeMax + D.sizeMax)/2; + N.mutationPercent = (mutationPercent + D.mutationPercent)/2; + N.mutationChance = (mutationChance + D.mutationChance)/2; - N.maxHealth = (this->maxHealth + D.maxHealth)/2; - N.speed = (this->speed + D.speed)/2; - N.reach = (this->reach + D.reach)/2; - N.bestSense = (this->bestSense + D.bestSense)/2; - N.bite = (this->bite + D.bite)/2; - N.amountToGrow = (this->amountToGrow + D.amountToGrow)/2; - N.expectedPregnancyTime = (this->expectedPregnancyTime + D.expectedPregnancyTime)/2; - N.expectedAge = (this->expectedAge + D.expectedAge)/2; - N.sizeMax = (this->sizeMax + D.sizeMax)/2; - + if(roll(mutationChance)){ + float pn; + if(rand()%2) + pn = 1; + else + pn = -1; + switch(rand()%11){ + case 0: N.maxHealth = abs(N.maxHealth *(N.mutationPercent+pn)); break; + case 1: N.speed = abs(N.speed *(N.mutationPercent+pn)); break; + case 2: N.reach = abs(N.reach *(N.mutationPercent+pn)); break; + case 3: N.bestSense = abs(N.bestSense *(N.mutationPercent+pn)); break; + case 4: N.bite = abs(N.bite *(N.mutationPercent+pn)); break; + case 5: N.amountToGrow = abs(N.amountToGrow *(N.mutationPercent+pn)); break; + case 6: N.expectedPregnancyTime = abs(N.expectedPregnancyTime *(N.mutationPercent+pn)); break; + case 7: N.expectedAge = abs(N.expectedAge *(N.mutationPercent+pn)); break; + case 8: N.sizeMax = abs(N.sizeMax *(N.mutationPercent+pn)); break; + case 9: N.mutationPercent = abs(N.expectedAge *(N.mutationPercent+pn)); break; + case 10:N.mutationChance = abs(N.mutationChance *(N.mutationPercent+pn)); break; + } + } return N; } -- cgit v1.2.3