Aller au contenu

Jeu par tour

Dans un jeu de stratégie au tour par tour, les joueurs dirigent des équipes de guerriers qui vont se combattre. Un guerrier est connu par son nom et est caractérisé par:

  • ptsVie : ses points de vie, qu'il perd au fur et à mesure des combats;

  • force : sa force, qui détermine la puissance des coups qu'il porte à ses adversaires;

  • adresse : son adresse, qui détermine son habileté à atteindre son adversaire, (valeur entre 0 et 100);

  • nbCoups : le nombre de coups qu'il peut porter lors d'une attaque;

  • armure : son armure, qui le protège et atténue les coups qu'il reçoit, (valeur entre 0 et 100).

Nous modéliserons un guerrier en python par un dictionnaire dont les clés prendront les valeurs ptsVie, force, adresse, nbCoups, armure.

Exemples :

>>>helmut={'ptsVie':100,'force':6,'adresse':75,'nbCoups':3,'armure':30}
>>>olga={'ptsVie':98,'force':8,'adresse':90,'nbCoups':2,'armure':35}
>>>irina={'ptsVie':100,'force':2,'adresse':55,'nbCoups':2,'armure':20}
>>>boris={'ptsVie':100,'force':3,'adresse':30,'nbCoups':3,'armure':15}
  1. Proposez la fonction est_vivant() qui teste si un guerrier donné en paramètre est vivant ou non.

    >>> est_vivant(helmut)
    >>> `True`
    

    Lorsqu'un guerrier donne un coup à un adversaire, la valeur du coup est celui de sa force. Néanmoins, il faut d'abord déterminer si l'adversaire sera atteint. Cette possibilité est tirée au hasard, avec une probabilité de réussite indiquée par l'adresse qui est un pourcentage de chance de réussir. Un guerrier mort, ou un guerrier qui n'atteint pas son adversaire, porte un coup d'une force nulle.

  2. Proposez la fonction donne_un_coup() qui retourne la valeur du coup porté par un guerrier donné.

    >>> donne_un_coup(olga)
    >>> 0                     # olga a raté sa cible
    >>> donne_un_coup(olga)
    >>> 8                     # olga a atteint sa cible
    

    Lorsqu'un guerrier reçoit un coup, son armure le protège. La valeur de son armure est appliquée comme un pourcentage de coefficient de protection sur la force du coup reçu. Ainsi, un guerrier qui reçoit un coup de 5 points, mais qui a une armure avec un coefficient de protection de 20%, voit diminuer ses points de vie de 4 points seulement.

  3. Proposez la fonction prend_un_coup() qui, pour un guerrier et une force de coup donnés, diminue les points de vie du guerrier (et le retourne). Un guerrier ne peut jamais avoir des points de vie négatifs.

    >>> prend_un_coup(helmut,8)
    >>> print(helmut)
    >>> {'ptsVie': 94, 'force': 6, 'adresse': 75,'nbCoups': 3, 'armure': 30}
    >>> # 30% de 8 est arrondi à 2, 8-2 : 6 points sont enlevés
    

    Lors d'une attaque d'un guerrier sur un autre, le premier guerrier porte ses nbCoups au deuxième, puis, si le deuxième est encore vivant, c'est à son tour de donner des coups au premier.

  4. Proposez la fonction attaque() qui gère l'attaque de deux guerriers donnés.

    On constitue maintenant des équipes de guerriers. Une équipe de guerriers est représentée par un dictionnaire dont les clés sont les noms des guerriers et les valeurs des guerriers comme définis ci-dessus.

    Exemples :

    >>> winners = {'Helmut':helmut, 'Olga':olga}
    >>> loosers = {'Irina':irina, 'Boris':boris}
    
  5. Proposez une fonction moyenne_caracteristique() qui calcule la moyenne des valeurs des guerriers d'une équipe sur une caractéristique.

    >>> moyenne_caracteristique(winners,'ptsVie')
    >>> 96
    >>> moyenne_caracteristique(winners,'force')
    >>> 7
    
  6. Proposez la fonction les_plus() qui retourne la liste des noms des guerriers qui ont la plus grande valeur pour une caractéristique et une équipe données.

    >>> les_plus(winners,'ptsVie')
    >>>'Olga'
    >>> les_plus(winners,'force')
    >>>'Helmut'