Je eigen doolhof
Je vond de doodlopende vakjes: vakjes met één buur. Op een vakje met drie of vier buren moet de robot kiezen welke kant hij op gaat: een kruispunt. In deze stap teken je een eigen doolhof en zoek je allebei.
Voorspel
doolhof = [
"S.#",
"...",
"#.E",
]
Tel bij elk vrij vakje hoeveel buren het heeft. Welk vakje is een kruispunt?
Antwoord
Alleen het middelste vakje, (1, 1): het heeft vier buren. Elk ander vrij
vakje heeft er twee, ook de start en de uitgang. Dit doolhof heeft dus geen
doodlopende vakjes.
Zo werkt het
Een kruispunt is een vrij vakje met drie of meer buren. Je vindt ze op dezelfde manier als de doodlopende vakjes: langs elk vakje, en tellen hoeveel buren het heeft.
Een eigen doolhof is een lijst van teksten, net als dat van de editor. Geef
elke rij evenveel tekens: buren meet de breedte aan de eerste rij.
Bouw zelf: je eigen doolhof
Teken een eigen doolhof van minstens 6 bij 6, met een S en een E. Zoek met
doodlopend() de doodlopende vakjes, en schrijf daarna een functie
kruispunten() die de vakjes geeft met drie of meer buren: daar moet de robot
kiezen. Kloppen ze met wat jij in je doolhof ziet?
Begin klein, en breid de code stap voor stap uit:
- Draai de code. In de editor staat
doodlopend()uit de vorige stap, met het doolhof van de vorige stappen.burenstaat in de verborgen code. - Zet je eigen doolhof in de plaats van het doolhof in de editor, en kijk of de doodlopende vakjes kloppen met wat je ziet.
- Schrijf een functie
kruispunten(). Test hem eerst met het doolhof van de vorige stappen: dan geeft hij[(0, 1), (0, 4), (1, 4), (2, 1), (3, 1)].
Tip
kruispunten() lijkt bijna helemaal op doodlopend(). Wat verandert er aan
de voorwaarde?
Antwoord
Dit komt onder doodlopend in de editor:
def kruispunten():
lijst = []
for rij in range(len(doolhof)):
for kolom in range(len(doolhof[0])):
if doolhof[rij][kolom] != "#" and len(buren((rij, kolom))) >= 3:
lijst.append((rij, kolom))
return lijst
print(kruispunten()) # [(0, 1), (0, 4), (1, 4), (2, 1), (3, 1)]
Een eigen doolhof zet je in plaats van het doolhof in de editor, bijvoorbeeld:
doolhof = [
"S.#...",
".##.#.",
"......",
".#.##.",
".#...#",
"...#.E",
]
Let op dat elke rij evenveel tekens heeft, anders gaat buren mis: zie
hieronder.
Er gaat iets mis
IndexError: string index out of range
Oorzaak: één rij van je doolhof is korter dan de eerste. buren meet de
breedte aan doolhof[0], en zoekt dan in de korte rij een kolom die er niet
is. Een rij is een tekst, daarom noemt Python een string.
Oplossing: geef elke rij evenveel tekens.
# FOUT
doolhof = ["S..", ".#", "..E"]
print(doolhof[1][2])
# GOED
doolhof = ["S..", ".#.", "..E"]
print(doolhof[1][2])
Meer uitleg over een vakje buiten het doolhof: muren.
Door naar een wachtrij.