Corrections - chapitre 1 à 5
Comme j'ai dit lors de la présentation des exercices, il existe beaucoup de façon pour programmer.
Je vais donc corriger avec ma méthode mais si vous avez codé différemment et que vous avez le même
résultat, ne modifié pas votre code pour prendre le mien.
Un RPG
Bon pour ce jeu, j'ai décidé d'expliquer en séparant mon code. Je vous donne l'ensemble puis
je détaillerai le code en expliquant les fonctions une à une.
Voici donc l'ensemble du code (j'ai volontairement enlevé l'intérieur des fonctions pour que vous
voyez plus facilement le fonctionnement):
# -*- coding: cp1252 -*-
## rpg.py
## -------------
## Réaliser par ROMMY.P le 2/08/2007
## Pour le tutoriel du site ROMMY Production "http://rommyprod.redby.info"
import random
# change d'arme en changeant le nom
def changer_arme():
return "Epée en fer"
# retourne les HP avec un soin de 50HP sans dépasser la limite maxi
def soigner(point_HP):
...
# retourne le nombre de dégâts causés par l'arme
def degat_arme(nom):
...
# retourne les HP de la victime après avoir reçue les dégâts.
def attaquer(nom_attaquant, arme_attaquant, force_attaquant, nom_victime, HP_victime):
...
# menu permettant de choisir une action
def menu_combat():
...
HP_ennemis = 100
HP = 100
fuir =
False
force_ennemis = 1
force_perso = 2
nom_arme_ennemis =
"Epée en fer"
nom_arme =
"Baton en bois"
nom_ennemis =
"El Brutos"
nom_perso =
raw_input(
"entrez le nom du personnage : ")
print
"\nAttention", nom_perso,
"!!!", nom_ennemis,
"vous force à vous battre."
while HP_ennemis > 0
and HP > 0
and not fuir:
HP = attaquer(nom_ennemis, nom_arme_ennemis, force_ennemis, nom_perso, HP)
if HP > 0 :
menu_combat()
if HP_ennemis <= 0 :
print "\nbravo, vous avez gagné le combats"
elif HP <= 0 :
print "\nDésolè, vous n'étiez pas assez fort pour vous défendre"
if fuir :
print "\nBouhhh !!! c'est une honte de fuir"
Vous pouvez aussi télécharger
le code source
Le programme en lui-même (+ fonction changer_arme)
import random
# change d'arme en changeant le nom
def changer_arme():
return "Epée en fer"
.
.
.
HP_ennemis = 100
HP = 100
fuir = False
force_ennemis = 1
force_perso = 2
nom_arme_ennemis = "Epée en fer"
nom_arme = "Baton en bois"
nom_ennemis = "El Brutos"
nom_perso = raw_input("entrez le nom du personnage : ")
print "\nAttention", nom_perso, "!!!", nom_ennemis, "vous force à vous battre."
while HP_ennemis > 0 and HP > 0 and not fuir:
HP = attaquer(nom_ennemis, nom_arme_ennemis, force_ennemis, nom_perso, HP)
if HP > 0 :
menu_combat()
if HP_ennemis <= 0 :
print "\nbravo, vous avez gagné le combats"
elif HP <= 0 :
print "\nDésolè, vous n'étiez pas assez fort pour vous défendre"
if fuir :
print "\nBouhhh !!! c'est une honte de fuir"
Alors, ce programme commence par l'importation du module random, car on aura besoin d'un nombre
aléatoire pour la fonction degat_arme. (si vous n'avez pas fait cette amélioration, ceci ne doit pas
être présent dans le code).
Ensuite il y a les autres fonctions que je détaillerais plus tard.
Et on commence à attaquer le début du programme en initialisant toutes les variables utiles :
- HP_ennemis : Ce sont les points de vie de l'ennemi. Il commence avec le maximum, c'est-à-dire
100.
- HP : Ce sont les points de vie de votre personnage. Il commence avec le maximum, c'est-à-dire
100.
- fuir : Permet de savoir si vous avez fuit. C'est un booléen, elle prend donc comme valeur soit
True, soit False.
- force_ennemis : Ce sont les points de force de l'ennemi. Il en a 1.
- force_perso : Ce sont les points de force de votre personnage. Il en a 2 car il est plus fort.
- nom_arme_ennemis : c'est le nom de l'arme de votre ennemi.
- nom_arme : c'est le nom de l'arme de votre personnage.
- nom_ennemis : c'est le nom de votre ennemi.
- nom_perso : c'est le nom de votre personnage. Vous lui demandé car c'est toujours plus
intéressant quand c'est personnalisable.
Ensuite on programme le combat en lui-même après l'avoir annoncé au joueur.
Pour que l'on puisse combattre, il faut que les deux personnages soient vivants. C'est pour cela que
j'ai mis "
HP_ennemis > 0 and HP > 0" dans la condition. Mais il faut aussi que le joueur
n'ait pas quitté le combat en fuyant (que j'ai codé avec "
and not fuir").
Donc si ces conditions sont vraies, on fait une attaque de l'ennemi qui enlève des HP à votre
personnage. Pour cela on utilise la fonction "attaquer" que je vous expliquerai plus tard. Cette
fonction renvoie les HP de la victime après avoir reçue l'attaque, c'est pour cela que j'ai mis
"HP = ...".
Ensuite c'est au tour du joueur. S'il n'est pas mort de l'attaque précédente, on lui propose plusieurs
actions possibles. Pour cela on utilise la procédure "menu_combat" que l'on a créé.
Si on est sorti de la boucle, on doit savoir pour quelle raison. Alors on fait des tests :
- HP_ennemis <= 0 : Si cette condition est vraie, c'est que l'ennemi est mort.
- HP <= 0 : Si cette condition est vraie, c'est vous êtes mort.
- fuir : C'est que vous ne voyer pas la victoire donc vous avez préféré fuir le combat.
La procédure menu_combat
# menu permettant de choisir une action
def menu_combat():
global fuir, HP, HP_ennemis, nom_arme
print "\n1. Attaquer"
print "2. Se soigner (50 HP)"
print "3. Changer d'arme"
print "4. Fuir"
choix = input("appuyer sur le chiffre pour réaliser l'action : ")
if choix == 1:
HP_ennemis = attaquer(nom_perso, nom_arme, force_perso, nom_ennemis, HP_ennemis)
elif choix == 2:
HP += soigner(HP)
print "Vous avez maintenant", HP, "HP"
elif choix == 3:
nom_arme = changer_arme()
elif choix == 4:
fuir = True
else :
menu_combat()
Cette procédure sert à proposer au joueur plusieurs actions.
On commence par
transformer les variables utiles en globales pour pouvoir les modifier.
Puis on
affiche le menu
Ensuite on
demande le numéro de l'action qui désire effectuer.
On étudie son choix.
- S'il tape 1 : on attaque l'ennemi, on utilise la fonction de la même manière que pour
l'attaque de l'ennemi sauf que les paramètres ont changés.
- S'il tape 2 : On rajoute des HP au personnage avec la fonction "soigner".
- S'il tape 3 : On change d'arme avec la fonction "changer_arme"
- S'il tape 4 : On quitte le combat en changeant la valeur de la variable "fuir"
- S'il tape autre chose : On relance le menu
La fonction soigner
# retourne les HP avec un soin de 50HP sans dépasser la limite maxi
def soigner(point_HP):
if point_HP+50 > 100 :
return 100 - point_HP
else :
return 50
Cette fonction redonne des points de vie à votre personnage, mais il faut faire attention à ne pas
dépasser la limite. Car il est impossible d'avoir plus de HP que le maximum que l'on peut avoir.
J'ai décidé de fixer le maximum à 100.
Donc pour ne pas dépasser, on test
si le nombre de points actuel plus 50 HP dépasse 100. Si
c'est le cas, on
retourne le maximum moins les points actuels, comme ça on ajoute ce qui manque
pour atteindre le maximum.
Si ce n'est pas le cas,
on retourne 50. Ce qui fait qu'il aura 50 HP de plus.
La fonction degat_arme
# retourne le nombre de dégâts causés par l'arme
def degat_arme(nom):
chance = random.uniform(0, 2) # facteur aléatoire (nombre décimal)
if nom == "Baton en bois" :
return int(chance*5)
elif nom == "Epée en fer" :
return int(chance*6)
La fonction retourne les dégâts que cause l'arme du personnage.
Ici j'ai mis la correction avec l'amélioration qui est qu'un facteur aléatoire joue un rôle dans la
quantité de dégâts donnés. Ce facteur pourra dans des cas extrêmes annuler (si égale à 0) ou doubler
(si égale à 2). Sinon il augmentera ou diminuera ce nombre.
Alors je
récupère un nombre compris entre 0 et 2. Cette fois si j'utilise la fonction "uniform"
du module "random" au lieu de la fonction "choice" car je veux un nombre à virgule et non un nombre
entier.
Ensuite je
regarde quelle arme a le personnage en comparant le paramètre avec le nom d'une des
armes.
Si l'arme s'appelle "Baton en bois", on retourne le nombre aléatoire fois le nombre de dégâts (ici j'ai
décidé que cette arme causée 5 points de dégâts). Comme cette multiplication donne un chiffre à
virgule et que l'on ne peut pas enlever par exemple 1.5 HP, on le transforme en entier avec la
fonction "int" et on obtiendra 2HP.
Par contre si son nom est "Epée en fer", elle cause 6 points fois le nombre aléatoire.
La fonction attaquer
# retourne les HP de la victime après avoir reçue les dégâts.
def attaquer(nom_attaquant, arme_attaquant, force_attaquant, nom_victime, HP_victime):
degats = force_attaquant*degat_arme(arme_attaquant)
HP_victime -= degats
if HP_victime > 0:
print nom_attaquant, "enleve", degats, "points de vie à", nom_victime, ".",
print nom_victime, "a maintenant", HP_victime, "HP"
else :
print nom_attaquant, "enleve", degats, "points de vie à", nom_victime
return HP_victime
On commence à
calculer le nombre de dégâts que l'on va enlever à la victime, en fonction de la
force et de l'arme de l'attaquant. Pour les dégâts de l'arme, on utilise la fonction que l'on a créée.
Ensuite ou
enlève les dégâts aux points de vie de la victime.
Après si la victime n'est pas morte, on affiche
combien de points sont enlevés à la victime et
combien il lui en reste. (J'ai mis deux print pour que la ligne de code ne soit pas trop longue.
Par contre lors de l'affichage, le texte est en une ligne car j'ai mis une virgule en fin de print.)
Sinon on
affiche seulement le nombre de points que la victime à perdu.
Et on termine par envoyer les HP de la victime après avoir reçu l'attaque.