Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Programmation multimédia/Jeux
Programmation multimédia/Jeux Forum d'entraide sur la 2D, 3D, video, son, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/01/2012, 18h25   #1
MaksOuw
Candidat au titre de Membre du Club
 
Homme Maxime Charron
Étudiant
Inscription : novembre 2011
Messages : 20
Détails du profil
Informations personnelles :
Nom : Homme Maxime Charron
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2011
Messages : 20
Points : 10
Points : 10
Par défaut [Aide] Fonction dans un jeu

Bonjour tout le monde, je viens ici car j'ai un léger problème.

Je défini une fonction mob() qui retourne un mob aléatoirement. Jusque là tout fonctionne.

Mais le problème est là : le mob retourné à des attributs (vieMob, nbDegatsMob..) et je ne sais pas comment les récupérer.

J'ai donc ce code ci :

Code :
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
# -*- coding: utf-8 -*-
#Caractéristiques mobs.py
 
import random
 
def mob():
	lettre = random.choice('hgst')
	if lettre == "t":
		nomMob = "Troll"
		vieMob = 70
		nbDegatsMob = random.randint(1,15)
	elif lettre == "g":
		nomMob = "Gnoll"
		vieMob = 50
		nbDegatsMob = random.randint(1, 25)
	elif lettre =="s":
		nomMob = "Satyre"
		vieMob = 120
		nbDegatsMob = random.randint(5, 30)
	elif lettre=="h":
		 nomMob = "Hydralysk"
		 vieMob = 250
		 nbDegatsMob = random.randint(20, 70)
	return nomMob
	return vieMob
 
print ("Le "+mob()+" a "???????" PV.")
Et ici, je ne sais pas quoi mettre à la place des ??? pour avoir les points de vie du mob. J'ai déjà essayé les choses suivantes :

mob().vieMob
vieMob.mob()
mob(vieMob)

Mais nada, rien ne marche, j'ai toujours des erreurs. Pourrez-vous m'aider à résoudre ceci ? Ca me ferait avancer d'un pas gigantesque dans mon développement, parce que la je stagne, comme tout ce que je fais est aléatoire et a plusieurs attributs, je ne peux que tout ajouter au main et ca fait un code de 350 lignes alors que ca pourrait en faire 100 et avoir d'autres fichiers avec les fonctions à côté.

Merci d'avance !
MaksOuw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2012, 19h55   #2
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 697
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 697
Points : 4 526
Points : 4 526
Salut,
Je remplacerais:
Code :
1
2
3
4
	return nomMob
	return vieMob
 
print ("Le "+mob()+" a "???????" PV.")
par:
Code :
1
2
3
4
	return nomMob, vieMob
 
n, v = mob()
print ("Le "+n+" a "+v+" PV.")
Citation:
comme tout ce que je fais est aléatoire et a plusieurs attributs, je ne peux que tout ajouter au main et ca fait un code de 350 lignes alors que ca pourrait en faire 100 et avoir d'autres fichiers avec les fonctions à côté.
Ne serait-il pas temps d'apprendre à réfléchir à regrouper les attributs qui sont communs à de mêmes objets en liste, dictionnaires,... et soyons fou "classes"?

En exagérant un peu, vous pourriez écrire cela ainsi:
Code :
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import random
 
class MobType(type):
    registry = []
 
    def __init__(cls, *args, **kwds):
        if cls.__name__ != 'Mob':
            MobType.registry.append(cls)
 
    def create(cls):
        return random.choice(MobType.registry)()
 
class Mob:
    __metaclass__ = MobType
 
    def __init__(self):
        self.vie = self.vie_initial
        self.degats = random.randint(*self.args_degats)
 
    @property
    def name(self):
        return self.__class__.__name__
 
    def __str__(self):
        return "%s a %d PV" % (self.name, self.vie)
 
class Troll(Mob):
    vie_initial = 70
    args_degats = (1,15)
 
class Gnoll(Mob):
    vie_initial = 50
    args_degats = (1, 25)
 
class Satyre(Mob):
    vie_initial = 120
    args_degats = (5, 30)
 
class Hydralysk(Mob):
    vie_initial = 250
    args_degats = (20, 70)
 
print (Mob.create())
Bon d'accord, ce n'est pas du code de débutant mais c'est juste pour vous montrer que l'ambition de faire des choses compliquées (et écrire 400 lignes de code commence à l'être) pourrait être aidée par la maîtrise de "bases" qui vous permettront d'organiser tout çà.

Bon courage,
- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 15h59   #3
MaksOuw
Candidat au titre de Membre du Club
 
Homme Maxime Charron
Étudiant
Inscription : novembre 2011
Messages : 20
Détails du profil
Informations personnelles :
Nom : Homme Maxime Charron
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2011
Messages : 20
Points : 10
Points : 10
Tout d'abords, merci pour cette réponse. Seulement, les classes, pour l'instant j'ai pas trop le temps d'apprendre concrètement a les gérer en Python. Je compte déjà finir l'apprentissage du Java pour comprendre un minimum le concept objet.

Sinon, j'ai trouvé une parade pour mon problème, mais qui m'en a générer un autre :

Code :
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
29
30
# -*- coding: utf-8 -*-
#Caractéristiques mobs
 
import random
 
def mob():
	lettre = random.choice('hgst')
	if lettre == "t":
		#nomMob = "Troll"
		#vieMob = 70
		#nbDegatsMob = random.randint(1,15)
		defMob = ("Troll", 70, random.randint(1,15))
	elif lettre == "g":
		#nomMob = "Gnoll"
		#vieMob = 50
		#nbDegatsMob = random.randint(1,25)
		defMob = ("Gnoll", 50, random.randint(1,25))
	elif lettre =="s":
		#nomMob = "Satyre"
		#vieMob = 120
		#nbDegatsMob = random.randint(5,30)
		defMob = ("Satyre", 120, random.randint(5,30))
	elif lettre=="h":
		 #nomMob = "Hydralysk"
		 #vieMob = 250
		 #nbDegatsMob = random.randint(20,70)
		 defMob = ("Hydralysk", 250, random.randint(20,70))
	return defMob
 
print("Le "+str(mob()[0])+" a "+str(mob()[1])+" PV.")
Le problème est que la valeur 1 est différente de celle rentrée dans le Tuple du mob.

En fait, quand ca génère aléatoirement le choix du mob, j'ai un nomMob qui est donné, et ensuite, il régénère aléatoirement une lettre pour assigner une vieMob différente. Et je voudrais retourner directement la vieMob associé au nomMob de la variable defMob.

Y'a un moyen de faire ça ? Merci d'avance !
MaksOuw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 16h29   #4
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 697
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 697
Points : 4 526
Points : 4 526
Salut,

Lorsque vous écrivez:

Code :
print("Le "+str(mob()[0])+" a "+str(mob()[1])+" PV.")
En appelant 2 fois mob(), ce sont les contenus de 2 mob différents sui sont affichés... normal!
Ce que vous voudriez passerait plutôt par:
Code :
1
2
m = mob()
print("Le "+str(m[0])+" a "+str(m[1])+" PV.")
Citation:
Seulement, les classes, pour l'instant j'ai pas trop le temps d'apprendre concrètement a les gérer en Python. Je compte déjà finir l'apprentissage du Java pour comprendre un minimum le concept objet.
Si en plus vous vous dispersez vous aurez encore moins de temps.
- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h53.


 
 
 
 
Partenaires

Hébergement Web