Jeu de rôle textuel en 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 ;)
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte