Résolue

Revue de code Gabin

# Fonctions # Correction de code # Variables

Hello,

je remets ici le code de Gabin qui l'avait posté sur Discord et demandait un retour:

import random
import sys 

health_player = 50
health_ennemy = 50
number_potion_health = 3
next_level = False
up_round = False
relaunch_s = False
start = True
INTER_LIGNE = ("-" * 50)



def launch(start, INTER_LIGNE):

    while True:
        print(INTER_LIGNE)
        start_choice = input("Voulez vous lancer le jeu ?\nEntrer 1 pour jouer, ou 2 pour ne pas jouer : ")

        while start == True:

            if start_choice == "1":
                print("Vous lancez le jeu.")
                print(INTER_LIGNE)
                game(health_player, health_ennemy, number_potion_health, next_level, up_round, relaunch_s, INTER_LIGNE)

            elif start_choice == "2":
                print(INTER_LIGNE)
                print("Vous ne voulez pas lancer le jeu.")
                print(INTER_LIGNE)
                sys.exit(0)

            else:
                print("Veuillez entrer un choix valide.")
                break

def regle (INTER_LIGNE):
    print("""Voici les règles du jeu : 
-Le jeu comporte deux joueurs : vous et un ennemi.
-Vous commencez tous les deux avec 50 points de vie.
-Votre personnage dispose de 3 potions qui vous permettent de récupérer des points de vie.
-L'ennemi ne dispose d'aucune potion.
-Chaque potion vous permet de récupérer un nombre aléatoire de points de vie, compris entre 15 et 50.
-Votre attaque inflige à l'ennemi des dégâts aléatoires compris entre 5 et 10 points de vie.
-L'attaque de l'ennemi vous inflige des dégâts aléatoires compris entre 5 et 15 points de vie.
-Lorsque vous utilisez une potion, vous passez le prochain tour.

Note :

À chaque tour, vous attaquez en premier. Il ne peut donc pas y avoir de match nul. Si lorsque vous attaquez, votre attaque fait descendre les points de vie de l'ennemi en dessous (ou égal à) 0, vous gagnez la partie sans que l'ennemi n'ait le temps de vous attaquer en retour.""")
    print(INTER_LIGNE)


def relaunch(relaunch_s, INTER_LIGNE):

    while True:

        relaunch_choice = input("Souhaitez vous rejouer ?\nEntrer 1 pour rejouer, ou 2 pour quitter le jeu : ")

        while relaunch_s == True:

            if relaunch_choice == "1":
                print("Vous venez de relancer la partie.")
                print(INTER_LIGNE)
                game(health_player, health_ennemy, number_potion_health, next_level, up_round, relaunch_s, INTER_LIGNE)

            elif relaunch_choice == "2":
                print("Vous quitter le jeu.")
                print(INTER_LIGNE)
                sys.exit()

            else:
                print("Veuillez entrer un choix valide.")
                print(INTER_LIGNE)
                break


