Sign in to follow this  

Killing AI

This topic is 1819 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

@bleferog: That's it! I no longer count with the problem of various zombies being deleted at the same time. But one last thing, the swap function is not working..... only the last one is getting deleted.

Share this post


Link to post
Share on other sites

[quote]

...But one last thing, the swap function is not working..... only the last one is getting deleted.

[/quote]

If your vector is not holding pointers as elements then you must implement "proper" copy constructor and assignment operator, as implicit one might not do the job well depending on the data your zombie class is holding.

 

What not use shared_ptr?

 

[code]class CZombie { private:     bool dead;     int health; public:     CZombie(int h) : dead(false), health(h) {}     ...     bool isDead() const { return dead; }     void takeDamage(int damage)     {         health -= damage;         if(health <= 0)             dead = true;     } };   typedef std::shared_ptr<CZombie> sp_Zombie; typedef std::vector<sp_Zombie> v_Zombie; ... v_Zombie zombies; ...
    zombies.push_back( std::make_shared<CZombie>(100) );
    zombies.push_back( std::make_shared<CZombie>(120) );
    zombies.push_back( std::make_shared<CZombie>(100) );
    zombies.push_back( std::make_shared<CZombie>(150) ); ...     for(std::size_t i = 0; i < zombies.size(); ++i)
    {
        if(zombies[i]->isDead())
        {
            std::swap(zombies[i--], zombies.back());
            zombies.pop_back();
        }
    }[/code]

Notice that i moved decrement up and make it post-decrement, witch does the same thing, but have one line of code less. laugh.png

Share this post


Link to post
Share on other sites

I appreciate you giving me a solution to the problem, but this doesn't work on my C++.... y get the error 

expected initializer before '<' token| for the line typedef std::shared_ptr<CZombie> sp_Zombie;

Isn't there a simpler way of initialising a vector of pointers like maybe creating an array of objects and then using them to create a vector.... Please, I have got really far and I am just stuck on this silly little thing that I just can't seem to fix

Share this post


Link to post
Share on other sites

actually your code doesn't work. It doesn't actually swap the objects, it just deletes the last one. I'm in need of a solution for your code

Share this post


Link to post
Share on other sites

Do you have included <memory> header? It is necessary for shared_ptr.

What compiler are you using?

 

If you want "pure" pointers then code is a bit different:

[code]class CZombie { ...
};   typedef std::vector<CZombie*> v_Zombies   class CZombieMgr {     v_Zombies zombies; public: ...   ~CZombieMgr() {     for(std::size_t i = 0; i < zombies.size(); ++i)     {         delete zombies[i];
    }
}   void addZombie(int h) {     zombies.push_back( new CZombie(h) );
}   void removeDeadZombies() {     for(std::size_t i = 0; i < zombies.size(); ++i)     {         if(zombies[i]->isDead())         {             std::swap( zombies[i--], zombies.back() );             delete zombies.back();             zombies.pop_back();         }
    }
}; ...[/code]

Share this post


Link to post
Share on other sites

@moderators

Sorry for double post, but if i go to EDIT then it somehow messes my code up.

 

@mypal1600000

Can you post relevant bits from your code? it will be easier to help you.

Share this post


Link to post
Share on other sites

No! It won't be needed as my code has been fixed. Thanks to all of you who, by discussing together, have found the solution to the problem.

Share this post


Link to post
Share on other sites

Without iterators:

for(std::size_t i = 0; i < v.size(); ++i)
	{
		if(v[i].dead)
		{
			
			std::swap(v[i], v.back());
			v.pop_back();
			--i;
		}
	}

Remember that modification of the for-loop index inside the loop is one bad programming practice. It usually leads to infinite loops and computer hang ups.

Share this post


Link to post
Share on other sites

This topic is 1819 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this