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