def game(health_player, health_ennemy, number_potion_health, next_level, up_round, relaunch_s, INTER_LIGNE):

    regle(INTER_LIGNE)

    while True:

        potion_health = random.randint(15, 50)
        attack_player = random.randint(5, 10)
        attack_ennemy = random.randint(5, 15)

        user_choice = input("Souhaitez-vous attaquer (1) ou utiliser une potion (2) ? ")


        while up_round == False:

            if user_choice == "1": #attack_player

                health_ennemy = health_ennemy - attack_player
                print(f"Vous avez infligé {attack_player} points de dégats à l'ennemi")
                next_level = True
                up_round = False
                break


            elif user_choice == "2": #potion
                number_potion_health = number_potion_health - 1

                if number_potion_health < 0: #plus de potion

                    print("Vous n'avez plus de potions")
                    print(INTER_LIGNE)
                    next_level = False
                    up_round = False
                    break

                elif number_potion_health >= 0: #utilisation potion

                    health_player = health_player + potion_health
                    print(f"Vous récupérez {potion_health} points de vie ({number_potion_health} restantes)")
                    next_level = True
                    up_round = True
                    break

                else: #gestion erreur

                    print("Veuillez entrer un choix valide")
                    print(INTER_LIGNE)
                    next_level = False
                    up_round = False
                    break

            else: #gestion erreur

                print("Veuillez entrer un choix valide")
                print(INTER_LIGNE)
                next_level = False
                up_round = False
                break

        if next_level == True: #Passez au prochain niveau

            health_player = health_player - attack_ennemy
            print(f"L'ennemi vous a infligé {attack_ennemy} points de dégats")
            print(f"Il vous reste {health_player} points de vie.")
            print(f"Il reste {health_ennemy} points de vie a l'ennemi.")
            print(INTER_LIGNE)

        if up_round == True and next_level == True: #Quand potion utilisé

            health_player = health_player - attack_ennemy
            print("Vous passez votre tour ...")
            print(f"L'ennemi vous a infligé {attack_ennemy} points de dégats")
            print(f"Il vous reste {health_player} points de vie.")
            print(f"Il reste {health_ennemy} points de vie a l'ennemi.")
            print(INTER_LIGNE)

            up_round = False

        if health_ennemy <= 0: #WIN
            print("Vous avez gagné")
            print(INTER_LIGNE)

            relaunch_s = True
            #relaunch_choice = input("1, rejouer. 2, quitter")
            relaunch(relaunch_s, INTER_LIGNE)

        elif health_player <= 0: #LOOSE
            print("Tu as perdu")
            print(INTER_LIGNE)

            relaunch_s = True
           # relaunch_choice = input("1, rejouer. 2, quitter")
            relaunch(relaunch_s, INTER_LIGNE)


launch(start, INTER_LIGNE)

Gabin,

ton code est déjà bien structué, c'est déjà top. Quelques remarques sur ton code:

  1. Variables globales : Il y a plusieurs variables globales qui sont passées en paramètre de fonctions où elles ne sont pas modifiées. Ça peut être simplifié en les utilisant directement dans les fonctions plutôt que de les passer en paramètre.

  2. Boucles infinies : Tu utilises while True: sans condition de sortie explicite dans certaines fonctions. C'est mieux d'avoir une condition de sortie claire. Dans launch, par exemple, au lieu de while True, on pourrait utiliser while not start et modifier start lorsque le jeu démarre ou s'arrête.

  3. Instructions répétées : Dans le corps de la fonction game(), il y a beaucoup de duplications de code pour l'affichage des messages. Dès que tu voies que tu copie colles ton code à plusieurs endroits ça doit être un indice qu'il y a surmeent une fonction à faire. Tu dois être "DRY" : Don't Repeat Yourself . C'est une rêgle d'or =D.

  4. Structuration du code : Il y a des fonctions qui semblent faire trop de choses en même temps, comme la fonction game(). Cela pourrait être refactorisé en séparant les logiques de jeu en plusieurs fonctions plus petites et spécialisées. Il faut essayer de prendre l'habitude de se dire "une fonction = une action" sinon ça devient très compliqué à debugger.

  5. Gestion des sorties du jeu : L'utilisation de sys.exit() coupe brusquement le jeu. C'est un peu bourrin =D et le suer va penser qu'il y a eu un bug. C'est mieux de proposer au joueur de revenir au menu principal.

  6. Structure des conditionnelles : La condition elif number_potion_health >= 0: dans game() est un peu étrange car si le nombre de potions est inférieur à zéro, le bloc précédent est déjà exécuté. Peut-être une petite erreur de logique là.

  7. Enchaînement des fonctions : À la fin de la fonction game(), tu appelles direct relaunch(). Tu pourrais considérer de retourner au menu principal permettant au joueur de choisir de recommencer ou de quitter d'une manière plus "propre".

  8. Autre: c'est personnel mais je n'aime pas trop une fonction qui ne sert qu'à faire un print. Si tu veux vraiment utiliser une fonction pour ça fait plutot un return de tes chaînes de caractères. Une fonction pure retourne un resultat ou modifie un paramêtre, ou fait un calcul. C'est plus "clair".

à ta dispo si besoin.

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.