Résolue

Projet jeu de rôle

# Correction de code # Scripting

Gabriel Trouvé

Mentor

Avant de regarder la solution, est-ce que certains d'entre vous veulent essayer mon script ? lol J'ai essayé plusieurs scénario et pour moi ça tourne bien !


Mais est-ce que vous avez des suggestions ?


J'ai pris en compte les suggestions de ma question précédente par rapport aux class et au fonctions, mais je n'en ai pas utilisé dans ce projet car je n'ai pas encore vu ça dans mon parcours.


Dans mon script des choses vous choquent-elles ?


Merci d'avance !


import random as rd


VIE_JOUEUR = 50
VIE_ENNEMI = 50
POTIONS_JOUEUR = 3
CHOIX = ["1", "2"]
TOUR = "Souhaitez-vous attaquer (1) ou utiliser une potion (2) ? "
while True:
    choix_joueur = input(TOUR)


    if choix_joueur == "1":
        attaque_joueur = rd.randint(5, 10)
        attaque_ennemi = rd.randint(5, 15)
        VIE_ENNEMI -= attaque_joueur
        print(f"Vous avez infligés {attaque_joueur} point{'s' if attaque_joueur > 1 else ''} de dégat{'s' if attaque_joueur > 1 else ''} à l'ennemi.")
        if VIE_ENNEMI <= 0:
            break
        VIE_JOUEUR -= attaque_ennemi
        print(f"L'ennemi vous a infligé {attaque_ennemi} point{'s' if attaque_ennemi > 1 else ''} de dégat{'s' if attaque_ennemi > 1 else ''}.")
        if VIE_JOUEUR <= 0:
            break
        print(f"Il vous reste {VIE_JOUEUR} point{'s' if VIE_JOUEUR > 1 else ''} de vie.")
        print(f"Il reste {VIE_ENNEMI} point{'s' if VIE_ENNEMI > 1 else ''} de vie à l'ennemi.")
        print("-" * 50)


    elif choix_joueur == "2":
        if POTIONS_JOUEUR == 0:
            print("Vous n'avez plus de potions...")
            continue
        potions = rd.randint(15, 50)
        VIE_JOUEUR += potions
        POTIONS_JOUEUR -= 1
        print(f"Vous récupérer {potions} point{'s' if potions > 1 else ''} de vie ({POTIONS_JOUEUR} potion{'s' if POTIONS_JOUEUR > 1 else ''} restante{'s' if POTIONS_JOUEUR > 1 else ''}")
        attaque_ennemi = rd.randint(5, 15)
        VIE_JOUEUR -= attaque_ennemi
        print(f"L'ennemi vous a infligé {attaque_ennemi} point{'s' if attaque_ennemi > 1 else ''} de dégat{'s' if attaque_ennemi > 1 else ''}.")
        if VIE_JOUEUR <= 0:
            break
        print(f"Il vous reste {VIE_JOUEUR} point{'s' if VIE_JOUEUR > 1 else ''} de vie.")
        print(f"Il reste {VIE_ENNEMI} point{'s' if VIE_ENNEMI > 1 else ''} de vie à l'ennemi.")
        print("-" * 50)
        print("Vous passez votre tour...")
        attaque_ennemi = rd.randint(5, 15)
        VIE_JOUEUR -= attaque_ennemi
        print(f"L'ennemi vous a infligé {attaque_ennemi} point{'s' if attaque_ennemi > 1 else ''} de dégat{'s' if attaque_ennemi > 1 else ''}.")
        if VIE_JOUEUR <= 0:
            break
        print(f"Il vous reste {VIE_JOUEUR} point{'s' if VIE_JOUEUR > 1 else ''} de vie.")
        print(f"Il reste {VIE_ENNEMI} point{'s' if VIE_ENNEMI > 1 else ''} de vie à l'ennemi.")
    
    else:
        continue
if VIE_JOUEUR <= 0:
    print("Tu as perdu !")
    print("Fin du jeu.")


elif VIE_ENNEMI <= 0:
    print("Tu as gagné !")
    print("Fin du jeu.")


Thibault houdon

Mentor

Hello Gabriel ! Déjà bravo pour ce script et t'être rendu jusque là, tu avances vite 🚀


Voici mes retours :


  • Je te conseille de garder le nom du module random au complet plutôt que d'utiliser rd. Je sais qu'on peut voir ce genre de choses dans certains scripts sur StackOverflow ou autre, mais le nom n'est pas très long et c'est toujours mieux de rester explicite :) Là ton script n'est pas encore trop grand mais imagine que tu aies 500 lignes et qu'on ne voit plus l'import, quelqu'un qui voit juste rd ne saura pas forcément de quel module il s'agit.
  • Je crois que je ne l'explique pas suffisamment bien et il me semble moi-même faire l'erreur dans les vidéos (donc mea culpa de ma part !) mais les constantes (variables en majuscules) devraient être réservées aux variables qui ne changent pas. Donc dans ton cas par exemple uniquement la variable CHOIX et TOUR car la vie des joueurs et les potions changent.
  • En attendant d'utiliser des fonctions pour éviter certaines répétitions de code, je te conseille de rajouter quelques lignes vides pour aérer un peu le code est les différents blocs (par exemple entre l'attaque du joueur et l'attaque de l'ennemi). Ça aide à plus rapidement lire ton code quand on ne le connait pas :)


Voilà pour les principaux points que j'observe, le reste c'est très bien ! Je laisse les autres te faire des retours s'ils en voit également :)


Bonne continuation !

Gabriel Trouvé

Mentor

Pour les variables en majuscules je n'étais pas sûr de moi. Du coup merci c'est très clair.


Merci pour tes remarques, je vais me les copier dans un coin de mon Onedrive pour me faire un mémo et bien appliquer tout ça !


Bonne soirée à toi !

Bonsoir Gabriel,


Juste une remarque sur le :

else:
    continue

à la fin, il ne sert à rien

à la place tu pourrais faire quelque chose comme ça :

choix_joueur = input(TOUR)
if choix_joueur not in CHOIX:
    continue


Et au passage, une petite question pour Thibault

J'utilise souvent cette syntaxe pour déclarer des constantes :

DAMAGE_ENEMY = "Tu as infligé {} points de dégats ⚔"
DAMAGE_PLAYER = "L'enemi t'a infligé {} points de dégats ⚔"
PRINT_PV = "Il te reste {} point{} de vie\nIl reste encore {} point{} de vie à l'enemi"

MENU = """Que veux tu faire ?

1. Attaquer

2. Prendre une potion ({} 🧪 restante{})
Ton choix -> """

LIST_CHOICE = ["1", "2"]

END_GAME = "{}, tu as {} {}\nFin du jeu !!!"

En faisant cela, je peux par la suite faire un print de la constante avec une méthode format :

user_choice = input(MENU.format(nb_potions, 's' if nb_potions > 1 else ""))

Est ce que MENU est toujours considéré comme une constante avec les accolades ou plutôt comme une variable

Thibault houdon

Mentor

Salut Romuald !


Très bonne idée effectivement d'utiliser format de cette façon, j'en parle d'ailleurs dans un article ou une formation il me semble, ça reste un des derniers cas d'usage intéressant de cette méthode :)


Dans ce cas MENU est bien une constante car elle ne change pas. En règle général, une chaîne de caractères est de toute façon toujours "constante" par définition car c'est un objet immuable. Quand tu utilises la méthode format tu ne modifies donc pas la variable mais tu crées un nouvel objet.


Ce ne serait pas le cas par exemple pour une liste : si tu modifies la liste à un endroit dans ton script, ça va modifier ta liste d'origine et donc elle ne sera pas "constante".


Très bonne continuation à vous deux !

D'accord, dans la plupart des cas, j'utilise les f-string

Mais dans certains cas, comme ici, j'utilise la méthode format


Merci pour ton retour

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.