[python] plante avec raw_input!

plante avec raw_input! [python] - Python - Programmation

Marsh Posté le 08-01-2012 à 23:05:57    

Bonjour,  
 
j'essaye de faire un petit programme pour faire rire un pote (on aime bien lol :p) 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 :D)  
------------------------------------------
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  
------------------------------
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  
--------------
player1 = trynda</code> <code>player2 =udyr
--------------------
 
ça marche. donc c'est avec les raw_input que ça plante.  
 
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. Donc comment dans la boucle while  
------------
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)
--------------
 
je peux faire en sorte que le décompte des points de vie se fassent normalement?  
         
merci de votre aide :D si vous voulez des précisions, n'hésitez pas

Reply

Marsh Posté le 08-01-2012 à 23:05:57   

Reply

Marsh Posté le 10-01-2012 à 22:31:36    

orbinou a écrit :

Bonjour,  
 
j'essaye de faire un petit programme pour faire rire un pote (on aime bien lol :p) 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 :D)  

Code :
  1. import random
  2. import time
  3. def intro ():
  4.    x= 'FINIII'
  5.    print '////////////LEAGUE OF LEGENDS\\\\\\\\\\\\\\\\\\\\'
  6.    timer (2,1)
  7.    print 'ça pète le feu hein? t as encore rien vu coco'
  8.    timer (2,1)
  9.    hero1 = 'udyr'
  10.    hero2 = 'trynda'
  11.    timer (1,1)
  12.    print '>>>STATS TRYNDA<<< \n HP = 150 \nDPS = 20 \nARMOR = 2\n CRITS = 30%'
  13.    print '>>>STATS UDYR<<< \n HP = 250 \nDPS = 15 \nARMOR = 3\n CRITS = 10%'
  14.    player1 = raw_input ('choississez votre héros\n -->trynda\n -->udyr\n')
  15.    if player1 == hero1:
  16.        player2 = raw_input ('choississez votre héros \n-->'+hero2+'\n')
  17.    else:
  18.        player2 = raw_input ('choississez votre héros \n-->' + hero1+'\n')
  19.    combat (player1, player2)
  20.    print 'FINII'
  21.  
  22.  
  23. def combat (player1, player2,):
  24.    hp1 = 150
  25.    hp2 = 250
  26.    dps1=20
  27.    dps2=15
  28.    armor1=2
  29.    armor2=3
  30.    crits1= 35
  31.    crits2 = 25
  32.    while hp1 >0 or hp2>0:
  33.        if player1 == trynda:
  34.            trynda (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2)
  35.            udyr (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2)
  36.        if player1 == udyr:
  37.            udyr (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2)
  38.            trynda (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2)
  39.        
  40.  
  41. def trynda (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2):
  42.    r = random.randint(1,10)
  43.    dp= int (raw_input ('tour:' +str (player1)+ '\n >>inserez un numero d attaque entre 1 et 10\n'))
  44.    if dp == r or dp == r-1 or dp == r+1:
  45.            print 'CRITIQUE! \npan ' + str(crits1) +'dégats'
  46.            timer (1,1)
  47.            hp2 = hp2-(crits1 - armor2)
  48.            print '->points de vie ' + str (player2)+':\n'+ str(hp2) +'\n'
  49.            timer (1,1)
  50.    else:
  51.            print 'dans les dents! '+ str(dps2) +' dps infligés'
  52.            timer (1,1)
  53.            hp2 = hp2- (dps1 - armor2)
  54.            print '->points de vie ' + str(player2)+':\n'+ str(hp2)+'\n'
  55.            timer (1,1)
  56.  
  57. def udyr (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2):
  58.    r = random.randint(1,10)
  59.    dp= int (raw_input ('tour:' + str(player2) + '\n >>inserez un numero d attaque entre 1 et 10\n'))    
  60.    if dp ==r:
  61.            print 'CRITIQUE! \n pan' + str(crits1) +'dégats'
  62.            timer (1,1)
  63.            hp1 = hp1-(crits2-armor1)
  64.            print '->points de vie ' + str(player1)+':\n'+ str(hp1)+'\n'
  65.            timer (1,1)
  66.    else:
  67.            print 'dans les dents! '+str(dps1)+' dps infligés'
  68.            timer (1,1)
  69.            hp1 = hp1-(dps2 - armor1)
  70.            print '->points de vie ' + str(player1)+':\n'+ str(hp1)+'\n'
  71.            timer (1,1)
  72.  
  73.  
  74.        
  75. def timer(length, dt=1):  
  76.    end = time.time() + length  
  77.    while(time.time() < end):  
  78.        time.sleep(dt)


 
