Posté le 14/02/2016 18:23
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 146 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 16/02/2016 12:55 | #
En fait, J'ai récupéré un sujet de mon frère qui est en deuxième année d'école d'ingénieur à l'icam (Toulouse) :
http://tinyurl.com/z93qhtf
Mais après avoir essayé de construire le plan de mon code, je ne savais pas du tout par où commencer aussi je suis un peu parti dans tous les sens.
Ajouté le 16/02/2016 à 12:59 :
Une fois que tu l'auras vu, je supprimerai le lien.
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 16/02/2016 13:03 | #
J'ai une erreur. L'erreur varie entre 404 et 500...
Citer : Posté le 16/02/2016 13:06 | #
De quoi tu parle
C'est toi qui as changé l’adresse URL
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 16/02/2016 13:07 | #
Non, je l'ai passé à une tinyurl pour éviter la déformation de la page. Je l'ai testée entre temps (quand même ), mais j'avais des erreurs de la part de gmail.
Citer : Posté le 16/02/2016 13:11 | #
Merci, c'est vrai que c'était gênant.
Mais finalement t'as pu regarder ou pas.
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 16/02/2016 13:13 | #
Non, le lien original me renvoie une erreur. J'aurais tendance à penser que ce serait parce que tu as envoyé une url de près ou de loin liée à ton compte et/ou les paramètres de ta connexion actuelle et que ça ne fonctionne pas quand je me connecte au site via mon compte.
Tu ne peux pas héberger le fichier ailleurs ? Au pire, mets-le en fichier joint d'un post s'il n'est pas trop gros.
Citer : Posté le 16/02/2016 13:20 | # | Fichier joint
Voilà
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 16/02/2016 13:31 | #
C'était pas trop mal. Commence par définir la classe Poisson. Différentes méthodes :
→ nourrir()
→ reproduire(), mais attention : cette méthode ne doit servir qu'à mettre à jour une valeur interne au poisson indiquant qu'il s'est reproduit pendant le mois en cours
→ temps(), qui remet à jour les capacités de reproduction et le besoin de nourriture, ou bien tue le poisson s'il n'a pas mangé
Ensuite tu peux passer à la classe Aquarium :
→ nourrir(), qui utilisent tes ressources en conserves (disons globales) pour nourrir les poissons
→ reproduire(), qui tente de reproduire les poissons par couple
→ temps(), qui va appeler la méthode temps() de chacun des poissons et retirer les poissons morts, tuer ceux qui sont en excès, etc.
La classe Conserve n'a pas besoin d'exister, tu peux te contenter d'un entier pour compter le nombre de portions dont tu disposes.
Citer : Posté le 16/02/2016 13:44 | #
Ok merci beaucoup, je vais essayer.
Ajouté le 16/02/2016 à 14:00 :
→ reproduire(), mais attention : cette méthode ne doit servir qu'à mettre à jour une valeur interne au poisson indiquant qu'il s'est reproduit pendant le mois en cours
Je ne vois pas l’intérêt de ces méthodes dans la class poisson.
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 16/02/2016 14:03 | #
Bon point.
Techniquement tu peux gérer directement dans l'aquarium, si le poisson n'a pas mangé alors il meurt, c'est tout à fait faisable.
Mais lorsque la situation va se complexifier, si tu introduis par exemple, des maladies qui se propagent à la reproduction alors décider si le poisson doit mourir ou non est plus compliqué. Dans ce cas-là, l'évaluation des facteurs et la prise de décision doit se faire dans la classe Poisson.
C'est pour respecter ce schéma que j'ai introduit ces méthodes.
Citer : Posté le 16/02/2016 15:10 | #
import random
argent = 0
nouriture = 20
aquarium = Aquarium()
def achat_nouriture () :
global nouriture
global argent
for c in nb_conserve :
nouriture += 20
argent -= 10
class Poisson :
def __init__ (self):
self.age = 0
self.sexe = random.randint(1,2)
self.capacite_reproduction = 0
self.besoin_nourriture = 1
self.vie = 1
def temps (self):
self.age += 1
self.capacite_reproduction = 1
self.besoin_nourriture = 1
if self.age > 6 :
global nb_poisson_m
nb_poisson_m += 1
self.vie = 0
def reproduction (self):
self.capacite_reproduction = 0
def repas (self) :
self.besoin_nourriture = 0
class Aquarium :
def __init__ (self ):
self.pop = []
global argent
argent -= 30
poisson = Poisson()
poisson.sexe = 1
aquarium.nouveau_poisson()
poisson = Poisson()
poisson.sexe = 2
aquarium.nouveau_poisson()
def reproduction (self ):
nb_p_m_adulte = 0
nb_p_f_adulte = 0
for poisson in self.pop :
if poisson.age > 0 and poisson.sexe == 1:
nb_p_m_adulte += 1
if poisson.age > 0 and poisson.sexe == 2:
nb_p_f_adulte += 1
if nb_p_m_adulte > nb_p_f_adulte :
nb_couple = nb_p_f_adulte
else :
nb_couple = nb_p_m_adulte
for i in range(nb_couple) :
nb_enfant = random.randint(5,10)
for i in range(nb_enfant) :
poisson = Poisson()
aquarium.nouveau_poisson()
def vente (self ) :
global argent
for p in nb_vendu :
argent += 1.5
del self.pop[-1]
def repas (self) :
poisson_a_nourir = len(self.pop)
while nouriture > 0 or poisson_a_nourir > 0 :
self.quantite -= 1
poisson_a_nourir -= 1
if poisson_a_nourir == 0 :
return
elif self.quantite == 0 :
for p in range(poisson_a_nourir) :
del list_poissons[-1]
global nb_poisson_m
nb_poisson_m += poisson_a_nourir
def nouveau_poisson (self ):
if len(self.pop) < 21 :
self.pop.append(poisson)
else :
global nb_poisson_m
nb_poisson_m += 1
def temps (self ) :
for poisson in self.pop :
poisson.temps()
if poisson.vie == 0 :
del poisson
Voilà, je pense que c'est mieux.
Mais pour la méthode temps() de la class aquarium, je ne sais pas comment supprimer le poisson de la liste des poisson de l'aquarium (si il est mort ).
Ajouté le 16/02/2016 à 15:16 :
Pour l'instant, les méthodes repas() et reproduction() de la class poisson ne serve à rien.
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 16/02/2016 15:17 | #
Non !
N'oublie pas de tuer aussi le poisson dans la méthode temps() s'il n'a pas eu à manger (besoin_nourriture = 1, mais avant la remise à 1).
Au lieu de retirer 30 euros d'argent à la création d'un aquarium, il paraît intéressant de le faire dans la fonction qui crée l'aquarium. Tout simplement parce que cette fonction devra tester si tu as au moins 30 euros avant de te donner un aquarium, donc autant centraliser
Pour retirer un élément d'une liste :
Citer : Posté le 16/02/2016 15:23 | #
Oui mais les éléments s'appellent tous poisson.
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 16/02/2016 15:35 | #
Tu n'as définitivement pas compris ce qu'était une variable. Une variable n'est qu'une donnée en mémoire, le nom on s'en fout. Tu peux avoir une seule variable qui porte deux noms. Tu peux aussi avoir des variables qui ne portent pas de nom. Le nom ne fait pas la variable.
Non, les éléments de ta liste ne s'appellent pas poisson. Les noms des variables ne sont pas connus à l'exécution dans la plupart des langages. Le programme sait juste que la variable se trouve à tel endroit de la mémoire, son nom il l'a oublié pendant la compilation (à la volée parfois). C'est pour ça que tu ne peux pas écrire « entier_str(i) = 2 », parce que le nom d'une variable n'a aucun sens à l'exécution. Ça n'existe plus.
Ici c'est pareil. Si tu lui dis « retire-moi l'objet poisson de la liste » il ne cherche pas par le nom. Il cherche par la donnée. Il ne va pas sélectionner l'élément à retirer sur le nom, mais sur l'égalité avec la variable que tu manipules dans la fonction appelante sous le nom de poisson. Il va retirer de la liste le premier poisson égal à celui que tu lui donnes en paramètre.
Prenons un autre exemple.
for i in range(4):
liste.append(i)
liste.remove(3)
Tu crois vraiment que le programme va chercher un élément qui s'appelle 3 ?
Citer : Posté le 16/02/2016 15:49 | #
D'accord mais je ne comprends toujours pas ce que je dois mettre en paramètre de remove() car mes objet de la class poisson sont eux-même constitués d'autres objets. Or c'est la variable vie (un de ces objets) qui m’intéresse il faudrait donc que je fasse un truc qui ressemble à ça même si ce n'est pas possible :
Je sais que ce n'est pas possible
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 16/02/2016 15:57 | #
Il faut itérer et faire quelque chose comme :
if poisson.vie == 0:
self.pop.remove(poisson)
Au passage, il faut que tu aies le réflexe, le test d'égalité c'est '=='. Donc même si c'est faux, il faut écrire 'poisson.vie == 0'.
Citer : Posté le 16/02/2016 16:02 | #
J'ai enfin compris.
Merci
Ajouté le 16/02/2016 à 16:34 :
Ça marche enfin :
import random
def achat_nouriture (nb_conserve) :
global nouriture
global argent
if nb_conserve*10 <= argent :
for c in range(nb_conserve) :
nouriture += 20
argent -= 10
def achat_aquarium (nb_aquariums, list_aquariums) :
global argent
if nb_aquariums*30 <= argent :
for a in range(nb_aquariums) :
argent -= 30
aquarium = Aquarium()
list_aquariums.append(aquarium)
class Poisson :
def __init__ (self):
self.age = 0
self.sexe = random.randint(1,2)
self.capacite_reproduction = 0
self.besoin_nourriture = 1
self.vie = 1
def temps (self):
self.age += 1
if self.age > 6 or self.besoin_nourriture == 1:
global nb_poisson_m
nb_poisson_m += 1
self.vie = 0
self.capacite_reproduction = 1
self.besoin_nourriture = 1
def reproduction (self):
self.capacite_reproduction = 0
def repas (self) :
self.besoin_nourriture = 0
class Aquarium :
def __init__ (self ):
self.pop = []
poisson = Poisson()
poisson.sexe = 1
self.nouveau_poisson(poisson)
poisson = Poisson()
poisson.sexe = 2
self.nouveau_poisson(poisson)
def reproduction (self ):
nb_p_m_adulte = 0
nb_p_f_adulte = 0
for poisson in self.pop :
if poisson.age > 0 and poisson.sexe == 1:
nb_p_m_adulte += 1
if poisson.age > 0 and poisson.sexe == 2:
nb_p_f_adulte += 1
if nb_p_m_adulte > nb_p_f_adulte :
nb_couple = nb_p_f_adulte
else :
nb_couple = nb_p_m_adulte
for i in range(nb_couple) :
nb_enfant = random.randint(5,10)
for i in range(nb_enfant) :
poisson = Poisson()
self.nouveau_poisson(poisson)
def vente (self, nb_poissons ) :
global argent
for p in nb_poissons :
argent += 1.5
del self.pop[-1]
def repas (self) :
poisson_a_nourir = len(self.pop)
global nouriture
for poisson in self.pop :
if nouriture > 0 :
nouriture -= 1
poisson.repas()
else :
break
def nouveau_poisson (self , poisson):
if len(self.pop) < 20 :
self.pop.append(poisson)
else :
global nb_poisson_m
nb_poisson_m += 1
def temps (self ) :
for poisson in self.pop :
poisson.temps()
if poisson.vie == 0 :
self.pop.remove(poisson)
argent = 200
nouriture = 20
aquarium = Aquarium()
list_aquariums = [aquarium]
while 1 :
nb_poisson_m = 0
poissons = 0
for aquarium in list_aquariums :
aquarium.reproduction()
aquarium.repas()
aquarium.temps()
poissons += len(aquarium.pop)
print(nb_poisson_m, "sont morts")
print("Vous possédez :")
print(argent, " $")
print(poissons, " poissons")
print(len(list_aquariums), " aquariums")
print(nouriture, "rations de nouritures")
nb_aquariums = int(input("Combiens d'aquariums voulez vous acheter :"))
nb_conserves = int(input("Combiens de conserve voulez vous acheter :"))
nb_poissons = int(input("Combiens de poissons voulez vous vendre :"))
if nb_aquariums > 0 :
achat_aquarium (nb_aquariums, list_aquariums)
if nb_conserves > 0 :
achat_nouriture (nb_conserves)
if nb_poissons > len(list_aquariums[-1].pop) :
list_aquariums[-1].vente(nb_poissons)
if argent == 0 :
print ("Perdu")
os.system("pause")
break
if argent >= 1000 :
print ("Gagné !!!")
Bon le système de vente n'est pas au point(du tout ) mais ça marche.
Je voulais quand même que tu vois le code terminé (presque).
En tout cas merci beaucoup beaucoup pour ton aide et ta patience .
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 16/02/2016 17:01 | #
Ce code commence à ressembler à quelque chose
N'hésite pas à pratiquer quelques exemples plus simples, et vérifie que tu as bien compris tous les concepts importants, le reste viendra avec l'expérience
Citer : Posté le 16/02/2016 17:15 | #
Merci
Ajouté le 18/02/2016 à 21:14 :
Bonjour, une petite question :
for poisson in self.pop :
poisson.temps()
if poisson.vie == 0 :
self.pop.remove(poisson)
Dans cette méthode, j'ai une boucle for qui parcoure une liste or dans la boucle je modifie la liste ma question est : est-ce-que ça modifie le parcours de la liste ??? (je pense que oui).
Et cela me pose un gros problème :
En effet ,voici un exemple :
je pars avec 8 poissons dans ma liste ; les 4 premiers sont en pleine forme donc pas de problème ; mais les 4 derniers n'ont pas mangés il doivent donc mourir, les 2 premiers meurent mais cela à modifié le parcours de ma liste (car la liste a été raccourci ) et ainsi, les deux derniers ne meurent pas Problème.
La deuxième question est donc comment je fais pour parer ce problème.
Je ne suis pas sûr que vous avez tous compris du premier coup alors relisez SVP ce n'est pas si compliqué, ne m'abandonnez pas
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 18/02/2016 22:13 | #
En effet, c'est un phénomène à surveiller !
>>> for el in liste:
... if el == 2 or el == 3:
... liste.remove(el)
...
>>> liste
[0, 1, 3, 4]
>>>
N'oublie pas que le parcours des listes se fait sur des indices et que retirer un élément saute une entrée dans la boucle !
Pour résoudre ton problème, il te suffit de créer une nouvelle liste. J'en profite pour écrire une compréhension :
for poisson in self.pop:
poisson.temps()
self.pop = [poisson for poisson in self.pop if poisson.vie]
Citer : Posté le 19/02/2016 08:09 | #
Au passage, est-ce vraiment pertinent d'appeler un attribut "pop" alors que celui-ci est communément utilisé en tant que méthode bien particulière de la plupart des classes ? (Dont les listes)