Classe Personatge ================= .. py:module:: personatge La classe :py:class:`Personatge` representa un personatge d'un joc de rol. Un personatge té un nom, un nombre de vides i una sèrie de característiques com el seu nivell de força i de màgia. Vegeu-ne l'especificació. .. py:class:: Personatge(nom, nvides) Construeix un personatge a partir dels paràmetres donats .. rubric:: Atributs .. py:attribute:: nom Nom del personatge (:py:class:`str`) .. py:attribute:: vides Nombre de vides (:py:class:`int`) Aquesta classe ha de suportar les **operacions** següents: +--------------------------+----------------------------------------------------+ | Operació | Resultat | +==========================+====================================================+ | ``p[c]`` | Retorna el valor de la característica `c` | | | del personatge `p`. Si el personatge no té | | | la característica c, retorna -1. | +--------------------------+----------------------------------------------------+ | ``p[c] = v`` | Assigna el valor `v` a la característica `c` | | | Si el personatge no té la característica `c`, la | | | crea i sinó reemplaça el seu valor | +--------------------------+----------------------------------------------------+ Aquesta classe ha de suportar la funció `len` que retorna el nombre de característiques del personatge. Els atributs :attr:`nom` i :attr:`vides` s'inicialitzen a partir dels paràmetres de la instanciació. La classe té un atribut **privat**, un diccionari que associa un valor a cada característica del personatge. En crear-se la instància, aquest atribut és un diccionari buit. Vegeu un exemple de funcionament de la classe: .. literalinclude:: test-personatge.txt :language: python Implementeu la classe :py:class:`Personatge` en el fitxer :file:`personatge.py`. Disposeu de jocs de proves al fitxer :download:`test-personatge.txt` i d'una solució a :download:`personatge.py`. Funció Combat ------------- .. py:module:: combat Els personatges lluiten entre ells en combats de força, d'astúcia, de màgia, o altres característiques. El guanyador del combat és el personatge que té més punts de la característica del combat. Si els dos personatges tenen el mateix valor hi ha empat i els dos personatges no es modifiquen. Sinó, al guanyador se li suma una vida i al perdedor se li en resta una. En el fitxer :file:`combat.py` dissenyeu la funció següent: .. py:function:: combat(pers1, pers2, carac)` Aquesta funció rep dues instaǹcies de la classe :py:class:`Personatge` i un :py:class:`str` que representa la característica en joc i modifica, si escau, les vides dels personatges d'acord amb el resultat del combat. Tingueu en compte que el nombre de vides mai no pot ser negatiu. Vegeu el comportament esperat de la funció: .. literalinclude:: test-combat.txt :language: python :end-before: --fi-enunciat Disposeu de jocs de proves al fitxer :download:`test-combat.txt` i d'una solució a :download:`combat.py`. Classe Comerciant ----------------- .. py:module:: comerciant La classe :py:class:`Comerciant` es deriva per herència de la classe :py:class:`Personatge`. Té un atribut addicional: el nombre de monedes d'or amb les que poden comprar i vendre vides. Vegeu-ne l'especificació: .. py:class:: Comerciant(nom, nvides, nmonedes) Construeix un comerciant a partir dels paràmetres donats .. rubric:: Atributs de classe .. py:attribute:: valor_vida Nombre de monedes d'or que val una vida (inicialment 5) .. rubric:: Atributs (a més dels de la classe base) .. py:attribute:: monedes Nombre de monedes d'or del personatge (:py:class:`int`) .. rubric:: Mètodes (a més dels de la classe base) .. py:method:: comprar_vides(n) Compra n vides a canvi de monedes d'or si en té prou. Altrament, no compra res. Vegeu un exemple de funcionament de la classe: .. literalinclude:: test-comerciant.txt :language: python :end-before: --fi-enunciat Implementeu la classe :py:class:`Comerciant` en el fitxer :file:`comerciant.py`. Disposeu de jocs de proves al fitxer :download:`test-comerciant.txt` i d'una solució a :download:`comerciant.py`.