Optimisation de code et questions
Et bien je me suis ECLATE à faire cet exo, je l'ai plié en moins d'une heure, je sens vraiment que je suis beaucoup plus à l'aise avec les if, elif, else et la boucle while.
Je me suis amusé à rajouter ma petite touche perso (annonce de coup critique sur les coups du joueur, ennemi, critique sur la potion et empêcher le joueur d'aller au dessus de 50hp)
from random import randint
#Variables principales
HP_PLAYER = 50
HP_OPPONENT = 50
POTIONS = 3
ACTION_MENU = "Souhaitez-vous attaquer (1) ou vous soigner (2) ? "
ACTION_CHOICE = ["1", "2"]
#Boucle principale
main_game = True
while main_game == True:
player_choice = ""
while player_choice not in ACTION_CHOICE:
player_choice = input(ACTION_MENU)
if player_choice not in ACTION_CHOICE:
print("Veuillez choisir une action valide.")
if player_choice == "1": #boucle d'attaque joueur
attack_player = randint(5, 10)
HP_OPPONENT = HP_OPPONENT - attack_player
if attack_player <= 9: #print critique si coup 10
print(f"""Vous infligez {attack_player} de dégats à l'ennemi.
Il reste {HP_OPPONENT} points de vie à l'ennemi.""")
else:
print(f"""
WOW ! Tu as infligé un coup critique !
Vous infligez {attack_player} de dégats à l'ennemi.
Il reste {HP_OPPONENT} points de vie à l'ennemi.""")
if HP_OPPONENT <= 0: # Condition pour gagner
print("Vous avez vaincu votre ennemi ! GG")
break
else: #boucle attaque ennemi
attack_opponent = randint(5, 15)
HP_PLAYER = HP_PLAYER - attack_opponent
if attack_opponent <= 13:
print(f"""
Votre ennemi vous inflige {attack_opponent} point de dégats.
Il vous reste {HP_PLAYER} points de vie.""")
else:
print(f"""
Aie... Coup critique !
Votre ennemi vous inflige {attack_opponent} point de dégats.
Il vous reste {HP_PLAYER} points de vie.""")
if HP_PLAYER <= 0: # condition pour perdre
print("NOOB T'AS PERDU LOL")
break
elif player_choice == "2": #boucle de potion
if POTIONS > 0:
POTIONS -= 1
potion_hp = randint(15, 50)
HP_PLAYER = HP_PLAYER + potion_hp
if HP_PLAYER > 50:
HP_PLAYER = 50
print("Votre nombre de points de vie ne peut excéder 50.")
elif potion_hp >= 40:
print("\nVous sentez que la potion fait plus d'effet qu'à son habitude !\n")
print(f"Vous passez votre tour pour vous soigner de {potion_hp}. Il vous reste : {HP_PLAYER}.")
#Retour à l'attaque de l'attaque de l'ennemi
attack_opponent = randint(5, 15)
HP_PLAYER = HP_PLAYER - attack_opponent
if attack_opponent <= 13:
print(f"""Votre ennemi vous inflige {attack_opponent} point de dégats.
Il vous reste {HP_PLAYER} points de vie.""")
else:
print(f"""
Aie... Coup critique !
Votre ennemi vous inflige {attack_opponent} point de dégats.
Il vous reste {HP_PLAYER} points de vie.""")
if HP_PLAYER == 0: #Condition de défaite
print("NOOB T'AS PERDU LOL")
break
else: # Plus de potion
print("Vous n'avez plus de potion...")
continue
print("-" * 50)
Comment pensez-vous que je peux améliorer mon code ?
AUTOCORRECTION =
Je suis en train de regarder la solution, j'envoi toujours avant de regarder ce qui me permet d'avoir un élément de comparaison.
Effectivement j'aurai pu créer une variable SKIP_TURN ce qui aurait permis de pas réécrire la partie #Retour à l'attaque de l'attaque de l'ennemi
J'aurai pu également mettre un print("Fin du jeu"), ça s'arrête un peu de façon barbare, qui pourra s'executer après chaque break sur les conditions HP_PLAYER et HP_OPPONENT
Je n'ai pas pensé à soustraire 2 variables entre elle directement HP_OPPONENT = HP_OPPONENT - attack_player aurait pu être simplifiée en HP_OPPONENT -= attack_opponent (et même chose pour toutes les opérations du script)
Si vous voyez d'autre choses n'hésitez pas à me le faire savoir :)
Salut Alan,
Voici des pistes d'amélioration pour ton code qui est déjà très bien ! Bravo d'être allé jusqu'au bout, c'est un gros morceau ce projet ;)
from random import randint
#Variables principales
HP_PLAYER = 50
HP_OPPONENT = 50
POTIONS = 3
ACTION_MENU = "Souhaitez-vous attaquer (1) ou vous soigner (2) ? "
ACTION_CHOICE = ["1", "2"]
Pour cette partie ☝️
Utilise des constantes uniquement pour les valeurs qui ne changent pas pendant le jeu.
MAX_HP = 50
INITIAL_POTIONS = 3
Pour les valeurs qui changent pendant le jeu, tu peux les laisser en haut mais en minuscule :
player_hp = MAX_HP
opponent_hp = MAX_HP
potions = INITIAL_POTIONS
Pour ACTION_CHOICE, tu peux utiliser un tuple au lieu d'une liste, car ces valeurs ne changeront pas :
ACTION_CHOICE = ("1", "2")
Ça rend ton code plus lisible et plus conforme aux conventions Python (PEP 8). Les constantes en majuscules indiquent clairement quelles valeurs sont fixes, tandis que les variables en minuscules montrent ce qui peut changer au cours du jeu.
Pour la boucle du choix de l'input, tu peux également utiliser un while True avec un break. Là c'est plus une question de préférence, c'est bien d'être explicite comme tu l'as fait, mais le code est plus succinct avec un while True, même si certains développeurs n'aiment pas ça :
while True:
player_choice = input(ACTION_MENU)
if player_choice in ACTION_CHOICE:
break
print("Veuillez choisir une action valide.")
Pour le coup critique, crée une constante qui identifie clairement la valeur du coup critique :
PLAYER_MAX_DAMAGE = 10
# ...
if attack_player == PLAYER_MAX_DAMAGE: # Coup critique
Il faut éviter de mettre des valeurs arbitraires comme ça, même si tu mets un commentaire, <= 9 "ça ne veut rien dire", alors que == PLAYER_MAX_DAMAGE on comprend directement.
Pour les messages, tu peux utiliser une f-string unique multiligne :
print(f"""
{'WOW ! Tu as infligé un coup critique !' if attack_player == PLAYER_MAX_DAMAGE else ''}
Vous infligez {attack_player} de dégâts à l'ennemi.
Il reste {opponent_hp} points de vie à l'ennemi.
""")
Pareil pour les dégats de l'ennemi, utilise des constantes :
ENEMY_MIN_DAMAGE = 5
ENEMY_MAX_DAMAGE = 15
ENEMY_CRIT_THRESHOLD = 13
attack_opponent = randint(ENEMY_MIN_DAMAGE, ENEMY_MAX_DAMAGE)
Et après plutôt qu'une structure conditionnelle tu peux utiliser un opérateur de comparaison qui te retourne directement un booléen, c'est plus succinct :
is_critical = attack_opponent > ENEMY_CRIT_THRESHOLD
Encore une fois, les f-string multiligne qui permettent d'être assez flexible, notamment pour avoir la bonne orthographe si on veut être pointilleux ^^ ({'s' if HP_PLAYER > 1 else ''}) :
print(f"""
{'Aie... Coup critique !' if is_critical else ''}
Votre ennemi vous inflige {attack_opponent} point{'s' if attack_opponent > 1 else ''} de dégâts.
Il vous reste {HP_PLAYER} point{'s' if HP_PLAYER > 1 else ''} de vie.
""")
Pour les potions, même chose avec les constantes :
POTION_MIN_HEAL = 15
POTION_MAX_HEAL = 50
POTION_SUPER_HEAL_THRESHOLD = 40
Pour toutes les opérations arithmétiques, tu l'avais déjà remarqué, utilise -= ou += :
hp_player += potion_hp
Petite astuce quand tu veux limiter quelque chose, tu peux utiliser min et max :
hp_player = min(hp_player, MAX_HP)
Essaie déjà de changer tout ça et on pourra refaire une passe par dessus le code rendu là ;)
Bonne continuation !
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte