Résolue

Jeu de rôle textuel en Python

# Orienté objet # Exercices # Python

Just for fun

Un petit exercice que j'avais fait il y a longtemps, le Jeu de rôle, que j'ai encapsulé dans une classe, just for fun :

"""Jeu de rôle textuel dans le terminal"""

from random import randint


class CONSTANTS:
    ENEMY_HEALTH = PLAYER_HEALTH = 50
    POTIONS = 3
    SKIP_TURN = False
    USER_ATTACK, ENEMY_ATTACK = (5, 10), (5, 15)


class RolePlay:

    def __init__(self):
        self.enemy_health = CONSTANTS.ENEMY_HEALTH
        self.player_health = CONSTANTS.PLAYER_HEALTH
        self.potion = CONSTANTS.POTIONS
        self.skip_turn = CONSTANTS.SKIP_TURN
        self.user_choice = None

    def __str__(self):
        return f"{self._game()}\nFin du jeu"

    @staticmethod
    def _pass_turn():
        print("Vous passez votre tour")
        return CONSTANTS.SKIP_TURN

    def _attack(self, attacked):
        if attacked == self.enemy_health:
            attack = randint(*CONSTANTS.USER_ATTACK)
            self.enemy_health -= attack
            last_msg = f"\nIl lui reste {self.enemy_health} points de vie." if self.enemy_health > 0 else ""
            print(f"Vous avez infligé {attack} de dégâts à l'ennemi.{last_msg}")
        else:
            attack = randint(*CONSTANTS.ENEMY_ATTACK)
            self.player_health -= attack
            last_msg = f"\nIl vous reste {self.player_health} points de vie." if self.player_health > 0 else ""
            print(f"L'ennemi vous a infligé {attack} de dégâts.{last_msg}")
        print("-" * 50)
        return CONSTANTS.SKIP_TURN

    def _game(self):
        while True:
            self.skip_turn = self._pass_turn() if self.skip_turn else self._game_player()
            if self.enemy_health < 0:
                return "Vous avez gagné"
            self.skip_turn = self._attack(self.player_health)
            if self.player_health < 0:
                return "Vous avez perdu"
            self.user_choice = None

    def _game_player(self):
        while self.user_choice not in ("1", "2"):
            self.user_choice = input("Souhaitez-vous attaquer (1) ou utiliser une potion(2) ? ")
        return self._attack(self.enemy_health) if self.user_choice == "1" else self._potion()

    def _potion(self):
        if self.potion > 0:
            potion_health = randint(15, 50)
            self.player_health += potion_health
            self.potion -= 1
            print(f"Vous récupérez {potion_health} points de vie ({self.potion} potion(s) restante(s)).")
            return True
        print("Vous n'avez plus de potion... Vous attaquez donc l'ennemi...")
        return self._attack(self.enemy_health)


if __name__ == "__main__":
    print(RolePlay())

Comme tu le dis en préambule, il n'y a pas qu'une seule façon de faire.
J'ai pris quelques libertés avec l'affichage, et au passage, j'ai modifié un point du déroulé du jeu, à savoir que si le joueur n'a plus de potion, et bien il passe directemet en mode attaque après que lui soit signalé qu'il n'a plus de potion à disposition.
Bon, il y aurait encore certainement des améliorations à proposer... et des fonctionnalités autres à proposer...

Sinon, toujours sympas tes exercices, y compris plusieurs mois après ;)

Gabriel Trouvé

Mentor

J'ai refais l'exercice aussi en POO à l'époque. J'adore !

Résultat : Je me retrouve à le pousser avec Django ahah.

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.