Je fesait un petit RPG pour m'entrénait au python, je sait que j'ai beaucoups défini dans tous les sens des fonctions qui s'entre apelle.... je donne toute la source desfois que ça vous intéresse, et l'erreur parrait sur une ligne ou je voix pas de difficulté... je qute commenté le message d'érreur sur la ligne en question....
## permest de definir toute les donnees de l'unite en donnans une succession de valeur entre les parenthese
"""constructeur: reclame Nom, Force, Taux de reussite des coups, PV,//
une liste de capacitee [nom,force, taux, magie,niveau, nom, force....], nombre de poits de magie, les points d'experience, XP, level, item type"""
self.nom=nom
self.force=force
self.taux=taux
self.pv=pv
self.pv_=pv
self.pm=pm
self.pm_=pm #les variable avec "_" a la fin sont les limites superieures (pour points de vie et point de magie)
self.xp=xp
self.xp_=xp # dans le cas des xp, xp_ c'est les xp qui servent a determiner le niveau et xp sont enleve pour payer des ameliorations de capacites ou de nouvelles capacites
self.lvl=lvl
self.dead=0
self.ability=ability
self.inventaire=[]#liste des items de l'inventaire
self.item=item #dans le cas d'un mechant, item qu'il est suceptible de donne
self.wins=0
self.fuite=0
self.money=0
def newunit(self, new):
## New unit sert a copier une unite car si on met en egalite 2 objet, la modification de l'un modifiera l'autre
## Sert a pouvoir massacrer une unite en gardant l'objet type en memoire
"""l'unite en argument devien pâle copie de celle a laquelle sapplique la methode"""
## Checkup permet d'augmenter le niveau de l'unitee controlee
## Utilisee entre chaque coups pour upgrader ou verifier l'aspect mort de l'unite
"""contrôle le niveau et l'etat vivant de l'unite"""
if sqrt(self.xp_)>self.lvl: # augmentation des stats de l'unite
print"%s gagne un niveau: il gagne: %s mana, %s force, %s points de vie, monte son taux a %s" % (self.nom, int(exp(self.lvl)/2), self.lvl*2, self.lvl**2, sqrt(self.taux))
readtime(5)
self.lvl+=1
self.force+=self.lvl*2
self.pv_+=(self.lvl)**2
self.pv+=(self.lvl)**2
self.pm=int(self.pm_+(self.lvl)**2)
self.pm_=int(self.pm_+(self.lvl)**2)
self.taux=sqrt(self.taux)
ifself.pv<=0: # unitee morte
if"fee en bouteille"inself.inventaire:
clearterm()
self.pv=0
self.useitem(self.inventaire.index("fee en bouteille"))
print"Votre fee vous vois en sale etat, elle saute de sa bouteille pour vous sauver, dites lui merci"
readtime()
else:
print"tu as perdu " + self.nom
self.dead=1
def useability(self, mechant,x):
## Useability, regarde la capacite x de self et l'utilise contrel'mechant
## Fondement du combat, correspond au fait de donner un coup (ou prendre fuite)
"""donne l'mechant et numereau de l'ability en cas de fuite, la fonction retourne "fuite". """
printself.ability[5*x]# 5*x est le debut de l'abilite (le nom) X suivi de ses 4 caracteristique (force,taux,cout de magie,niveau).
self.pm=self.pm-self.ability[5*x+2]
if ran()>(self.ability[5*x+3]): print'le coup %s est un echec' % (self.ability[5*x],)
elif ran()<=(self.ability[5*x+3]):
ifself.ability[5*x]=="fuite": return"fuite"
degats=int(ran()*self.force*self.ability[5*x+1])
mechant.pv-=degats
self.xp+=int(int(log(1+degats,1.5))*(log(mechant.xp_+mechant.force**7+mechant.pv_+mechant.pm_,5)/10))#increment des XP
print"%s gagne %s points d'experience apres avoir inflige %s degats a %s" % (self.nom, int(int(log(1+degats,e))*(log(mechant.xp_+mechant.force**7+mechant.pv_+mechant.pm_,7)/10)), degats, mechant.nom)
readtime(2)
def addinv(self,mechant):
## Addinv: petite fonction utilisee en fin de combat pour gagner a pile ou face l'item type du mechant
"""offre une chance sur deux d'aqquerir l'item de l'mechant en argument"""
a=ran()
b=0
iflen(self.inventaire)>=20:
print"besace pleine"
a=0
elif a>=0.5:
b=1
print""
self.inventaire.append(mechant.item)
print"victoire! vous avez vaincu "+ mechant.nom+" vous trouvez dans sa besace %s $ et %s %s" % (mechant.money,b,mechant.item)
Joueur.wins+=1
Joueur.money+=mechant.money
def useitem(self, item):
## useitem : utilisation des items
## incremente les stats du hero des valeurs associees du tuple de l'item (implicite)
"""utilise l'item en argument"""
tupple=inventaire[self.inventaire[item]]#acquisition du tuple du dico des items.
self.inventaire.remove(self.inventaire[item])#retrait de l'inventaire lie a l'utilisation
self.pv += tupple[0]
self.pv_ += tupple[1]
self.pm += tupple[2]
self.pm_ += tupple[3]
self.xp += tupple[4]
self.xp_ += tupple[4]
self.force += tupple[5]
ifself.pv>self.pv_: self.pv=self.pv_
ifself.pm>self.pm_: self.pm=self.pm_
#################################
##
## Definition fonctions simple
##
#################################
def ran():
## ran() = retourne une valeur entre 0 et 1 (genre 0.3589456321 ou 0.7854322154)
"""retourne un random classique"""
return(random())
def question(Q, propositions): # pour ceux qui se posent la question("c'est quoi cette question?", ["c'est dur", "cest facile"])
## question("je suis la question", ["je suis la premiere proposition", "Je suis la deuxieme", "Je suis la troisieme"])
## pose une question a propositions et retourne la valeur correspondant a la reponse (la valeur 0 correspond a la premiere proposition)
"""pose la question Q (1er argument) avec les proposition (liste et 2eme argument), retourne le numereau de la reponce voulue"""
t=0
while t==0:
print Q
x=0
while x<len(propositions):
print x, " - ", propositions[x]
x+=1
answer,t=asknumber(),1
if answer>=len(propositions)or answer<0:
t=0
print"Valeur en entree incorrecte"
clearterm()
return answer
def asknumber():
## prinsipalement utilise par la fonction question, cette fonction demende un chifre,
## elle controle son aspect "chiffrique" et retourne la reponce ou -9 si c'est pas une bone valeur qui a ete donnee (permet de comparer le resultat)
"""demande une valeur et controle que ce soit un entier puis la retourne (cas contraire retourne -9 pour pouvvoir etre compare et sorti d'intervalle)"""
answer=raw_input('entrez une valeur numerique entiere \n')
try: a=int(answer)
except: a=-9
return a
def buildlist(mode):
## buildlist est la fonction pour faire des listes de propositions pour questions: 3 modes
##1## mode 'capa' cre la liste des abilitys pour le combat
##2## mode 'boost' cre la liste des abilitys pour le menu ou on les boostent
##3## mode 'item' cre la liste des items de l'inventaire pour inventaire()
##4## mode 'sell' cre la liste du vendeur
"""retourne une liste des ability du joueur"""
liste=[]
if mode== 'capa':
for c inrange((len(Joueur.ability))/5):
liste.append(str(Joueur.ability[c*5])+' force: %s , Taux de reussite: %s , Cout de magie: %s' % (Joueur.ability[c*5+1], Joueur.ability[c*5+3], Joueur.ability[c*5+2]))
elif mode == 'boost':
for c inrange((len(Joueur.ability))/5):
liste.append(str(Joueur.ability[c*5])+' force: %s , Taux de reussite: %s , Cout de magie: %s, Niveau: %s, cout de xp :%s' % (Joueur.ability[c*5+1], Joueur.ability[c*5+3], Joueur.ability[c*5+2], Joueur.ability[c*5+4], Joueur.ability[c*5+4]**koefdecoutdecapa[Joueur.ability[c*5]]))
# pour implementer le jeu d'une unite, il faut ajouter ici un nouvel mechant, definir son item dans le dictionnaire inventaire et ajouter des chances de rencontrer l'mechant dans find_an_ennemy.
# kefdecoutdecapa est un dictionnaire repertoriant les koefficiants de cout en points du niveau de capa
koefdecoutdecapa={"coup de poing":2, "fuite":1.58, "super coup de poing":3, "attendre":1}
# mechant est une unite qui sera l'adversaire du joueur au long du jeu, il sera resete entre chaque combat.
mechant=unite(1,1,1,1,1,1,1,1,1)
# liste des actions propose entre chaques combat.
listactions=['continuer le combat', "utiliser vos points d'experience", "aller chez le commerçant", "utiliser des items","regarder ses stats","quitter le jeu"]
# definition des unitees
##rappel: unite(nom,force,taux de reussite, points de vie, liste des capacitees(nom,force, cout de magie, taux de reussite, niveau), poinst de magie, experience, niveau, nom d'items)
#joueur (raw input permet au joueur de choisir son nom)
Joueur=unite(raw_input('nom du joueur\n'), 10 , 0.6, 100, ["coup de poing" , 2,0,0.98,2, "fuite" , 0,0,0.5,2, "super coup de poing" , 10,5,0.85,4, "attendre",0,0,1,1], 25, 0, 0,"none")
Joueur.inventaire.append("fee en bouteille")
Joueur.inventaire.append("fee en bouteille")
Joueur.inventaire.append("fee en bouteille")
clearterm()
print"vous commencez le jeu avec 3 fees en bouteilles, elles vous remonteront la vie d'elle meme au dernier moment pour vous sauver la mise \n\n"
readtime()
#definition des type de mechants
carotte=unite("carotte",2,0.7,10,["coup de poil",4,0,0.9,2],10,10,0,"carotte vichi")# cf ligne 64 a 80
boulet=unite("boulet",5,0.8,20,["coup dechaîne",8,0,0.7,3],60,100,5,'poid de force')
Christophe=unite("Christophe",100,0.99999,1000,["Coup de clavier",100,0,0.98,7],10000,10000,100,"Linux Kernel")
#definition des diferents inventaires.
inventaire={"carotte vichi":(50,0,5,0,0,0),"poid de force":(0,5,0,0,0,0.5),'pommade':(1000,50,50,5,20,0.7),"Linux Kernel":(1000000000,100000,1000000000,1000000,9999999999,20),"fee en bouteille":(2000000000,0,20,0,0,0,50000),"potion de restauration":(2000000000,0,2000000000,0,0,0,5000),"potion de vie mineure":(500,10,10,5,0,0,1500)}#'nom de l'item':(pv,pv_,pm,pm_,xp,force,cout(si a vendre)),
listemarchand=["potion de vie mineure","potion de restauration","fee en bouteille"]
# definition de rep pour pouvoir comparer a 5 dans la boucle while.
rep=1
####################################
##
## Le code de l'apres definition.
##
####################################
while rep!=5or Joueur.dead==1:
rep=1
find_an_ennemy(mechant)
combat(mechant,1)
print Joueur.wins
if Joueur.dead==1 : break
while0<rep<=len(listactions):
rep=question("Voulez vous:", listactions)
if rep==1:
print"bienvenu dans ce menu:"
c=question("quelle aptitude voulez vous ameliorer d'un niveau?", buildlist('boost'))
if Joueur.ability[c*5+4]**koefdecoutdecapa[Joueur.ability[c*5]]<Joueur.xp:
print"pas de commmerçant qui vous laissent rentrer la bourse si légère. CLOCHARD!"
print"vous avez %s $ dans votre besace... à vous d'attendre la tolérence du marchant pour en faire bon usage (1800$)" % Joueur.money
else:
acheter()
elif rep==3: gestion_inventaire()
elif rep==4: Joueur.identity()
elif rep==5: pass
ÉDIT:je vous passerait ma version du code en éditant se code sauf si vous en voulais pas, mais si ne serai-ce que ça puisse intéresser une personne, je pense que ce n'est pas perdu...
ReÉdit: J'ai fait des effort de lisibilité du fait de la publicaation de mon code... (commentaires+ définition de fontions)
Merci de vous intéresser a ce code (qui je pense peut être assez interessant car simple et mieu commenté pourait carrément avoir une visée pédagogique)
Si la violence ne résout pas ton problème c'est que tu n'as pas été assez violent.
pourtant la ligne est toute bête! il y a pas de difficulté ou quoi.... je n'arrive pa a voir, j'ai cherché bien longtemps mais la j'arrive pas.... il y a les 2 points, les espaces sont pas des tabs (car quant on mélange plusieurs type d'indentation sa galère un peu)
la, je sèche.... mais ça buggue
Si la violence ne résout pas ton problème c'est que tu n'as pas été assez violent.
bonne astuce, dans le code proposé, il y avait un autre exemplaire de manque de parenthèse au bug reporté a la ligne suivante... la il veux bien fonctionne tant qu'on utilise pas l'inventaire...
Merci beaucoup pmol.
Si la violence ne résout pas ton problème c'est que tu n'as pas été assez violent.
(je sait pas faire "include" en python donc, je m'interdit encore le "multi fichier..." et modulaire serait rempacer toutes les valeur fixe par des variable modifiable depuis un "fichier de configuration"? c'est ça?
(merci de la réponse qui plus est constructive) ;-))
Si la violence ne résout pas ton problème c'est que tu n'as pas été assez violent.
Je débute en Python mais j'ai cru comprendre que Bigloo voulait dire que tu devrais créer des modules pour importer tes classes et fonctions. Mais ce n'est peut-être pas du tout ca, je répète que je débute .
super ti nain> C'est effectivement ce que MaAaD a dit : tu peux séparer tes fonctions selon leur effet dans différents modules, que tu enregistres en .py (par exemple combats.py). Après, tu pourras les utiliser depuis d'autres fichiers en les important (par exemple, from combats import *)
Hey, super ti nain, pas mal ton script, je t'avouerais que j'ai pas pris le temps de tout lire , mais je l'ai testé, si je peux me permettre, voici un ou deux conseils...
Tout d'abord, dans quel but as-tu devellopé ce script? Uniquement entrainement ou tu t'amusais un peu??
Ensuite, tu pourrais utiliser
fromrandomimport randrange
, au moyen d'un petit tuple, tu pourrait créer plusieurs nom d'adversaires, perso au debut je tombe toujours sur carrote ;-)
Bon alors j'en arrive à ce que je voulais vraiment te dire : je ne suis pas très POO, surtout en python, mais Tkinter de permettrait de faire une version "graphique", basique certes mais beaucoup plus amusante de ton mini-jeu?
Que ce qui s'y connaissent un peu me répondent...
a plus et bon courage.
PS : comme je l'ai dit, je n'ai pas lu l'integralité du script, donc arrêtez moi si je dis des conneries...
c'était pour un entrainement simpas et qui semble avoir un interet et une phase de test du programme pas trop pénible (vu que c'est un jeu....)
donc, in fact, ce que je vait faire, c'est faire un script avec toutes les def et un script avec le programme lui même... c'est bien ça...
(le code une fois les classe, les fonction et les variables définies, donne:
while rep!=5or Joueur.dead==1:
rep=1
find_an_ennemy(mechant)
combat(mechant,1) print Joueur.wins if Joueur.dead==1 : break while0<rep<=len(listactions):
rep=question("Voulez vous:", listactions) if rep==1: print"bienvenu dans ce menu:"
c=question("quelle aptitude voulez vous améliorer d'un niveau?", buildlist('boost')) if Joueur.ability[c*5+4]**koefdecoutdecapa[Joueur.ability[c*5]]<Joueur.xp:
Joueur.xp-=Joueur.ability[c*5+4]**koefdecoutdecapa[Joueur.ability[c*5]]
Joueur.ability[5*c+1]+=(Joueur.ability[5*c+1])*0.3
Joueur.ability[5*c+2]=sqrt(Joueur.ability[5*c+2])
Joueur.ability[5*c+4]+=1 elif rep == 2: print"pas de commmerçant en ville" print"vous avez %s $ dans votre besace... avous d'attendre le marchant pour en faire bon usage" % Joueur.money elif rep==3: gestion_inventaire() elif rep==4: Joueur.identity() elif rep==5: pass
ce qui est un code plus concis certes ;-)
(mais a coté je fait 3 scripts, un définition des fonctions, un définition des classes et un définition des variable??)
et si tu été juste face a des carottes, j'ai une esplication, c'est car c'est le méchant "bas level" donc tant que tu a pas passé le niveau ee 10 je croix... tu n'est que face a des carottes...
mais bon, j'ai mis des noms déconneur, c'est un script pour mamuser, je pourait définir d'autre type de méchant...
j'ai commencé il y a déja un moment une version avec tk mais j'ai vite abandonner, (j'avait défini la fonction qui pose une question en tk)car il faudrait tout tout tout coder pour le tk c'est a dire que je n'arrive pas a repasser de la fenetre au terminal en fesant une succession de pop-up...
effectivement, je pourait faire un tuple de prénom (mais laisser le nom car faut savoir si on doit s'attendre a un coup de poil ou...) ....
Si la violence ne résout pas ton problème c'est que tu n'as pas été assez violent.
En fait tu ne défini pas tes variables dans un autre fichier (sauf évidemment si tu compte faire commme pour la plus part des jeux un fichier config pour modifier rapidement le jeu sans passer par la source), tu ne met que tes fonctions et classes dans un ou deux fichier différents. Je n'ai pas lu ton code mais tu peux faire un fichier avec les classes et fonctions qui s'appliquent aux "méchants", et un autre fichier avec les classes et fonction de ton héros, par exemple. Et si tu avais utilisé une interface graphique tu aurais créé un fichier avec les classes et fonctions pour l'interface.
Bon sur ce, je me replonge dans le tuto de G.Swinnen, @+ .
dans un souci d'équité la classe du héro est exactement la même que celle de l'ennemi ;-)
mais, oui.. je voix.. et par défaut, je suppose que si je présise pas l'adresse du script, ça regarde a l'adresse relative...
Si la violence ne résout pas ton problème c'est que tu n'as pas été assez violent.
Python: oû est le problême?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.