Ga naar hoofdinhoud

Een raster

Een robot staat in een doolhof en moet de uitgang vinden. Voordat hij een weg kan zoeken, moet hij weten waar hij vanaf een vakje naartoe kan. In dit project zet je een doolhof in Python, en schrijf je een functie die bij elk vakje de buren geeft. In het volgende project zoek je daarmee de kortste weg. Eerst het doolhof zelf: een raster van vakjes.

info

Je gebruikt hier lijsten uit Lijsten, tuples en uitpakken uit Tuples, een functie met return uit Return-waarden, en een loop in een loop uit Om de beurt. Nieuw is dat je een tekst net als een lijst met een index leest.

Voorspel​

doolhof = [
"S.#",
".##",
"..E",
]

print(doolhof[0][2])
print(doolhof[2][1])
print(len(doolhof), len(doolhof[0]))

S is de start, E de uitgang, # een muur en . een vrij vakje. Wat print dit programma?

Antwoord
#
.
3 3

doolhof[0] is de eerste rij, "S.#", en daarvan is [2] het derde teken: een muur. doolhof[2][1] is het tweede teken van de onderste rij.

Zo werkt het​

Het doolhof is een lijst van teksten, één tekst per rij. Een tekst kun je net als een lijst met een index lezen: "S.#"[2] is "#". Met doolhof[rij][kolom] pak je dus één vakje. Rij 0 is de bovenste rij, kolom 0 de linker kolom.

Een vakje schrijf je als tuple (rij, kolom). Met rij, kolom = vakje pak je de tuple uit in twee variabelen, net als in een for-loop.

Onderzoek​

  1. Draai de code. Welk teken staat er op het vakje (2, 3)? Zoek het op in het doolhof.
  2. Op welk vakje staat de E? Zet dat vakje in vakje, en kijk of je gelijk had.
  3. Zet vakje = (5, 0). Wat gebeurt er?
Python
Code-omgeving wordt voorbereid…
Antwoorden
  1. Een .: de rij is "#....#", en kolom 3 is het vierde teken.
  2. Op (4, 5): de onderste rij, het laatste teken. Het doolhof heeft 5 rijen van 6 tekens, dus de nummers lopen van 0 tot en met 4 en van 0 tot en met 5.
  3. Python stopt met een foutmelding: rij 5 bestaat niet. In muren zie je hoe buren dat voorkomt.

Opdracht: muren tellen​

Tel hoeveel muren er in het doolhof staan. Dat zijn er 9:

Er staan 9 muren

Begin klein, en breid de code stap voor stap uit:

  1. Draai de code: hij telt de muren in de bovenste rij. Daar staan er 0.
  2. Verander doolhof[0] in doolhof[1]. Nu telt hij er 3.
  3. Zet de loop in een tweede loop, for regel in doolhof:, en loop in de binnenste loop over regel in plaats van over doolhof[1]. Nu telt hij alle 9 muren.
Python
Code-omgeving wordt voorbereid…
Tip

Telt hij steeds alleen één rij, of een getal dat niet klopt? Kijk waar teller = 0 staat: binnen de buitenste loop begint hij bij elke rij opnieuw bij 0.

Antwoord

Dit vervangt alles onder het doolhof in de editor:

teller = 0
for regel in doolhof:
for teken in regel:
if teken == "#":
teller = teller + 1
print("Er staan", teller, "muren")
Er staan 9 muren

De buitenste loop gaat langs de rijen, de binnenste langs de tekens van één rij. Zo komt elk vakje één keer langs.

Door naar de buren.