De buren
In de vorige stap las je met doolhof[rij][kolom] wat er op een vakje staat.
Nu zoek je de buren van een vakje: de vier vakjes erboven, eronder, links en
rechts ervan. Aan de rand van het doolhof zijn het er minder, want daar houdt
het doolhof op.
Voorspel
vakje = (2, 1)
rij, kolom = vakje
for r, k in [(rij - 1, kolom), (rij + 1, kolom), (rij, kolom - 1), (rij, kolom + 1)]:
print(r, k)
Wat print dit programma?
Antwoord
1 1
3 1
2 0
2 2
Eerst het vakje erboven (een rij minder), dan eronder (een rij meer), dan
links (een kolom minder) en rechts (een kolom meer). Elk paar in de lijst is
een tuple, en for r, k in pakt hem uit.
Zo werkt het
De functie buren krijgt een vakje en geeft een lijst met zijn buren terug.
Hij pakt het vakje uit, loopt langs de vier mogelijke buren, en zet ze met
append in de lijst resultaat.
Een buur telt alleen mee als hij binnen het doolhof ligt. Boven rij 0 is er geen rij meer, en onder de laatste rij ook niet. Datzelfde geldt voor de kolommen links en rechts.
Onderzoek
- Draai de code. Welke buren heeft
(2, 1)? Zoek ze op in het doolhof. - Vraag
buren((0, 0)). Welke van die vakjes bestaan niet? - Zet onderaan
print(doolhof[-1]). Geeft Python een foutmelding? - Vraag
buren((4, 5)). Welke buren liggen buiten het doolhof?
Antwoorden
[(1, 1), (3, 1), (2, 0), (2, 2)]. Op(2, 0)staat een muur; daar kijk je in de volgende stap naar.- Je krijgt
[(-1, 0), (1, 0), (0, -1), (0, 1)]. Rij -1 en kolom -1 bestaan niet: die liggen boven en links van het doolhof. - Nee. Een negatieve index telt vanaf het eind, dus
doolhof[-1]is de onderste rij,"#....E". Een robot die naar rij -1 gaat, springt dus zonder foutmelding van de bovenrand naar de onderrand. (5, 5)en(4, 6): rij 5 en kolom 6 bestaan niet.
Opdracht: binnen de randen
Laat buren alleen de vakjes geven die binnen het doolhof liggen. Voor de
start en de uitgang geeft hij dan:
[(1, 0), (0, 1)]
[(3, 5), (4, 4)]
Begin klein, en breid de code stap voor stap uit:
- Draai de code:
buren((0, 0))geeft vier vakjes, ook(-1, 0)en(0, -1). - Zet de
appendin eenif r >= 0:. Nu is(-1, 0)weg. - Zet er met
andde voorwaardek >= 0bij. Nu geeft hij[(1, 0), (0, 1)]. - Vraag ook
buren((4, 5)), en zet er de twee voorwaarden voor de onderrand en de rechterrand bij:r < len(doolhof)enk < len(doolhof[0]).
Tip
Waarom r < len(doolhof) en niet r <= len(doolhof)? Het doolhof heeft 5
rijen, met de nummers 0 tot en met 4. Rij 5 bestaat niet meer.
Antwoord
Dit vervangt de functie buren en de print in de editor:
def buren(vakje):
rij, kolom = vakje
resultaat = []
for r, k in [(rij - 1, kolom), (rij + 1, kolom), (rij, kolom - 1), (rij, kolom + 1)]:
if r >= 0 and r < len(doolhof) and k >= 0 and k < len(doolhof[0]):
resultaat.append((r, k))
return resultaat
print(buren((0, 0)))
print(buren((4, 5)))
[(1, 0), (0, 1)]
[(3, 5), (4, 4)]
len(doolhof) is het aantal rijen, en len(doolhof[0]) het aantal tekens
van de eerste rij: het aantal kolommen.
Door naar muren.