Sve@r | orbinou a écrit :
Bonjour,
j'essaye de faire un petit programme pour faire rire un pote (on aime bien lol ) mais voilà, ça plante à un moment, et il faut que je force python à quitter, plus moyen de rien faire à une partie bien précise de mon programme. Je vous la mets en copie
(soyez indulgents, je suis pas très fort dans python )
Code :
import random import time def intro (): x= 'FINIII' print '////////////LEAGUE OF LEGENDS\\\\\\\\\\\\\\\\\\\\' timer (2,1) print 'ça pète le feu hein? t as encore rien vu coco' timer (2,1) hero1 = 'udyr' hero2 = 'trynda' timer (1,1) print '>>>STATS TRYNDA<<< \n HP = 150 \nDPS = 20 \nARMOR = 2\n CRITS = 30%' print '>>>STATS UDYR<<< \n HP = 250 \nDPS = 15 \nARMOR = 3\n CRITS = 10%' player1 = raw_input ('choississez votre héros\n -->trynda\n -->udyr\n') if player1 == hero1: player2 = raw_input ('choississez votre héros \n-->'+hero2+'\n') else: player2 = raw_input ('choississez votre héros \n-->' + hero1+'\n') combat (player1, player2) print 'FINII' def combat (player1, player2,): hp1 = 150 hp2 = 250 dps1=20 dps2=15 armor1=2 armor2=3 crits1= 35 crits2 = 25 while hp1 >0 or hp2>0: if player1 == trynda: trynda (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2) udyr (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2) if player1 == udyr: udyr (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2) trynda (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2) def trynda (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2): r = random.randint(1,10) dp= int (raw_input ('tour:' +str (player1)+ '\n >>inserez un numero d attaque entre 1 et 10\n')) if dp == r or dp == r-1 or dp == r+1: print 'CRITIQUE! \npan ' + str(crits1) +'dégats' timer (1,1) hp2 = hp2-(crits1 - armor2) print '->points de vie ' + str (player2)+':\n'+ str(hp2) +'\n' timer (1,1) else: print 'dans les dents! '+ str(dps2) +' dps infligés' timer (1,1) hp2 = hp2- (dps1 - armor2) print '->points de vie ' + str(player2)+':\n'+ str(hp2)+'\n' timer (1,1) def udyr (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2): r = random.randint(1,10) dp= int (raw_input ('tour:' + str(player2) + '\n >>inserez un numero d attaque entre 1 et 10\n')) if dp ==r: print 'CRITIQUE! \n pan' + str(crits1) +'dégats' timer (1,1) hp1 = hp1-(crits2-armor1) print '->points de vie ' + str(player1)+':\n'+ str(hp1)+'\n' timer (1,1) else: print 'dans les dents! '+str(dps1)+' dps infligés' timer (1,1) hp1 = hp1-(dps2 - armor1) print '->points de vie ' + str(player1)+':\n'+ str(hp1)+'\n' timer (1,1) def timer(length, dt=1): end = time.time() + length while(time.time() < end): time.sleep(dt)
|
donc au moment ou il passe dans l'intro () à combat (player1, player2) ça plante. Mais si je remplace à l'intro
Code :
player1 = raw_input ('choississez votre héros\n -->trynda\n -->udyr\n') if player1 == hero1: player2 = raw_input ('choississez votre héros \n-->'+hero2+'\n') else: player2 = raw_input ('choississez votre héros \n-->' + hero1+'\n')
|
par
Code :
player1 = trynda player2 =udyr
|
ça marche. donc c'est avec les raw_input que ça plante.
|
Salut
Désolé, l'instruction que tu cites, quand on n'exécute qu'elle, fonctionne. Donc ça plante peut-être mais pas dans le raw_input(). Et comme j'ai pas de __main__ pour lancer ton code...
orbinou a écrit :
aussi autre truc, si vous lancez l'application et jouez un peu, les points de vie des 2 héros reviennent toujours à leur état initial, malgré le décompte des fonctions udyr et trynda.
Code :
while hp1 >0 or hp2>0: if player1 == trynda: trynda (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2) udyr (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2) if player1 == udyr: udyr (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2) trynda (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2)
|
|
Parce que les variables simples (int, char) qui sont passées à une fonction le sont par copie. Donc la variable originale ne change pas.
Exemple
Code :
def fct(n): n-=1 a=5 print a # 5 fct(a) print a # toujours 5 !!!
|
Sinon as-tu remarqué que les fonctions trynda() et udyr() dont exactement les mêmes (au miroir près) ? Pourquoi n'as tu pas fait une fonction générique unique à laquelle tu passes le combattant à manipuler et son adversaire ? De plus je remarque que tu as un paquet de variables (hp1, hp2, armor1, armor2, etc). Et que vas tu faire si tu rajoutes un 3° perso ? Tu vas rajouter un 3° groupe de variables ? Et tu vas passer tout ce fatras à tes fonctions ?
Donc maintenant, tu as 2 choix: soit tu essayes de tournicoter pour que ça marchotte, soit tu repars de zéro avec une bonne base bien solide. Par exemple pourquoi ne pas créer une classe dédiée à manipuler un personnage qui embarquerait avec elle tous ses paramètres ? Ainsi au lieu de passer 150 variables à tes fonctions tu ne leurs en passes qu'une seule (le perso)
Code :
#!/usr/bin/env python # -*- coding: utf-8 -*- class cPerso: def __init__(self, nom, hp, dps, armor, crits): self.nom=nom self.hp=hp self.dps=dps self.armor=armor self.crits=crits # __init__() def __str__(self): return "joueur: %s - hp: %d - dps: %d - armor: %d - crits: %d" % ( self.nom, self.hp, self.dps, self.armor, self.crits ) # __str__() # class cPerso
|
Puis on teste si ça marche
Code :
joueur1=cPerso("udyr", 150, 20, 2, 35) joueur2=cPerso("trynda", 250, 15, 3, 25) print joueur1 print joueur2
|
Ensuite tu vas faire évoluer ta classe. Lui rajouter par exemple une méthode pour qu'un élément de la classe X puisse combattre un ennemi Y et ta classe devient donc
Code :
class cPerso: ... (les autres méthodes ci-dessus)... def combat(self, ennemy): if int( raw_input( 'tour: %s\n >>inserez un numero d attaque entre 1 et 10\n' % self.nom ) ) == random.randint(1,10): print "CRITIQUE! \n pan %d dégats" % self.crits self.hp = self.hp-ennemy.crits+self.armor else: print "dans les dents! %d dps infligés" % self.dps self.hp = self.hp-ennemy.dps+self.armor # if if self.hp < 0: self.hp=0 print "->points de vie %s: %d\n" % (self.nom, self.hp) # combat() # class cPerso joueur1=cPerso("udyr", 150, 20, 2, 35) joueur2=cPerso("trynda", 250, 15, 3, 25) # petite vérif de la méthode combat joueur1.combat(joueur2) joueur2.combat(joueur1)
|
Ensuite ben tu finalise. Une petite méthode permettant de savoir si un joueur est mort
Code :
class cPerso: ... (les autres méthodes précédentes)... def isDead(self): return self.hp == 0 # isDead() # class cPerso
|
... et la boucle de jeu elle-même...
Code :
joueur1=cPerso("udyr", 150, 20, 2, 35) joueur2=cPerso("trynda", 250, 15, 3, 25) print joueur1 print joueur2 while True: joueur1.combat(joueur2) if joueur1.isDead(): break joueur2.combat(joueur1) if joueur2.isDead(): break # while print "Fin du combat - Résultat: %s (%d) / %s (%d)" % ( joueur1.nom, joueur1.hp, joueur2.nom, joueur2.hp, )
|
Ainsi, en centralisant les actions génériques (combattre, afficher, mourir, etc) 1) on est plus à l'aise et 2) c'est facile à faire évoluer. Bon bref c'est juste pour te montrer comment ça peut se réfléchir... Message édité par Sve@r le 10-01-2012 à 22:52:36
|