1. Graf d’un joc de rol

En un joc de rol, hem representat les diferents zones de l’escena i la forma com estan connectades mitjançant un graf simètric de NetworkX les zones són els nodes graf, i una aresta des de a fins a b indica que els jugadors poden anar de la zona a a la zona b. Cada aresta del graf manté informació per saber com es passa d’una zona a l’altra (amb una carretera, un pont, una porta, etc). A tal fi, les arestes sempre tenen associat l’atribut de nom connexio Per exemple, la següent figura representa una escena d’un joc amb nou zones:

../../../../_images/graf-jrol2.svg

1.1. Funció nova_connexio (2 punts)

Al fitxer connecta.py (mòdul connecta), escriviu-hi la funció següent:

connecta.nova_connexio(g, z1, z2, t)
Paràmetres:
  • g (Graph) – graf de l’escena d’un joc de rol

  • z1 (str) – nom d’una zona de l’escena

  • z2 (str) – nom d’una zona de l’escena

  • t (str) – nom del tipus de connexió

Afegeix una connexió de tipus t entre les zones z1 i z2 de g. Si alguna de les dues zones no pertany a g s’hi afegeix. Si ja hi havia una connexió entre les dues zones però l’atribut no conté l’string t, s’afegeix el tipus de connexió al final de l’atribut separat per '/'. Si l’atribut ja conté l’string t no es fa res.

Per exemple,

>>> import networkx as nx
>>> from connecta import nova_connexio

>>> dd = {'taberna': {'poble': {'connexio': 'porta'}},'poble': {'prat': {'connexio': 'camí'}, 'platja': {'connexio': 'carretera'}, 'taberna': {'connexio': 'porta'}, 'bosc': {'connexio': 'pont'}}, 'cova': {'platja': {'connexio': 'roques'}}, 'platja': {'prat': {'connexio': 'camí'}, 'poble': {'connexio': 'carretera'}, 'cova': {'connexio': 'roques'}, 'vaixell': {'connexio': 'barca'}}, 'vaixell': {'platja': {'connexio': 'barca'}}, 'prat': {'bosc': {'connexio': 'carretera'}, 'poble': {'connexio': 'camí'}, 'platja': {'connexio': 'camí'}}, 'bosc': {'muntanya': {'connexio': 'carretera'}, 'prat': {'connexio': 'carretera'}, 'poble': {'connexio': 'pont'}}, 'muntanya': {'bosc': {'connexio': 'carretera'}}, 'castell': {}}
>>> g = nx.Graph(dd)  # crea el graf de l'exemple

>>> nova_connexio(g, 'vaixell', 'castell', 'escala')
>>> g['castell']
AtlasView({'vaixell': {'connexio': 'escala'}})
>>> nova_connexio(g, 'bosc', 'riu', 'camí')
>>> g['bosc']['riu']
{'connexio': 'camí'}
>>> nova_connexio(g, 'vaixell', 'platja', 'nedant')
>>> g['platja']['vaixell']
{'connexio': 'barca/nedant'}

Disposeu d’un joc de proves al fitxer tests-connexio.txt.

1.2. Funció longituds_camins (2 punts)

Al fitxer longs.py (mòdul longs), escriviu-hi la funció següent:

longs.longituds_camins(g, z1, z2)
Paràmetres:
  • g (Graph) – graf de l’escena d’un joc de rol

  • z1 (str) – nom d’una zona de l’escena

  • z2 (str) – nom d’una segona zona de l’escena (diferent de z1)

Retorna:

Conjunt de les longituds de tots els camins simples possibles que van de la zona z1 a la zona z2 en g. Un camí simple és un camí que no passa dues vegades pel mateix node; la seva longitud és el nombre d’arestes que té.

Tipus de retorn:

set d’enters positius

Per exemple,

>>> import networkx as nx
>>> from longs import longituds_camins

>>> dd = {'taberna': {'poble': {'connexio': 'porta'}},'poble': {'prat': {'connexio': 'camí'}, 'platja': {'connexio': 'carretera'}, 'taberna': {'connexio': 'porta'}, 'bosc': {'connexio': 'pont'}}, 'cova': {'platja': {'connexio': 'roques'}}, 'platja': {'prat': {'connexio': 'camí'}, 'poble': {'connexio': 'carretera'}, 'cova': {'connexio': 'roques'}, 'vaixell': {'connexio': 'barca'}}, 'vaixell': {'platja': {'connexio': 'barca'}}, 'prat': {'bosc': {'connexio': 'carretera'}, 'poble': {'connexio': 'camí'}, 'platja': {'connexio': 'camí'}}, 'bosc': {'muntanya': {'connexio': 'carretera'}, 'prat': {'connexio': 'carretera'}, 'poble': {'connexio': 'pont'}}, 'muntanya': {'bosc': {'connexio': 'carretera'}}, 'castell': {}}
>>> g = nx.Graph(dd)  # crea el graf de l'exemple

>>> longituds_camins(g, 'cova', 'vaixell')
{2}
>>> longituds_camins(g, 'platja', 'bosc') == {2, 3}
True
>>> longituds_camins(g, 'prat', 'platja') == {1, 2, 3}
True

Disposeu d’un joc de proves al fitxer tests-longituds.txt.