Catan, tot 2014 De kolonisten van Catan, is een bordspel voor 3 tot 6 spelers, bedacht door Klaus Teuber en uitgebracht in 1995. Elke speler is een kolonist op het eiland Catan. Tijdens het spel ontvangen de spelers grondstoffen waarmee ze straten, dorpen en steden kunnen bouwen. Overwinningspunten houden de voortuitgang van een speler bij en kunnen spelers op verschillende wijzen verdienen. Twee zeszijdige dobbelstenen bepalen de grondstoffenopbrengst. De speler die als eerste het benodigde aantal overwinningspunten heeft verzameld, wint.

Kolonisten van Catan
Kolonisten van Catan

Tijdens het spel kan je volgende grondstoffen ontginnen:

goud, erts, wol, steen, hout, graan

Omdat je niet altijd alle benodigde grondstoffen kan ontginnen, kan je ruilen. Zo kan je bij de bank (4:1), gewone haven (3:1) en de gespecialiseerde haven (2:1) een grondstof bekomen door te ruilen tegen een gegeven aantal gelijke grondstoffen. Bij de gewone haven kan je bijvoorbeeld drie stenen ruilen voor een goudstuk.

Opgave

In deze oefening programmeren jullie ruilmarkt, een fictieve uitbreiding van het spelletje Catan. Een dictionary die doorheen de oefening niet wijzigt, houdt de marktprijzen bij.

{
  'goud': {'erts', 'wol', 'steen'},
  'wol': {'erts', 'steen', 'hout'},
  'erts': {'hout', 'steen'},
  'steen': {'hout', 'graan'}
}

Wanneer een speler de grondstof wol niet kan ontginnen, dan kan de speler erts, steen en hout ruilen voor de grondstof wol. Elke speler verzamelt tijdens het spel grondstoffen in een lijst. Zo kan een speler volgende grondstoffen bezitten:

['graan', 'erts', 'steen', 'steen', 'erts', 'erts', 'hout', 'goud']

Indien deze speler op de ruilmarkt erts, steen en hout ruilt voor wol, dan verandert de lijst grondstoffen van de speler.

['graan', 'steen', 'erts', 'erts', 'goud', 'wol']

Programmeer volgende functies:

Voorbeeld

>>> ruilmarkt = {'goud': {'wol', 'steen', 'erts'}, 'wol': {'hout', 'steen', 'erts'}, 'erts': {'hout', 'steen'}, 'steen': {'hout', 'graan'}}

>>> wisselen_mogelijk(ruilmarkt, 'steen', ['wol', 'erts'])
False
>>> wisselen_mogelijk(ruilmarkt, 'wol', ['graan', 'erts', 'steen', 'steen', 'erts', 'erts', 'hout', 'goud'])
True

>>> bereken_ruilmiddelen(ruilmarkt, ['wol'])
{'hout': 1, 'steen': 1, 'erts': 1}
>>> bereken_ruilmiddelen(ruilmarkt, ['goud', 'erts', 'erts'])
{'wol': 1, 'steen': 3, 'erts': 1, 'hout': 2}

>>> wisselen(ruilmarkt, 'steen', ['wol', 'erts'])
['wol', 'erts']
>>> wisselen(ruilmarkt, 'wol', ['graan', 'erts', 'steen', 'steen', 'erts', 'erts', 'hout', 'goud'])
['graan', 'steen', 'erts', 'erts', 'goud', 'wol']

Bronnen

Wikipedia (2018)1