plante avec raw_input! [python] - Python - Programmation
Marsh Posté le 10-01-2012 à 22:31:36
orbinou a écrit : Bonjour,
|
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.
|
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 :
|
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 :
|
Puis on teste si ça marche
Code :
|
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 :
|
Ensuite ben tu finalise. Une petite méthode permettant de savoir si un joueur est mort
Code :
|
... et la boucle de jeu elle-même...
Code :
|
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...
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 ) 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 )
------------------------------------------
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 si vous voulez des précisions, n'hésitez pas