Greenfootscenarios van het boek

In het handboek en de theorielessen worden een tiental Greenfootscenarios gebruikt, die je kan downloaden op http://www.greenfoot.org/book.
Onderaan staat alle informatie voor de student:
  • Download de scenarios van het boek. Bewaar het bestand book-scenarios.zip (gebruik rechtermuisknop) om het even waar op je PC maar zorg dat je weet waar het staat.
  • Open Windows Verkenner met E en blader naar de map waar je vorig bestand hebt opgeslagen.
  • Nu moet je het bestand unzippen. Gebruik de rechtermuisknop en kies 7-zip of Extract Files.
  • Controleer in Windows Verkenner waar de scenarios zijn opgeslagen.
    Om een scenario te openen start je eerst Greenfoot op. Vanuit Greenfoot "blader" je naar het juiste scenario in de juiste map.
Neem het eerste deel van het boek door, maar enkel het scenario van de Wombat (tot en met 1.6). Als je dit klaar hebt kan je beginnen aan de eerste oefeningen.

Hoofdstuk 1

Voor dit labo heb je het scenario Fatcat nodig. Ga op dezelfde manier als hiervoor te werk.

Start Greenfoot op en open vanuit Greenfoot het scenario FatCat.

  1. Welke twee Greenfootklassen zie je in het klassendiagram ? Elk scenario vertrekt van de Greenfootklassen World en Actor, deze bevatten de basis-functionaliteit van een Greenfoot scenario. In elk scenario worden eigen klassen toegevoegd, als "subklasse" van deze basisklassen (de pijl toont de relatie "is subklasse van"). Deze subklassen zijn anders in elk scenario.
    Wat zijn de specifieke klassen voor dit scenario?
    Wat is de relatie tussen deze klassen ?

    Oplossing

  2. Open het klasse-menu van de Greenfootklassen World en Actor, en bekijk de documentatie. Wat wordt hier beschreven ?
    Open het klasse-menu van de klasse Cat en bekijk de broncode in de Editor. Volgend labo zal je hier nieuwe code moeten toevoegen. Belangrijk is dat je deze klassen kan aanpassen. Sluit de editor.
    Het klasse-menu open je met een klik op de rechtermuisknop (snelmenu) op de klasse.

    Oplossing

  3. Elk scenario wordt automatisch gecompileerd. Daarbij initialiseert Greenfoot een "instantie" van de concrete wereld. Open het object-menu van de concrete CatWorld en bekijk de vier instantievariabelen. De instantie van CatWorld is ......... cellen breed en .......... cellen hoog. Dit is dus een wereld met hoge/lage resolutie (duid je keuze aan).
    • Het linkerdeel van het venster toont de concrete CatWorld. Klik met de rechtermuisknop op de concrete wereld voor het object-menu. Met Inspect kan je de instantievariabelen bekijken.
    • De wereld is opgebouwd uit vierkante "cellen" van een bepaalde grootte (dit kan je in dit scenario niet echt zien). Een wereldobject onthoudt de "cellsize". Dit is de grootte van elke cel. De "cellsize" is ook de minimale afstand (in pixels) waarover je een actor kan verplaatsen.
      Een wereld met 'hoge' resolutie heeft cellsize gelijk aan 1, indien de cellsize groter is dan 1 heeft de wereld een 'lage' resolutie.
      Een wereldobject onthoudt ook zijn afmetingen, uitgedrukt in "aantal cellen".

    Oplossing

    Onthoud: Het klasse-menu vind je op de klassen (rechts). Het object-menu vind je op de objecten (in het grote venster links).
  4. Plaats twee Cat-objecten (=instanties van de Cat-klasse) in de CatWorld.

  5. In het klasse-menu van Cat vind je als eerste optie de constructor - new Cat(). Als je hierop klikt wordt een Cat-object (=instantie van de Cat-klasse) gemaakt en aan je cursor vastgeplakt. Plaats dit object ergens in de wereld. Herhaal dit voor een tweede Cat-object.

    Probeer de knoppen onderaan Act, Run,... Er gebeurt nog niets. Dit wordt pas in hoofdstuk 2 verder toegelicht.


  6. Open het object-menu van een Cat-object. Elke actor zal beschikken over de vijf laatste instantievariabelen.

    Oplossing

  7. Voor elke kat beschrijven de drie eerste instantievariabelen specifieke eigenschappen van een Cat-object. Achterhaal de betekenis van deze drie instantievariabelen. Wat is het type van deze instantievariabelen ? Wat is de mogelijke inhoud voor dit type ?

    Oplossing

    Onthoud:
    • elk object (='instantie') onthoudt zijn eigen kenmerken in instantievariabelen.
    • het type van een instantievariabele bepaalt wat die inhoud kan zijn (een getal, true/false,...).
      In Java zijn meerdere primitieve types beschikbaar, o.a. int, boolean
    • de naam van de variabele vertelt iets over zijn betekenis. Deze naam werd gekozen door de programmeur, en is dus niet vastgelegd door Java.
  8. Zoek de twaalf methodes van een Cat-object en roep deze methodes interactief (=met klikken) aan. De methodes vind je in het object-menu van een Cat-object.

    Oplossing

    Onthoud: Een methode heeft drie aspecten:
    • de naam van de methode verduidelijkt wat deze methode zal doen,
    • het returntype geeft aan welk type deze methode "teruggeeft" (void betekent niets,een logische methode geeft een boolean terug);
    • een parameter kan extra informatie doorgeven aan de methode. Het type van de parameter bepaalt welke soort informatie je moet opgeven.

  9. Elke actor, dus ook de kat, "erft" methodes van de klasse Actor. Je kan deze geërfde methodes terugvinden in de Greenfoot API (op papier - die je op de test kan gebruiken) en in de Greenfoot Class Documentation (op de computer). Je vindt geërfde methodes ook in het object-menu (bovenaan), bij inherited from Actor.
    1. Zoek de drie geërfde methodes die een geheel getal teruggeven. Kan je het verband leggen met de instantievariabelen?
    2. Experimenteer met de methode void setLocation(int , int ).
      Wat zijn de kleinste en grootste waarde die mogelijk zijn voor de instantievariabele x? Vergelijk dit met de breedte van CatWorld (analoog voor y).
    3. Zoek de logische methode die elke actor erft. Zoek uit welke interessante informatie je hiermee kan opvragen.
    4. Wat doet de methode void move(int ) ? Welke instantievariabele wordt gewijzigd ?
    5. Met welke methodes kan je de kat op zijn kop zetten? Er zijn twee methodes om dit te realiseren. Wat is het verschil tussen beiden ?
    6. Gebruik voorgaande methodes om de kat op een zij te leggen (volledig horizontaal). Welke van de twee methodes uit vorige vraag is dan het handigst? Beweeg de kat nu 3 stappen voorwaarts (met de methode move). Verklaar waarom de kat nu niet meer naar rechts beweegt.

    Oplossing

Hoofdstuk 2

Neem eerst hoofdstuk 2 door van het boek en maak dan de volgende opgaven.

  1. Hieronder de signatuur van zes methodes. Hoeveel logische methodes zijn er?
    public void jump()
    public boolean isAlone()
    public void walkLeft(int aantal)
    public void setLocation(int x , int y)
    public boolean isWater(int x , int y)
    public boolean isLaneFree(String laneToCheck)
    Antwoord voor elke methode op volgende vragen:
    • Geef de methodenaam.
    • Geeft de methode een waarde terug ? Wat is het returntype ?
    • Heeft de methode parameters ? Indien ja, wat is het type van elke parameter?
    • Geef een correcte aanroep van elke methode. Hierbij moet je dus een zinvolle waarde geven aan elke parameter.
      Voor een logische methode verwerk je de aanroep in een if( ) -statement.

    Oplossing

  2. Voeg de klasse MyCat toe, als subklasse van Cat.
    Tip 1: In het klasse-menu van Cat vraag je een new subclass.
    Tip 2: Zoek in het object-menu van de wereld de opdracht "Save the World", en voer die uit - sluit het "editor-venstor" dat hierdoor geopend wordt.

    Maak een object van deze nieuwe klasse - dan merk je bitter weinig verschil.
    Bewaar deze wereld zodat er altijd een kat in de wereld gezet wordt, na compile. (zie tip 2 hieronder)

  3. GEDRAG aanpassen via de methode act(). De kat doet niets doet als je de knoppen act, run indrukt. Zorg dat 'eten' het gedrag is van de kat.
    • Zoek in de broncode van de klasse MyCat de regel public class MyCat extends Cat. De 'body' van de klasse is het deel tussen de { }-tekens die onder deze regel begint. In de 'body' van de klasse staan de methodes onder elkaar. Deze klasse bevat enkel de methode act, die het gedrag beschrijft. De 'body' van deze methode (tussen de { }-tekens) is nu nog leeg. Dit verklaart dat er 'niets' gebeurt.
    • Roep de methode eat() aan in de methode act. Dit doe je door in de 'body' van de methode act te typen: eat();

    Opmerking: In de editor van Greenfoot kan je heel eenvoudig een lijst opvragen met alle beschikbare methodes "op die plaats in de code".
    De toetsencombinatie Ctrl-spatie genereert een handig overzicht van alle methodes ('eigen' methodes en geërfde methodes) die je nu kan opvragen. Van zodra je een letter intypt wordt die lijst aangepast. Je krijgt ook extra informatie over de methode in het kader rechts. Als je een methode 'kiest' dan wordt de juiste aanroep van de methode ingevoegd in de broncode. De ; moet je zelf toevoegen.

  4. Wijzig het "gedrag" zodat de kat in elke 'act' achtereenvolgens een pizza eet, daarna 'hoera' roept, en daarna danst.

    Oplossing

  5. Verander het gedrag van de kat, zodat ze een pizza eet en daarna 2 tellen slaapt. De kat moet dus geen 'hoera' meer roepen en niet meer dansen.
    Gebruik // om regels van vorig gedrag in commentaar te zetten.
    De methode sleep(int howLong) heeft een parameter die je moet invullen met een geheel getal. Na het ophalen van de methodenaam met Ctrl-spatie krijg je extra hulp voor het invullen van de parameter.

    Pas het gedrag verder aan zodat de kat, na het eten en het slapen ook nog 4 stappen naar rechts wandelt. Gebruik hiervoor een methode van Cat.

    Oplossing

  6. Zorg er nu voor dat de drie acties in het gedrag enkel worden uitgevoerd indien dit zinvol is voor de kat op dat moment, namelijk: ze eet 'als ze honger heeft', ze slaapt 'als ze moe is' en ze wandelt 'als ze zich verveelt'.
    Je kan de broncode gemakkelijk 'herschikken' met de toetsencombinatie Ctrl-Shift-I.
    Gebruik de logische methodes van Cat en verwerk de returnwaarde in een if( )-statement.
    Als je dit uittest dan loopt het misschien niet helemaal zoals verwacht. Bekijk de status van de kat en verklaar wat er gebeurt.
    Merk op: De kat zal enkel wandelen, want ze heeft geen honger en ze is niet moe. Laat de kat eens "dansen" en vraag daarna de methode act(). Nu worden de drie methodes uitgevoerd.

    Oplossing

  7. We programmeren nu een volledig nieuw gedrag. Gebruik /* en */ om een groter blok, namelijk alle code die je zelf hebt toegevoegd in de vorige oefeningen, in commentaar te zetten. Het nieuwe gedrag: de kat slaapt als ze alleen is, de kat danst als ze niet alleen is.
    Werk dit uit op twee manieren - met/zonder else (en test ze grondig uit - zorg dat je beide situaties controleert).
    Zoek de twee logische methodes waarmee je kan nagaan of de kat alleen is, en onderzoek 'interactief' (=met klikken) wat het verschil is tussen beiden.
    • Zonder else te gebruiken: gebruik twee if-statements en de twee logische methodes om het gedrag te beschrijven.
    • Met if-else structuur: gebruikt maar één logische methode.
    Wat is volgens jou de beste oplossing?
    Opmerking: Je hebt misschien opgemerkt dat twee katten nooit terzelfdertijd dansen?
    Verklaring: Greenfoot laat elke actor om beurten zijn methode "act()" uitvoeren. De tweede kat kan dus pas beginnen als de eerste kat klaar is.

    Oplossing

    Onthoud:
    • Het gedrag van actor wordt beschreven in methode act()
    • Commentaar op de regel kan je toevoegen met //
    • Een blok in commentaar zetten doe je met /* en */
  8. Tot slot wijzig je een laatste keer het gedrag van de kat (zet vorige code dus in commentaar): Los dit op met één if zonder else .
    De kat roept altijd "hoera". Het is niet nodig om hiervoor een else te gebruiken, De methode-aanroep moet dus niet in een if-else-stuctuur worden gevraagd. Je gebruikt enkel een if( )-statement om de kat te laten slapen als ze moe is.

    Oplossing

Hoofdstuk 3

Neem eerst hoofdstuk 3 door van het boek en maak dan deze oefening.
  1. Herschrijf de oplossingen uit hoofdstuk 2 met drie nieuwe methodes:
    De methode act() is nu helemaal leeg, want alle code is in de juiste methode gezet. De kat doet dus niets meer als je de knoppen act of run aanklikt.
    Om nu het "gedrag" van de kat in te stellen volstaat het de gewenste methode(s) 'aan te roepen' - gebruik Ctrl-spatie. Stel zelf een gedrag in naar keuze.

    Oplossing

  2. In de methode sleepDance() is het aantal tellen dat de kat slaapt ingesteld op 2. Wijzig dit zodat het aantal tellen dat de kat slaapt willekeurig wordt gekozen door het programma. Kies tussen 1, 2, 3, 4 of 5.
    Het gedrag van de kat moet je niet aanpassen. Test de methode enkel 'interactief' uit.
    Zoek in de Greenfoot API de statische methode van de klasse Greenfoot waarmee je een willekeurig getal kan vragen.
    De parameter wordt ingevuld met het aantal mogelijke waarden waaruit gekozen wordt.
    Zoek de bewerkingen zodat je 0,1,2,3,4 wijzigt naar 1,2,3,4,5

    Oplossing

  3. Schrijf de methode chooseActivity() die één activiteit kiest uit twee mogelijkheden: Elke activiteit heeft evenveel kans (50%).

    Pas het gedrag van de kat aan en controleer met "run" dat beide activiteiten willekeurig worden afgewisseld.
    Voeg ook een tweede kat toe. Wat is het verschil ?

    Oplossing

Wombats

Vertrek van het scenario leaves-and-wombats van de boek-scenario/hoofdstuk 1
Zoek een methode van WombatWorld waarmee je eenvoudig de wereld kan initialiseren met wombats en bladeren. Bewaar deze wereld.
In deze wereld met lage resolutie kan de wombat enkel verticaal en horizontaal naar een aanliggende cel bewegen.

  1. Schrijf de nieuwe methode checkKeys() die de wombat kan "besturen" met de pijltjestoetsen. De wombat wijzigt zijn looprichting naar:
    1. boven als je op de pijltoets ↑ drukt
    2. rechts als je op de pijltoets → drukt
    3. beneden als je op de pijltoets ↓ drukt
    4. links als je op de pijltoets ← drukt
    Je kan deze methode niet interactief uittesten want de methode Greenfoot.isKeyDown(..) werkt enkel in "Run"-mode. Pas dus het 'gedrag' van de wombat aan en test de methode in "Run"-mode. Merk op dat alle wombats reageren op elke pijltjestoets.
    • Om te achterhalen of een pijltjestoets werd ingedrukt, gebruik je een statische methode van de klasse Greenfoot. Zoek in de Greenfoot API (enkel in de online versie beschikbaar) hoe de vier pijltjestoetsen beschreven worden.
    • Gebruik vier if-statements of een vernestelde if-else.
    • De methodes setRotation(int rotation) en turn(int), die de wombat erft van Actor, aanvaarden elk geheel getal voor de parameter. Enkel indien je een veelvoud van 90 ingeeft, zal de beweging van de wombat behouden blijven.
      De wombat heeft een eigen methode om zijn looprichting te wijzigen. Zoek die methode en test 'interactief' dat je als parameter het getal 0,1,2 of 3 moet ingeven, anders zal er niets gebeuren.

    Oplossing

  2. Verwijder in de klasse Wombat de methodes foundLeaf() en eatLeaf() volledig. Hierdoor krijg je een fout in de methode act() - verwijder ook de aanroep van deze methodes volledig (inclusief if...else). De wombat eet nu geen blaadjes meer.
    Voeg nu de methode checkActors() toe, die een wombat een blaadje laat eten en herstel het gedrag van de wombat.
    Omdat de wombat ook moet bijhouden hoeveel blaadjes hij al gegeten heeft voeg je onderstaande regel - die intuitief duidelijk is - toe op de juiste plaats:
              leavesEaten = leavesEaten + 1;
    
    Tot slot laat je de wombat een willekeurige richting "kiezen", nàdat hij een blaadje heeft opgegeten..
    Zoek de methodes isTouching en removeTouching op in de Greenfoot API. Deze methodes zijn protected. Ga na dat je de methodes niet terugvindt in het object-menu van een wombat. Dit object-menu bevat enkel de publieke methodes. Open de editor van Wombat. Als je Ctrl-spatie indrukt krijg je álle methodes te zien die je nu kan aanroepen. Hier vind je dus ook de protected (en later ook private) methodes

    Oplossing

  3. Voeg een nieuwe actor-klasse Cactus toe. Zoek de gepaste afbeelding voor deze klasse. Als de wombat op een cactus komt, dan moet het spel stoppen. Werk dit uit als gedrag van de cactus.
    Soms loopt de Wombat nog 1 cel verder omdat de act-cyclus van elke actor nog wordt uitgevoerd. Dit moet je niet oplossen.

    Oplossing

    Onthoud: Gebruik de statische methodes van de klasse Greenfoot:
    • Aanroep van statische methode: Greenfoot.methodenaam(...)
    • Waarde invullen voor elke parameter
    • Returnwaarde verwerken, tenzij void - type