Hieronder zie je de wereld van kipract de robot. Kipract is een nieuwsgierige robot, die als doel heeft zo veel mogelijk te weten te komen over zijn spannende wereld. In zijn korte leven komt hij de volgende voorwerpen tegen:
|
|
De gebieden die de robot nog niet kent, zijn zwartwit gekleurd. Wanneer de robot kennis krijgt over zo'n plek, dan wordt dat automatisch zichtbaar in kleur. De 'Markers' zijn geen 'echte' dingen, maar zijn een soort geheugensteuntje. In het voorbeeldplaatje bevindt zich op iedere marker eigenlijk een 'space'.
Aan het begin van zijn leven heeft de robot een bepaalde hoeveelheid energie (10000) die hij kan gebruiken om de volgende acties te ondernemen:
| Actie | Kosten | |
|---|---|---|
| robot-turn N | -2 | Turns the robot N spaces to the right or left. If `N' is a positive number, the robot turns to the right. If `N' is negative, the robot turns to the left. Every turn has a cost of -2, so if you `robot-turn 2' then the cost is 4 to your energy. |
| robot-move N | -2 | Moves the robot N spaces forwards or backwards. If `N' is a positive number, the robot moves forwards. If N' is negative, the robot moves backwards. Every move has a cost of 2, so if you `robot-move 2' then the cost is -4 to your energy. |
| robot-smell TH | -1 | Smells for a thing. If the thing is in the surrounding eight spaces, the function returns a true (`#t') value. |
| robot-feel TH | -1 | Feels for a thing in the space directly in front of the robot. If the thing is detected in that space, the function returns a true (`#t') value. Note that you can feel a baddie, and not take any damage. |
| robot-feel-dir DIR | -2 | Feels the adjacent square in direction DIR (one of "north" "south" "east" "west"). Returns the object found there. |
| robot-look TH | -1 | Looks ahead across empty spaces for a particular thing. If the thing is seen, the function return returns a true (`#t') value. Note that this is sort of a braindead function, in that it does not provide the distance to the thing. The robot cannot look behind objects, so if you look for a food item, and there is a prize item in the way, the function returns false. |
| robot-grab | -5 | Attempts to pick up what is in the space directly in front of the little robot. Note that you should not try to pick up baddies or walls. If the item is food, you increase your energy by +10. If the item is a prize, you increase your score by +1. The function returns a true (`#t') if the robot was able to pick the thing up. |
| robot-zap | -10 | Uses the robot's little gun to zap whatever is in the space directly in front of it. If you were able to zap something (a baddie, or even a prize or food) then the function returns a true (`#t') value. |
| robot-write STR | 0 | Writes the string STR. |
| robot-stop | 0 | Exits immediately. |
| robot-get-shields | 0 | Returns the level of the little robot's shields. |
| robot-get-energy | 0 | Returns the level of the little robot's energy. |
| robot-get-score | 0 | Returns the robot's score (how many prizes have been picked up.) |
N.B! Als je probeert een vakje binnen te lopen dat niet leeg is, ontvang je damage. Bovendien wordt je robot niet verplaatst en retourneert de robot-move functie de waarde #f (false). Probeer dus altijd eerst zeker te weten dat een hokje leeg is voordat je erin loopt.
Oh ja, nog een tip: als het programma te snel loopt, kun je (sleep n) commando's tussenvoegen, dat wacht telkens n seconden.
Om het jullie makkelijk te maken, hebben we wat extra dingen toegevoegd. De robot is nu uitgerust met een 'knowledge base' waarmee hij kan onthouden wat hij allemaal gezien heeft. Omdat nadenken geen energie kost (!?), is het meestal voordeliger om eerst de knowledge base te raadplegen voordat hij verder loopt.
In de knowledge base kan hij voor ieder hokje behalve de normale voorwerpen ("food","prize","wall","baddie","robot","space"), ook nog twee andere dingen opslaan. Deze twee dingen zul je nooit 'voelen' in de 'echte' wereld.
Als je een hokje binnenloopt, wordt voor dat hokje automatisch opgeslagen dat het een "space" bevat (tenzij er dus een marker ligt). Alle andere knowledge moet je zelf opslaan in het brein van de robot. Hiervoor heb je de volgende functies:
| kb-add-dir DIR THING | Onthoudt dat zich in direction DIR ("north", "south", "east" of "west") een THING bevindt. |
| kb-add-loc X Y THING | Onthoudt dat zich op positie (x,y) met de robot in de oorsprong (0,0) een THING bevindt. Buiten de wereld schrijven heeft geen zin :) |
| kb-ask-dir DIR | Pijnigt je hersenen om je herinneren wat zich in direction DIR bevind. Retourneert het ding wat daar is (voorzover je weet). |
| kb-ask-loc X Y | Dito, maar dan op positie (x,y). Retourneert de lege string ("") als het buiten de wereld valt. |
| kb-print | Print al je kennis. Handig voor debugging. |
| robot-done | Retourneert #t (true) als je kennis hebt van de hele wereld en dat is ook nog eens de juiste kennis. Markers zijn hiervoor alleen toegestaan op plaatsen waar 'spaces' staan. |
Merk op dat (kb-add-loc 1 0 "wall") hetzelfde is als (kb-add-dir "east" "wall").
Het doel van de robot is uiteraard om een zo hoog mogelijke score te bereiken (dus alle prizes op te eten), zonder damage op te lopen, en met zo weinig mogelijk energieverbruik. De extra dimensie die we hebben toegevoegd is dat de robot pas klaar is als de functie robot-done #t retourneert, met andere woorden, je moet complete en correcte kennis van de wereld hebben. Dit betekent trouwens niet dat je overal geweest moet zijn...