| Opdrachtbeschrijving | In deze beschrijving lees je wat er van de robot verwacht wordt. |
|---|---|
| De kaart | De robot bevindt zich in verschillende kaarten (werelden). Je kan de omgeving bekijken door te slepen met de muis of op het aanraakscherm. Je kan grootte van de kaart veranderen door de zoom knoppen te gerbuiken, door met je muis te scrollen of met het zoom-gebaar op een aanraakscherm. |
| Script editor | Een oplossing is een script (programma) dat je in dit tekstveld schrijft. Scripts zijn geschreven instructies(commando's) die normaal gesproken van links naar rechts, van boven naar beneden worden uitgevoerd. Gebruik de afstandsbediening om te zien welke instructies je kunt gebruiken. Of kijk bij de documentatie hier beneden. |
| Uitvoeren | Om je script uit te voeren klik je op de play knop. Hopelijk is het goed en lost het je probleem op. Zo niet, dan krijg je meestal wel een hint. |
De robot begrijpt niet alles wat je in de script editor schrijft. De volgende instructies kent hij wel.
| Bewegen | Instructie | Beschrijving | |
|---|---|---|---|
![]() |
![]() |
vooruit | Ga een stap vooruit. Gebruik vooruit(nummer) om meerdere stappen te doen. |
![]() |
achteruit | Ga een stap achteruit. Gebruik achteruit(nummer) om meerdere stappen te doen. |
|
![]() |
links | Draai een kwartslag naar links. Gebruik vooruit(nummer) om meerdere slagen te doen. |
|
![]() |
rechts | Draai een kwartslag naar rechts. Gebruik vooruit(nummer) om meerdere slagen te doen. |
| Grijpen | Instructie | Beschrijving | |
|---|---|---|---|
![]() |
![]() |
pakOp | Pak het baken recht voor je op |
![]() |
zetNeer | Zet het baken recht voor je neer | |
![]() |
eetOp | Verwijder het baken recht voor je |
| Verven | Instructie | Beschrijving | |
|---|---|---|---|
![]() |
![]() |
verfWit | Zet de kwast neer met witte verf |
![]() |
verfZwart | Zet de kwast neer met zwarte verf | |
![]() |
stopVerven | Berg de kwast weer op |
| Zien | Links | Voor | Rechts |
|---|---|---|---|
![]() |
linksIsVrij | voorIsVrij | rechtsIsVrij |
| linksIsObstakel | voorIsObstakel | rechtsIsObstakel | |
| linksIsBaken | voorIsBaken | rechtsIsBaken | |
| linksIsWit | voorIsWit | rechtsIsWit | |
| linksIsZwart | voorIsZwart | rechtsIsZwart |
herhaal(n){...instructies...}
Herhaalt de instructies tussen accolades precies
n keer.
Voorbeeld:
# een 2x2 vierkantje
herhaal(4)
{
vooruit(2)
rechts
}
herhaal{...instructies...}
Blijft de instructies tussen accolades telkens
herhalen.
Voorbeeld:
# blijf rechtdoor gaan
# (zal uiteindelijk blijven botsen)
herhaal
{
vooruit
}
herhaalZolang(conditie){...instructies...}
Herhaalt de instructies tussen de accolades net zolang totdat de conditie niet meer opgaat.
De conditie moet een logische expressie zijn die waar of onwaar kan zijn (bijv. voorIsVrij)
Voorbeeld:
# blijf rechtdoor gaan, totdat je niet verder kunt
herhaalZolang(voorIsVrij)
{
vooruit(1)
}
doorbreekLus
Zorgt ervoor dat de lus waar deze instructie in
staat wordt beëindigd, en er wordt verder gegaan met de eerste instructie
na deze lus.
Voorbeeld:
# blijf rechtdoor gaan, totdat je niet verder kunt
herhaal
{
als(voorIsObstakel)
{
doorbreekLus
}
anders
{
vooruit(1)
}
}
als(conditie){...instructies...}
Voert de instructies tussen accolades alleen uit
als de conditie opgaat. De conditie moet logische expressie zijn die de waarde waar
of onwaar aanneemt (bijv.
voorIsVrij)
Voorbeeld:
# als je links een witte stip ziet, maak hem zwart
als(linksIsWit)
{
links
vooruit(1)
verfZwart
stopVerven
achteruit(1)
rechts
}
als(conditie){...instructies...}anders{...instructies...}
Voert de instructies tussen het eerste paar accolades
alleen uit als de conditie opgaat, anders voert het alleen de instructies
uit tussen het tweede paar accolades. De conditie moet logische expressie zijn die de waarde waar of onwaar aanneemt (bijv.
voorIsVrij)
Voorbeeld:
# als je links een witte stip ziet, maak hem zwart,
# rij anders een stukje door;
als(linksIsWit)
{
links
vooruit(1)
verfZwart
stopVerven
achteruit(1)
rechts
}
anders
{
vooruit(1)
}
als(conditie){...instructies...}
anders als {...instructies...}Voorbeeld:
als(voorIsWit)
{
# alleen als voor is wit
vooruit(1)
}
anders als(rechtsIsWit)
{
# alleen als rechts is wit
rechts
vooruit(1)
}
anders als(linksIsWit)
{
# alleen als links is wit
links
vooruit(1)
}
anders
{
# alleen als ALLE voorgaande condities niet het geval waren
rechts
rechts
vooruit
}
als(conditie){...instructies...}
Voert de instructies tussen accolades alleen uit
als de conditie opgaat. De conditie moet logische expressie zijn die de waarde waar of onwaar aanneemt (bijv.
voorIsVrij)
Voorbeeld:
# als je links een witte stip ziet, maak hem zwart
als(linksIsWit)
{
links
vooruit(1)
verfZwart
stopVerven
achteruit(1)
rechts
}
als(conditie){...instructies...}anders{...instructies...}
Voert de instructies tussen het eerste paar accolades
alleen uit als de conditie opgaat, anders voert het alleen de instructies
uit tussen het tweede paar accolades. De conditie moet logische expressie zijn die de waarde waar of onwaar aanneemt (bijv.
voorIsVrij)
Voorbeeld:
# als je links een witte stip ziet, maak hem zwart,
# rij anders een stukje door;
als(linksIsWit)
{
links
vooruit(1)
verfZwart
stopVerven
achteruit(1)
rechts
}
anders
{
vooruit(1)
}
als(conditie){...instructies...}
anders als {...instructies...}Voorbeeld:
als(voorIsWit)
{
# alleen als voor is wit
vooruit(1)
}
anders als(rechtsIsWit)
{
# alleen als rechts is wit
rechts
vooruit(1)
}
anders als(linksIsWit)
{
# alleen als links is wit
links
vooruit(1)
}
anders
{
# alleen als ALLE voorgaande condities niet het geval waren
rechts
rechts
vooruit
}
De conditie van als- en herhaalZolang-structuren zijn zogenaamde logische expressies. Deze expressies zijn een voorwaarde die de waarden waar of onwaar aannemen, waarna naar het overeenkomende deel van de code kan worden gesprongen alvorens de uitvoering te hervatten.
Een logische expressie kan een van de waarnemingsinstructies zijn, zoals bijvoorbeeld linksIsWit. Waarnemingsinstructies kunnen ook worden samengevoegd met de booleaanse operatoren niet, en, of.
Voorbeeld:
# als je links een witte stip ziet, maak hem zwart
als(linksIsWit)
{
links
vooruit(1)
verfZwart
stopVerven
achteruit(1)
rechts
}
De conditie kan echter ook verfijnt worden om precieser aan te geven wanneer de bijbehoren instructies moeten worden uitgevoerd met een van de volgende operatoren.
Operatie |
Alternatieve
notatie |
Aantal argumenten |
Uitleg |
| niet | ~ | 1 | Keert de waarde van het argument om: Waarheidstabel: Voorbeeld: |
| en | & | 2 | Alleen waar als beide argumenten waar zijn. Waarheidstabel: Voorbeeld: |
| of | | | 2 | Waar als één of beide argumenten waar zijn. Waarheidstabel: Voorbeeld: |
De waarden waar en onwaar kunnen ook direct worden gebruikt net als een waarnemingsinstructie.
De volgorde van deze operatoren is van belang (net zoals bij vermenigvuldigen en optellen). De operatie niet bindt het sterkst, gevolgd door en, gevolgd door of. Er kunnen haakjes worden gebruikt om de volgorde naar wens aan te passen.
Voorbeelden:
herhaalZolang(niet voorIsVrij en (linksIsWit of rechtsIsWit)){
vooruit(1)
}
als(kopOfMunt en niet rechtsIsWit)
{
rechts
achteruit(1)
}
als(waar en onwaar){
#deze instructie wordt nooit uitgevoerd
vooruit(1)
}
Getallen vergelijken
Een andere vorm van logische expressies is het vergelijken van getallen.
Je kan hiermee een beslissing maken op basis van een bepaalde waarde.
Bijvoorbeeld: ga alleen naar rechts als een variabele minder is dan 5.
Voorbeeld:
vooruit
misschienRechts(8)
vooruit
procedure misschienRechts(n){
als(n < 5){
rechts
}
}
Dit is de volledige lijst van vergelijkingsoperaties.
| Operatie | Voorbeeld: waar | Voorbeeld: onwaar | Uitleg |
|---|---|---|---|
| == | 3 == 3 | 1 == 2 | Controleer gelijkheid |
| ~= | 1 ~= 2 | 3 == 3 | Controleer ongelijkheid |
| < | 1 < 2 | 3 < 3 | Vergelijk getallen met "kleiner dan" |
| <= | 3 <= 3 | 2 <= 1 | Vergelijk getallen met "kleiner dan of gelijk aan" |
| > | 2 > 1 | 3 > 3 | Vergelijk getallen met "groter dan" |
| >= | 3 >= 3 | 1 >= 2 | Vergelijk getallen met "groter dan of gelijk aan" |
procedure naam(par1, par2,..., parN){...instructies...}
Definieert een nieuwe procedure met een zelf gekozen naam. De procedure kan
beschikken over een aantal parameters die hier par1, par2, . . . , parN worden genoemd. Dit
zijn de namen van de variabelen die je wilt gebruiken in de instructies
die tussen accolades staan.
Voorbeeld:
# definieer het tekenen van een rechthoek
procedure rechthoek(breedte, hoogte)
{
verfWit
herhaal(2)
{
vooruit(hoogte)
rechts
vooruit(breedte)
rechts
}
stopVerven
}
naam(arg1, arg2, . . . , argN)
Is de aanroep van de procedure met dezelfde
naam en hetzelfde aantal parameters. De argumenten arg1, arg2, . .
. , argN zijn de concrete waarden voor de parameters in de proceduredefinitie.
Voorbeeld:
vooruit(1) rechthoek(3,2) # de aanroep gebruikt de bovenstaande definitie vooruit(3) rechthoek(1,4) # nog een aanroep, nu met andere argumenten
retourneer
Zorgt ervoor dat de uitvoer van de huidige procedure wordt afgebroken.
De uitvoer zal worden hervat bij de eerste insructie na de procedure-aanroep.
Op deze manier is het mogelijk slehts een eerste deel van de procedure
te laten uitvoeren.
piet
# hier gaat de uitvoer verder nadat 'piet' is voltooid
links
vooruit(1)
procedure piet
{
vooruit(5)
als(voorIsObstakel)
{
# breek de uitvoer van deze procedure af
retourneer
}
vooruit(3)
}
retourneer(arg)
zorgt ervoor dat de uitvoer van de huidige procedure wordt afgebroken.
De uitvoer zal worden hervat bij de eerste insructie na de procedure-aanroep.
Op deze manier is het mogelijk slehts een eerste deel van de procedure
te laten uitvoeren.
Standaard retourneert een procedure het getal nul. Je kan een andere waarde teruggeven door hier een expressie op te geven.
Voorbeeld:
vooruit(verdubbel(3))
# verdubbel het gegeven aantal
procedure verdubbel(n)
{
retourneer(2 * n)
}
Recursie
Een procedure kan recursief worden gedefinieerd. Dat betekend dat je definieert wat er in een procedure moet gebeuren in termen van zichzelf door hem aan te roepen.
Het is eerst lastig om te begrijpen, maar je kunt er soms mooie oplossingen mee maken.
Voorbeeld:
# voer de volgende instructies uit
naarMuur()
rechts
vooruit
# ga vooruit totdat je een muur tegenkomt
procedure naarMuur()
{
# NB: er worden geen herhaal-
# lussen gebruikt.
als(voorIsObstakel)
{
# stop "naarMuur" procedure
retourneer
}
anders{
# doe een stap
vooruit
# en doe een recursieve aanroep!
naarMuur()
}
}
+,-,*,/
Met deze operaties kan je getallen optellen, aftrekken, vermenigvuldigen en delen.
Let op: je kunt alleen rekenen met gehele getallen.
Voorbeeld:
# gebruik wat berekeningen
vooruit(2+3)
als(3*4 < 13){
x = 3
links(x-2)
}
achteruit(-(3+4)/2)
x = ...
Met variabele kan je waarden onthouden onder een zelfgekozen naam. Variabelen kan je vervolgens verderop in het script gebruiken.
Je kan later bij de opgeslagen waarde door de naam te gebruiken. Je kan waarden uit alle expressies opslaan (dus: getallen, berekeningen, logische expressies, geretourneerde waarden).
Voorbeeld:
# sla een getal op
x = 42
# sla nog een getal op, gebaseerd op x
y = x / 2
# sla een logische waarde op
vrij = linksIsVrij & voorIsVrij & rechtsIsVrij
# sla het werkelijk aantal stappen op dat je vooruit
# bent gegaan totdat je botste
# (wordt geretoureerd door "vooruit")
echt = vooruit(100)
als(vrij){
rechts(2)
vooruit(echt) # ga terug
}
links(y)