| BSc KI — Cursus Natuur & Berekening | 2025-26 |
Voor een volgende programmeeropdracht hebben we doolhoven nodig. Nu is het een beetje tijdrovend om doolhoven handmatig te gaan construeren. Handiger is het om doolhoven door een computer-programma te laten genereren. Daar gaat deze opdracht over.
Programmeer in Netlogo een doolhoven-generator.
Alle begin is moeilijk, zeker als je net een nieuwe taal leert. We gaan doolhoven genereren met zg. turtles. Probeer daarom eerst eens een turtle te programmeren die in stapjes rechtuit loopt en een spoor trekt (gebruik forward 1 en set pcolor 1. Probeer daarna eens een turtle te programmeren die in stapjes rechtuit loopt, een spoor trekt en kan keren bij randen (gebruik can-move? 1 en left 90) Daarna een turtle die in stapjes rechtuit loopt, een spoor trekt, kan keren bij randen en kan keren bij het eigen spoor. Als je dit gedaan hebt kun je je werk vergelijken met dit voorbeeld-programma. Dit kun je downloaden en in Netlogo openen.
Hier volgt uitleg over de hele opdracht.
Hier staat wat moet. Bij afwijking van randvoorwaarden worden punten in mindering gebracht.
|
| Een stack: last in, first out. |
move-to one-of patches ), en laat haar (hem, het) een willekeurige kant op wijzen ( set heading 90 * random 4 ). Voor ons type doolhof moet een turtle op een oneven patch staan: ( move-to one-of patches with [ pxcor mod 2 = 0 and pycor mod 2 = 0 ] ). Je hebt gelijk: modulo nul is even, maar het default Netlogo canvas begint te tellen vanaf nul.
; een stack kan in Netlogo word geïmplementereerd als lijst. dat is hier nog niet te zien
; de stack wordt alleen gedeclareerd
turtles-own [
stack ; alle zelf-verzonnen variabelen, functies en routines zijn rood
]
to setup
; init code (bijvoorbeeld: clear-all)
create-turtles 1 [
; turtle init code ... (zet hem op z'n plek, geef hem een vorm en een kleur, laat hem een kant op wijzen)
set stack (list patch-here)
; na initialisatie bevat de stack één element, namelijk de patch onder de turtle
; je kunt hier ook zien dat de stack geïmplementereerd is als lijst
;
; stack-initalisatie respecteert niet echt de pop en push routines. om dat te verhelpen kun je
; een stack-init procedure schrijven, een stack-init doen, en dan vervolgens het eerste element
; er op duwen.
; ...
; andere turtle init code ...
]
end
; --- hulp routines voor de stack implementatie --------------------------------------
to push [ element ] ; duw element op de stapel
set stack (fput element stack) ; stop een element voor in de lijst
; haakjes zijn hier niet echt nodig. ze zijn ingevoegd voor het begrip
end
to-report pop ; haal een element van de stapel en geef dit terug
; code om een element van de stack te halen en terug te geven. sluit af met: report <waarde>
end
to step ; neem twee stappen, kleur de belopen velden wit, en onthou de locatie waar je aankomt end
to move ; probeer eens wat ..... ; als de turtle in alle vier de richtingen niet verder kan, doe dan een backtrack stap backtrack ; de huidige move is nu beëindigd end to backtrack move-to pop end
to create-maze
ask turtles [ ; vraag alle turtles (er is er maar één maar dat maakt niet uit)
while [ not empty? stack ] [ move ] ; blijf actief zolang de stack nog niet leeg is
die ; vraag turtle zichzelf te killen als z'n stack leeg is :-(
]
end
Extra punten kunnen worden verdient door het aanbrengen van de volgende features.
to flood-fill ; deze procedure wordt gekoppeld aan een knop die, als die ingedrukt is, ingedrukt blijft
if mouse-down? [ ; vang muisklikken op
ask patch mouse-xcor mouse-ycor [ set pcolor red ] ; vul patch onder de cursor met rood
]
; code die er voor zorgt dat witte doolhofcellen die grenzen aan rode doolhofcellen zelf ook rood worden
; ...
end
repeat 4 [ ... ] ) verloopt in het voorbeeld hierboven deterministisch (altijd op dezelfde manier), door bij vastlopen steeds 90 graden naar rechts te draaien. Het zou mooier zijn het zoeken naar alternatieve richtingen non-deterministisch te laten verlopen. In het laatste geval probeert de turtle alternatieven richtingen uit in een willekeurige volgorde. Non-deterministisch gedrag levert doolhoven op die iets meer variëren.
| Laatst gewijzigd op woensdag 13 november 2024, om 15:02 uur | Auteur(s): Gerard Vreeswijk | Translate to en, ru, or tr |