Bonjour je suis arrivé à la partie 2.1 du Javaquarium où les poissons doivent manger. J’ai donc une classe Fish avec un booléen isAlive (par défaut true) et une classe Aquarium avec une méthode eating.
Cette méthode parcours le vecteur contenant les poissons et chacun d’entre choisi eux un poisson aléatoire à manger. Si le poisson choisi de se manger lui même ou de manger un poisson de son espèce alors il ne mange pas et passe son tour. Un poisson mangé meurt (isAlive = false) mais ne peut pas être supprimé directement du vecteur puisque la méthode est en train de le parcourir c’est une méthode clear qui se charge de "nettoyer" ensuite l’aquarium.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | void Aquarium::eating() { for (size_t i{ 0 }; i < m_fishesCount; ++i) { if (m_fishes[i]->is_alive()) { std::random_device rd; if (m_fishes[i]->is_carnivorous() && m_fishesCount > 1) { std::uniform_int_distribution<> dis(0, m_fishesCount - 1); int prey{ dis(rd) }; // Cherche un poisson aléatoire // Le poisson ne peut pas se manger lui même ou un poisson de la même race if (prey != i && m_fishes[prey]->get_race() != m_fishes[i]->get_race()) { m_fishes[i]->eat(m_fishes[prey]); } } else if (!m_fishes[i]->is_carnivorous() && m_seaweedsCount > 0) { std::uniform_int_distribution<> dis(0, m_seaweedsCount - 1); int prey{ dis(rd) }; m_fishes[i]->eat(m_seaweeds[prey]); m_seaweeds.erase(begin(m_seaweeds) + prey); --m_seaweedsCount; } } } } |
Le problème arrive quand on choisit de manger un poisson déjà mort. Comme il n’est pas encore supprimé rien ne l’empêche d’être remangé.
J’aimerais donc savoir comment éviter ce problème.
J’espère avoir été claire dans mes explications et merci d’avance pour vos réponses.