From aa5c31be6ec6a688e8d3a66c770ba99be8e060c9 Mon Sep 17 00:00:00 2001 From: tom Date: Sun, 12 Feb 2017 05:59:12 -0600 Subject: -minor constant changes -implemented dna structure, which carries the creatures attributes suchas speed and reach -currently a child inherits 100% the same dna as the mother -removed sing namespace std --- src/creature.cpp | 81 ++++++++++++++++++++++++-------------------------------- src/dna.cpp | 14 ++++++++++ src/list.cpp | 33 ++++++++++++----------- 3 files changed, 66 insertions(+), 62 deletions(-) create mode 100644 src/dna.cpp (limited to 'src') diff --git a/src/creature.cpp b/src/creature.cpp index 9e51b04..7a86af9 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -1,34 +1,21 @@ #include "creature.hpp" -Creature::Creature(Window m, SDL_Rect R) +Creature::Creature(Window M, SDL_Rect R, Dna D) { - renderer = m.getRenderer(); - rect = R; + renderer = M.getRenderer(); + rect = R; + mine = D; if(rect.x == 0 && rect.y == 0){ - rect.x = rand()%WINDOW_X; - rect.y = rand()%WINDOW_Y; + rect.x = rand()%WINDOW_X; + rect.y = rand()%WINDOW_Y; } - type = CREATURE_TYPE; - health = CREATURE_START_HEALTH; - maxHealth = CREATURE_MAX_HEALTH; - reach = CREATURE_REACH; - speed = CREATURE_SPEED; - bestSense = CREATURE_BEST_SENSE; - bite = CREATURE_BITE; - amountToGrow = CREATURE_AMOUNT_TO_GROW; - expectedPregnancyTime = CREATURE_EXPECTED_PREGNANCY_TIME; - expectedAge = CREATURE_EXPECTED_AGE; - - gender = rand() % 2; - age = 0; - hungry = false; - hasTarget = false; - wander = false; - pregnate = false; - pregnancyReady = false; - able = true; + type = CREATURE_TYPE; + health = mine.maxHealth/2; + gender = rand() % 2; + able = true; + pregnancyReady = false; } void Creature::Behavior() @@ -46,18 +33,18 @@ void Creature::Behavior() if(pregnate){ pregnancyTime++; - if(pregnancyTime > expectedPregnancyTime) + if(pregnancyTime > mine.expectedPregnancyTime) pregnancyReady = true; } age++; - if(age > expectedAge) + if(age > mine.expectedAge) health = 0; } void Creature::Priority() { - if(health < maxHealth/2){ + if(health < mine.maxHealth / 2){ hungry = true; able = false; } @@ -69,7 +56,7 @@ void Creature::Priority() void Creature::setTarget() { - for(list ::iterator it = N.begin(); it!=N.end(); it++){ + for(std::list ::iterator it = N.begin(); it!=N.end(); it++){ if( (*it)->getType() == RESOURCE_TYPE && hungry){ target = *it; hasTarget = true; @@ -93,7 +80,7 @@ void Creature::setTarget() void Creature::checkTarget() { - for(list ::iterator it = N.begin(); it!=N.end(); it++) + for(std::list ::iterator it = N.begin(); it!=N.end(); it++) if( target == *it ) return; @@ -105,18 +92,18 @@ void Creature::checkTarget() void Creature::Action() { if(hasTarget){ - if( Distance(rect,target->getRect()) < reach && target->getType() == RESOURCE_TYPE){ - target->eat(bite); - health+=bite; + if( Distance(rect,target->getRect()) < mine.reach && target->getType() == RESOURCE_TYPE){ + target->eat(mine.bite); + health+=mine.bite; amountAte++; - if(rect.w <= CREATURE_SIZE_MAX && amountToGrow <= amountAte){ + if(rect.w <= mine.sizeMax && mine.amountToGrow <= amountAte){ amountAte = 0; rect.w = rect.h = rect.w + 1; } if(target->getAmount()<=0) hasTarget = false; } - else if( Distance(rect,target->getRect()) < reach && target->getType() == CREATURE_TYPE && target->getGender() != gender ){ + else if( Distance(rect,target->getRect()) < mine.reach && target->getType() == CREATURE_TYPE && target->getGender() != gender ){ target->impregnate(); hasTarget = false; } @@ -124,7 +111,7 @@ void Creature::Action() Move(target->getRect()); } else if(wander){ - if(Distance(rect,wTarget) < reach) + if(Distance(rect,wTarget) < mine.reach) wander = false; else Move(wTarget); @@ -135,34 +122,34 @@ void Creature::Move(SDL_Rect R) { if( rect.x == R.x ){ if( rect.y < R.y ) - rect.y+=speed; + rect.y+=mine.speed; else - rect.y-=speed; + rect.y-=mine.speed; } else if( rect.y == R.y ){ if( rect.x < R.x ) - rect.x+=speed; + rect.x+=mine.speed; else - rect.x-=speed; + rect.x-=mine.speed; } else if( rect.x < R.x ){ if( rect.y < R.y ){ - rect.x+=speed; - rect.y+=speed; + rect.x+=mine.speed; + rect.y+=mine.speed; } else{ - rect.x+=speed; - rect.y-=speed; + rect.x+=mine.speed; + rect.y-=mine.speed; } } else if ( rect.x > R.x ){ if( rect.y < R.y ){ - rect.x-=speed; - rect.y+=speed; + rect.x-=mine.speed; + rect.y+=mine.speed; } else{ - rect.x-=speed; - rect.y-=speed; + rect.x-=mine.speed; + rect.y-=mine.speed; } } } diff --git a/src/dna.cpp b/src/dna.cpp new file mode 100644 index 0000000..36eda3d --- /dev/null +++ b/src/dna.cpp @@ -0,0 +1,14 @@ +#include "dna.hpp" + +Dna::Dna() +{ + maxHealth = CREATURE_MAX_HEALTH; + speed = CREATURE_SPEED; + reach = CREATURE_REACH; + bestSense = CREATURE_BEST_SENSE; + bite = CREATURE_BITE; + amountToGrow = CREATURE_AMOUNT_TO_GROW; + expectedPregnancyTime = CREATURE_EXP_PREG_TIME; + expectedAge = CREATURE_EXP_AGE; + sizeMax = CREATURE_SIZE_MAX; +} diff --git a/src/list.cpp b/src/list.cpp index d49f97a..edf3063 100644 --- a/src/list.cpp +++ b/src/list.cpp @@ -5,9 +5,10 @@ List::List(Window m) main = m; int i; - SDL_Rect Rect = {0,0,CREATURE_SIZE_START,CREATURE_SIZE_START}; + Dna defaultDNA; + SDL_Rect Rect = {0,0,defaultDNA.sizeMax/5,defaultDNA.sizeMax/5}; for(i=0;i::iterator it = C.begin(); it!=C.end(); it++) + for(std::list::iterator it = C.begin(); it!=C.end(); it++) if(it->getHealth()<=0){ SDL_Rect Rect = it->getRect(); Resource r = Resource(main,Rect); @@ -29,27 +30,29 @@ void List::Remove() C.erase(it--); } - for(list::iterator it = R.begin(); it!=R.end(); it++) + for(std::list::iterator it = R.begin(); it!=R.end(); it++) if(it->getAmount()<=0) R.erase(it--); } void List::Behavior() { - for(list::iterator it = C.begin(); it!=C.end(); it++){ - list N = getNear(*it); + for(std::list::iterator it = C.begin(); it!=C.end(); it++){ + std::list N = getNear(*it); it->giveN(N); it->Behavior(); + if(it->getPregnancyReady()){ + Dna D = it->getDNA(); SDL_Rect Rect = it->getRect(); - Rect.h = Rect.w = CREATURE_SIZE_START; - Creature X(main,Rect); + Rect.h = Rect.w = D.sizeMax / 5; + Creature X(main,Rect,D); C.push_back(X); it->hadPregnancy(); } } - for(list::iterator it = R.begin(); it!=R.end(); it++) + for(std::list::iterator it = R.begin(); it!=R.end(); it++) it->grow(); } @@ -61,22 +64,22 @@ void List::Place() R.push_back(Y); } - for(list::iterator it = C.begin(); it!=C.end(); it++) + for(std::list::iterator it = C.begin(); it!=C.end(); it++) it->Place(); - for(list::iterator it = R.begin(); it!=R.end(); it++) + for(std::list::iterator it = R.begin(); it!=R.end(); it++) it->Place(); } -list List::getNear(Creature nC) +std::list List::getNear(Creature nC) { - list N; + std::list N; - for(list ::iterator it = R.begin(); it!=R.end(); it++) + for(std::list::iterator it = R.begin(); it!=R.end(); it++) if( nC.getBestSense() > Distance(nC.getRect(),it->getRect()) ) N.push_back(&(*it)); - for(list ::iterator it = C.begin(); it!=C.end(); it++) + for(std::list::iterator it = C.begin(); it!=C.end(); it++) if( &nC == &(*it)) continue; else if( nC.getBestSense() > Distance(nC.getRect(),it->getRect()) ) -- cgit v1.2.3