Spillet PacTroll
Lov på eksamen
- Datamaskin med programmeringsverktøy
- Lærebok, dokumentasjon og egne notater og programmer
Ikke åpent internett (bare noen utvalgte nettressurser), kommunikasjon med andre eller kunstig intelligens.
Kan den løses uten PC?
1 av 2 deloppgaver kan løses uten PC.
Fra 2027 er det bare kalkulator og skriftlige hjelpemidler på del 2. Vurderingen er gjort med KI og kan inneholde feil.
I denne oppgaven skal du utvikle et spill som vi har kalt PacTroll. Du bør sette av om lag to timer til denne oppgaven.
Spillet starter med et spillbrett (svart hovedboks), et troll (grønn boks merket T) og tre matbiter (gule bokser merket M) – se illustrasjonen nedenfor til venstre. Trollet skal bevege seg på spillbrettet og spise så mange matbiter som mulig. Trollet har en konstant fart og kan ikke stoppes, men spilleren styrer retningen ved å bruke tastaturet. Hver gang en matbit spises, blir den gjort om til en hindring (grå boks merket H), og en ny matbit plasseres ut på spillbrettet – se illustrasjonen nedenfor til høyre.
Hvis trollet treffer en av hindringene eller spillbrettets kanter, avsluttes spillet.

Funksjonelle krav:
- Ved oppstart skal grensesnittet se ut omtrent som i illustrasjonen ovenfor til venstre. Spillet skal bestå av et spillbrett, et trollobjekt og tre matobjekter. (Du kan utelate bokstavene på boksene.)
- Ved oppstart plasseres matobjektene på tre tilfeldige plasseringer på spillbrettet, og trollobjektet plasseres i sentrum. Ingen objekter skal være oppå hverandre.
- Trollobjektet beveger seg i rolig hastighet i en retning, enten opp, ned, til venstre eller til høyre. Retningen trollobjektet beveger seg i, styres med piltaster (alternativt tastene W, S, A og D).
- Når trollobjektet treffer et matobjekt, skal det følgende skje:
- Spilleren får et poeng.
- Matobjektet gjøres om til et hindringsobjekt som trollobjektet ikke skal treffe igjen.
- Et nytt matobjekt opprettes et tilfeldig sted på spillbrettet, slik at det alltid er tre matobjekter på spillbrettet. Nye matobjekter skal ikke plasseres på allerede eksisterende objekter.
- Farten til trollobjektet økes.
- Antallet poeng spilleren har, skal hele tiden være synlig i grensesnittet.
- Spillet avsluttes om trollobjektet treffer en av spillbrettets kanter eller et av hindringsobjektene.
Lag et klassediagram der du definerer nødvendige klasser, med egenskaper og metoder, for å implementere/lage spillet.
Implementer/lag spillet i samsvar med klassediagrammet fra a.
Fasit
For eksempel en abstrakt superklasse SpillObjekt med posisjon, størrelse og farge og metodene tegn() og kolliderer(). Subklassene Troll, Mat og Hindring arver fra den. Troll har fart og retning og metoder for å bevege seg, endre retning og øke farten. Spillbrett består av spillobjektene, holder poengsummen og styrer spillet (plassere ny mat, sjekke kollisjoner, avslutte).
LøsningsforslagKI-generert
Det finnes mange gode klassediagrammer for dette spillet. Diagrammet nedenfor er ett forslag.

Hver boks har tre felt: klassenavnet, egenskapene med datatype og metodene. - betyr privat, # beskyttet (tilgjengelig for subklassene) og + offentlig.
Superklassen SpillObjekt. Troll, matbiter og hindringer er alle firkanter med en posisjon, en størrelse og en farge, og alle skal tegnes. Felles egenskaper og metoder samles derfor i én superklasse. Metoden kolliderer(annet) sjekker om to objekter overlapper. Den brukes både når trollet treffer mat eller hindringer og når vi plasserer nye objekter, som ikke skal ligge oppå andre. Klassenavnet står i kursiv fordi klassen er abstrakt: Vi lager aldri et objekt av selve SpillObjekt, bare av subklassene.
Arv. Pilene med hul trekant viser at Troll, Mat og Hindring arver fra SpillObjekt. Hver subklasse har dermed posisjon, størrelse, farge, tegn() og kolliderer() uten at koden skrives på nytt. Subklassene får hver sin farge (grønn, gul og grå).
Trollharfartog en retning (retningXogretningY, med verdiene , eller ).beveg()flytter trolletfartpiksler i retningen hver gang spillet oppdateres. Trollet kan ikke stoppes, så det finnes ingen stoppmetode.endreRetning(tast)kalles ved trykk på piltastene eller W, A, S og D.økFart()kalles hver gang trollet spiser en matbit, ogutenforBrett()sjekker om trollet har truffet kanten.Mathar ingen egne egenskaper.blirHindring()lager en hindring på samme sted som matbiten.Hindringhar verken egne egenskaper eller metoder. Den står stille, og det eneste som skiller den fra de andre objektene, er fargen og at kollisjon avslutter spillet. Klassen trengs likevel, slik at programmet kan skille hindringer fra matbiter.
Komposisjon. Linja med fylt rombe ved Spillbrett betyr at spillbrettet består av spillobjektene. Objektene hører til brettet og finnes ikke uten det. Multiplisiteten 4..* viser at det alltid er minst fire objekter (ett troll og tre matbiter), og at antallet vokser etter hvert som det blir flere hindringer. Spillbrett holder objektene i egenskapene troll, matbiter og hindringer.
Klassen Spillbrett har ansvaret for selve spillet:
breddeoghøydeer brettets størrelse, ogpoenger spillerens poengsum, som vises medvisPoeng().start()plasserer trollet i sentrum og kallerleggTilMat()tre ganger.ledigPosisjon()trekker tilfeldige posisjoner til den finner en som ikke overlapper noe annet objekt.oppdater()kjøres i spill-løkka: Den flytter trollet, kallersjekkKollisjoner()og tegner alt på nytt medtegn().sjekkKollisjoner()avslutter spillet (avslutt(),spillSluttsettes til sann) hvis trollet er utenfor brettet eller treffer en hindring. Treffer trollet en matbit, kallesspisMat(mat).spisMat(mat)øker poengsummen med 1, gjør matbiten om til en hindring, flytter den framatbitertilhindringer, kallerleggTilMat()slik at det alltid er tre matbiter, og øker farten til trollet.
Diagrammet dekker dermed alle de funksjonelle kravene. Et alternativ er å la Mat og Hindring være én klasse med en egenskap erHindring. Det gir færre klasser, men egne klasser gjør koden tydeligere og lettere å utvide.