donc au moment ou il passe dans l'intro () à combat (player1, player2) ça plante.  
Mais si je remplace  à l'intro  

Code :
  1. player1 = raw_input ('choississez votre héros\n -->trynda\n -->udyr\n')
  2.    if player1 == hero1:
  3.        player2 = raw_input ('choississez votre héros \n-->'+hero2+'\n')
  4.    else:
  5.        player2 = raw_input ('choississez votre héros \n-->' + hero1+'\n')


 par  

Code :
  1. player1 = trynda
  2. 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 :
  1. while hp1 >0 or hp2>0:
  2.        if player1 == trynda:
  3.            trynda (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2)
  4.            udyr (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2)
  5.        if player1 == udyr:
  6.            udyr (player1,player2,hp1,hp2,dps1,dps2,armor1,armor2,crits1,crits2)
  7.            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 :
  1. def fct(n):
  2.     n-=1
  3.  
  4. a=5
  5. print a    # 5
  6.  
  7. fct(a)
  8. 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 :
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. class cPerso:
  5.     def __init__(self, nom, hp, dps, armor, crits):
  6.         self.nom=nom
  7.         self.hp=hp
  8.         self.dps=dps
  9.         self.armor=armor
  10.         self.crits=crits
  11.     # __init__()
  12.     
  13.     def __str__(self):
  14.         return "joueur: %s - hp: %d - dps: %d - armor: %d - crits: %d" % (
  15.             self.nom,
  16.             self.hp,
  17.             self.dps,
  18.             self.armor,
  19.             self.crits
  20.         )
  21.     # __str__()
  22. # class cPerso


 
Puis on teste si ça marche

Code :
  1. joueur1=cPerso("udyr", 150, 20, 2, 35)
  2. joueur2=cPerso("trynda", 250, 15, 3, 25)
  3.  
  4. print joueur1
  5. 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 :
  1. class cPerso:
  2.     ... (les autres méthodes ci-dessus)...
  3.  
  4.     def combat(self, ennemy):
  5.         if int(
  6.             raw_input(
  7.                 'tour: %s\n >>inserez un numero d attaque entre 1 et 10\n' % self.nom
  8.             )
  9.         ) == random.randint(1,10):
  10.             print "CRITIQUE! \n pan %d dégats" % self.crits
  11.             self.hp = self.hp-ennemy.crits+self.armor
  12.         else:
  13.             print "dans les dents! %d dps infligés" % self.dps
  14.             self.hp = self.hp-ennemy.dps+self.armor
  15.         # if
  16.         if self.hp < 0: self.hp=0
  17.  
  18.         print "->points de vie %s: %d\n" % (self.nom, self.hp)
  19.     # combat()
  20. # class cPerso
  21.  
  22. joueur1=cPerso("udyr", 150, 20, 2, 35)
  23. joueur2=cPerso("trynda", 250, 15, 3, 25)
  24.  
  25. # petite vérif de la méthode combat
  26. joueur1.combat(joueur2)
  27. joueur2.combat(joueur1)


 
Ensuite ben tu finalise. Une petite méthode permettant de savoir si un joueur est mort

Code :
  1. class cPerso:
  2.     ... (les autres méthodes précédentes)...
  3.  
  4.     def isDead(self):
  5.         return self.hp == 0
  6.     # isDead()
  7. # class cPerso


 
... et la boucle de jeu elle-même...
 

Code :
  1. joueur1=cPerso("udyr", 150, 20, 2, 35)
  2. joueur2=cPerso("trynda", 250, 15, 3, 25)
  3.  
  4. print joueur1
  5. print joueur2
  6.  
  7. while True:
  8.     joueur1.combat(joueur2)
  9.     if joueur1.isDead(): break
  10.     
  11.     joueur2.combat(joueur1)
  12.     if joueur2.isDead(): break
  13. # while
  14.  
  15. print "Fin du combat - Résultat: %s (%d) / %s (%d)" % (
  16.     joueur1.nom,
  17.     joueur1.hp,
  18.     joueur2.nom,
  19.     joueur2.hp,
  20. )


 
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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed