Connection Menu Contenu

1788
membres
00h52
06
février
2012

Pseudo

Mot de passe

Accueil FORUM
repère : ROMMY Prod > Le tutoriel PYTHON > Exercices - chapitre 1 à 5 > Correction : Un Role Playing Game

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 : 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.

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.

chapitre precedent sommaire L'énoncé
repère : ROMMY Prod > Le tutoriel PYTHON > Exercices - chapitre 1 à 5 > Correction : Un Role Playing Game
Qui suis-je ? Contact Charte du site
Plan du site Accessibilité du site

Copyright © ROMMY Production
Le cours, les jeux et les logiciels sont la propriété de son auteur.
Toute reproduction totale ou partielle du cours est interdite sans l'accord de l'auteur.
La modification des jeux et logiciels est interdite sans l'accord de l'auteur.