Published using Google Docs
Programmeringsopgave PacMan - IT Camp 2020
Updated automatically every 5 minutes

Programmeringsopgave PacMan

IT Camp for piger 2020

Opsætning af Greenfoot        2

Windows        2

Mac        2

Linux        7

Importer Pacman startkode        7

Eksempel på ændring i koden / Intro til greenfoot        8

Opgaver        12

Ekstra opgaver - vælg en af gangen        12

Hints til brug af Pacman og Greenfoot API’en        13

Vil du have en goodiebag?
Så udfyld navn, adresse, postnummer i spørgeskemaet her

https://forms.gle/oRyLexfynsjzjn1B6 


Opsætning af Greenfoot

Windows

Hvis du kører Windows kan Greenfoot anskaffes på følgende måde:

  1. Gå til https://www.greenfoot.org/download
  2. Klik “Standalone”, for at downloade standalone windows udgaven

  1. Når download er færdigt, udpak hele greenfoot standalone zip filen til et passende sted.

  1. Åben den udpakkede folder, og kør greenfoot.exe
  2. Greenfoot kan nu bruges

Note: Greenfoot kan også installeres gennem Windows installeren, hvis man ønsker at bruge det i længere tid.

Mac

Hvis du kører MacOS kan Greenfoot anskaffes på følgende måde:

  1. Gå til https://www.greenfoot.org/download
  2. Klik “MAC OS X”, for at downloade mac udgaven

  1. Når download er færdig dobbelt-klikker du på den downloadede .zip fil for at udpakke den.

  1. Åben den udpakkede mappe og kør Greenfoot.app
  2. Hvis du kører en af de nyeste versioner af macOS, vil din computer klage over at Greenfoot er hentet fra internettet. Tryk “Åbn” for at åbne programmet:

  1. Ligeledes spørger macOS muligvis om du vil tillade Greenfoot at modtage tastetryk. Dette kan være nødvendigt for at programmet fungerer korrekt. Tryk “Åbn Systemindstillinger” for at tillade dette:

  1. Tryk på låsen nederst til venstre for at låse op for ændringer:

  1. Skriv din computers adgangskode og tryk på “Lås op”:

  1. Nu kan du tjekke boksen af ud for Greenfoot. En besked popper op og fortæller at Greenfoot skal sluttes for at ændringerne kan træde i kraft. Tryk på “Slut nu” for at afslutte Greenfoot. Tryk evt. på låsen for at låse ændringer:

  1. Kør Greenfoot.app igen. Denne gang skulle der ikke være nogle pop-up beskeder:

Linux

Hvis du kører en Linux distribution er der god chance for at du har styr på hvordan man anskaffer greenfoot.

For Ubuntu, Debian og lignende har Greenfoot selv en installationsguide på https://www.greenfoot.org/download/installation

For Archlinux findes AUR pakken greenfoot

For andre distributioner stoler vi på du ved hvad du laver.


Importer Pacman startkode

  1. Download startkoden fra: https://drive.google.com/file/d/182Dftb5_ZQpR-Rrbu7j8X8Yb2L81HtUE/view
  2. Udpak zip filen til et passende sted
  3. I Greenfoot fra menubaren, vælg “Scenario” → “Open” → Naviger til folderen du pakkede zip filen ud i, og vælg “Open”
  4. Greenfoot skulle nu gerne have åbnet Pacman projektet.


Eksempel på ændring i koden / Intro til greenfoot

For at demonstrere workflowet i Greenfoot laver vi her en ændring i koden. Denne ændring er inkluderet i det downloadede projekt.

Lige nu står spøgelserne helt stille når spillet kører. Vi vil gerne give dem en simpel opførsel hvor

  1. Spøgelset bevæger sig lige ud indtil det rammer en væg
  2. Når det rammer en væg skifter den til en tilfældig ny retning.

Lad os lave den ændring.

Vi åbner Ghost klassen ved at dobbeltklikke på dens ikon i klassediagrammet

Med dette åbner editoren med Ghost klassen

For at tilføje den ønskede opførsel tilføjer vi et nyt metodekald i act(). act() bliver kaldt hver gang “Act” knappen i Greenfoot vinduet bliver klikket, eller kontinuerligt hvis “Run” knappen er blevet klikket.

Vi tilføjer et kald til act(), kaldet moveRandom()

Greenfoot beklager sig fordi metoden ikke findes, så vi opretter den nedenunder funktionen killPacman()

 

Vi kan nu begynde at implementere funktionaliteten.

  1. Spøgelset bevæger sig lige ud indtil det rammer en væg

Vi laver i moveRandom() et kald til metoden moveInDirectionIfPossible(), som er defineret i MoveableActor. moveInDirectionIfPossible() tager en parameter som er retningen actoren skal forsøge at bevæge sig i. Siden vi gerne vil bevæge os i den samme retning husker vi dette i en feltvariabel som vi kalder currentDirection

Hvis vi klikker “Run” nu vil alle spøgelserne begynde at bevæge sig mod højre indtil de rammer en mur.

Vi kan nu tilføje den anden del af opførelsen

  1. Når det rammer en væg skifter den til en tilfældig ny retning.

Hvis spøgelset rammer en mur kan det ikke længere bevæge sig i den retning.

Metoden moveInDirectionIfPossible() returnerer en boolean (true/false) om det lykkedes at bevæge sig. Den kan vi bruge til at vurdere om en ny retning er nødvendig.

Vi opbevarer om bevægelse lykkedes i en lokal boolean variabel

Og vi kan nu tilføje en if sætning

If sætninger fungerer sådan, at hvis indholdet i parenteserne evaluerer til sandt, så bliver koden i tuborg-parentesen kørt. “!” er et udtryk som betyder “ikke”. Altså, hvis det ikke lykkedes at bevæge sig, skal vi køre det indre kode.

Hvis dette sker skal vi sætte en ny tilfældig retning.

Til at vælge en tilfældig retning kan vi bruge Greenfoot.getRandomNumber(int limit), som returnerer et tilfældigt tal fra 0 (inklusiv), op til, men ikke inkluderende limit. Vi vil gerne have en tilfældig retning ud af fire, alle i en 90 graders vinkel. Derfor kan vi skrive:

Hvis vi nu klikker “Run” opfører spøgelserne som forventet. De bevæger sig til de rammer en væg, skifter retning, og bevæger sig så igen.


Opgaver

  1. Styr Pacman med piletaster
  2. Få Pacman til at spise ost
  3. Få spøgelser til at dræbe Pacman

Ekstra opgaver - vælg en af gangen

Lav to-player spil

  1. Styr Pacman med andre taster
  2. Fjern alle spøgelser - undtagen ét
  3. Styr spøgelset med andre piletaster
  4. Udskriv hvem der vinder

Lav labyrinten om

  1. Byt rundt på væggene
  2. Placér ostene et andet sted

Kom lyde på spillet

  1. Lav din egen lyd fil eller hent en fra nettet

HINT: Greenfoot har indbygget optager (tools>Show Sound Recorder)

  1. Afspil en lyd - fx når Pacman spiser en ost

        HINT: Greenfoot har en lyd-klasse; GreenfootSound

Få Pacman til at bevæge sig hurtigere end Spøgelserne

  1. Find den linje der faktisk bevæger Pacman (led i MoveableActor)
  2. Find den linje der faktisk bevæger Spøgelserne (led i MoveableActor)
  3. Find på en ændring, så Pacman går hurtigere end spøgelserne.

Lav noget du selv synes kunne være sjovt! Man kan nærmest lave ALT.


Hints til brug af Pacman og Greenfoot API’en

I spillet nedarver Pacman fra MoveableActor. Det betyder at Pacman klassen kan gøre brug af metoder fra MoveableActor. I denne klasse kunne følgende metoder være af interesse:

Metodenavn mm.

Forklaring

endGameIfDone();

Tjekker om alle oste er blevet spist eller Pacman ikke længere findes. I så fald viser en passende besked og stopper spillet.

moveInDirectionIfPossible(UP);

Tjekker om actoren (Pacman eller Ghost) kan bevæge sig i en bestemt retning, og bevæger sig så i den retning hvis det kan lade sig gøre. Returnerer om det lykkedes at bevæge sig. Tager en retning i grader som parameter. Her kan følgende konstanter bruges:

UP

DOWN

LEFT

RIGHT

Konstanter som beskriver de fire mulige retninger en actor kan bevæge sig i spillet.

Kan bruges som parameter, eks: moveInDirectionIfPossible(DOWN);

Vinklen de holder er grader i urets retning, startende med pegende mod højre som 0 grader.

Følgende er nyttige metoder fra de forskellige klasser som Greenfoot tilgængeliggører:

Klassenavn.Metodenavn

Forklaring

Greenfoot.isKeyDown(“W”);

Tjekker om en bestemt tast på tastaturet er trykket ned. Almindelige bogstaver kan tjekkes med deres bogstav, eg. “S”. Piletaster kan tjekkes med “UP”, “LEFT” osv

Eksempel:

if (Greenfoot.isKeyDown(“F”)){

    // Do thing

}

removeTouching(Cheese.class);

Fjerner alle objekter af en given klasse, som det kaldende objekt berører.

Eksempel:

removeTouching(Wall.class);

//Fjerner alle Wall objekter som den kaldende Actor berører

isTouching(Cheese.class);

Tjekker om den kaldende Actor berører et objekt af given klasse. Returnerer en boolean (true or false)

Eksempel:

if (isTouching(Wall.class)){

    // Ran into a wall,

    // play bonk noise.

}

move(1);

Bevæger en actor fremad en bestemt afstand

Eksempel:

move(2);

// Move 2 units forward.

GreenfootSound

En klasse som håndterer lyde, og afspilning af lyde.

Eksempel:

private GreenfootSound wallHitSound = new GreenfootSound("sounds/bonk.mp3");

GreenfootSound.play();

Afspiller lyden som objektet holder.

Eksempel:

wallHitSound.play();

Hvis du ikke kan finde det du leder efter her, kan den fulde API findes på:

https://www.greenfoot.org/files/javadoc/

♥ IT Camp