Spillet Manic Mansion
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.
Manic Mansion
I denne oppgaven skal du utvikle et spill som heter Manic Mansion.
I Manic Mansion styrer spilleren et menneske som prøver å hente hjem sauene sine en etter en. På veien må mennesket ta seg forbi hindringer og unngå å bli tatt av spøkelser.
Spillet starter med et spillebrett, et menneske, et spøkelse, tre hindringer og tre sauer. Mennesket skal styres av spilleren, og målet med spillet er å komme seg over på den andre siden av brettet og hente en sau flest mulig ganger uten å være i kontakt med noen av spøkelsene.
Krav
- Ved oppstart skal spillet bestå av et spillebrett, et menneskeobjekt, et spøkelsesobjekt, tre hindringsobjekter og tre saueobjekter.
- Det skal være en liten frisone både på venstre og høyre side av spillebrettet hvor kun mennesker og sauer kan oppholde seg, mens det ikke kan være spøkelser eller hindringer der.
- Spøkelses- og hindringsobjektene plasseres på tilfeldige steder på spillebrettet, menneskeobjektet i frisonen på venstre side av spillebrettet og sauene på tilfeldige steder i frisonen på høyre side av spillebrettet. Ingen objekter skal være oppå hverandre.
- Ulike typer objekter skal være visuelt forskjellige.
- Menneskeobjektet starter i ro og kan bevege seg i rolig hastighet opp, ned, til venstre eller til høyre. Retningen styres med piltaster (alternativt tastene W, S, A og D).
- Spøkelsesobjektene starter på et tilfeldig sted på spillebrettet, men altså ikke i noen av frisonene. Spøkelsesobjektene beveger seg med konstant fart i en tilfeldig retning. Spøkelsesobjektene kan bevege seg på skrå i flere forskjellige vinkler. Når et spøkelse treffer kanten av spillebrettet eller kanten på en av frisonene, endrer spøkelset retning. Spøkelset blokkeres ikke av hindringer eller av andre spøkelser, men går tvers gjennom dem.
- Når menneskeobjektet treffer en hindring eller kanten av spillebrettet, blokkeres menneskeobjektet helt til retningen endres.
- Når menneskeobjektet treffer et saueobjekt, skal det følgende skje:
- Saueobjektet fjernes fra spillebrettet (dette representerer at mennesket bærer sauen). (Alternativt: Saueobjektet «festes» til menneskeobjektet og følger menneskeobjektets bevegelser.)
- Farten til menneskeobjektet reduseres.
- Fram til saueobjektet er levert på den andre siden, vil en kollisjon mellom menneskeobjektet og et annet saueobjekt føre til at spillet stoppes.
- Når menneskeobjektet kommer tilbake til startsonen på venstre side av spillebrettet, skal det følgende skje:
- Spilleren får et poeng.
- Farten til menneskeobjektet økes til samme fart som ved spillets start.
- Et nytt saueobjekt plasseres et tilfeldig sted i frisonen til høyre på spillebrettet.
- Et nytt spøkelsesobjekt og et nytt hindringsobjekt plasseres på tilfeldige steder på spillebrettet.
- Når menneskeobjektet, med eller uten sau, treffer et spøkelsesobjekt, skal spillet stoppes.
Oppdrag
På figuren under ser du et forslag til en objektorientert modell for spillet.

Forklar modellen.
Ta utgangspunkt i modellen, gjør tilpasninger av egenskaper og metoder der du mener det er nødvendig, og implementer spillet slik det er beskrevet i kravene. Tilpasningene du gjør, skal dokumenteres med kommentarer i programkoden.
Fasit
Abstrakt superklasse SpillObjekt med posisjon og metodene plassering og flytt. Fire subklasser arver fra den: Menneske, Spøkelse, Hindring og Sau. Spillebrett har størrelse og en liste med spillobjekter (komposisjon) og metoder for å legge til og fjerne objekter.
LøsningsforslagKI-generert
Oversikt. Modellen er et UML-klassediagram med seks klasser. Hver boks har tre felt: klassenavnet, egenskapene (attributter med datatype) og metodene (med parametertyper).
Arv. SpillObjekt er superklassen. Navnet er skrevet i kursiv, som betyr at klassen er abstrakt. Det skal ikke lages objekter av selve SpillObjekt, bare av subklassene. Pilene med hul trekant peker fra Menneske, Spøkelse, Hindring og Sau til SpillObjekt. Det betyr at de fire klassene arver fra superklassen. Alle spillobjektene får dermed egenskapene xPosisjon og yPosisjon og metodene plassering(int, int) og flytt(int, int). Felles kode skrives én gang, og brettet kan behandle alle objektene likt.
Komposisjon. Linjen mellom SpillObjekt og Spillebrett har en fylt rombe ved Spillebrett og teksten «inneholder». Det er komposisjon: spillebrettet består av spillobjekter. Objektene lever bare så lenge brettet finnes. Spillebrett har egenskapene høyde, bredde og objekter (en liste med SpillObjekt). Metodene leggTilObjekt og fjernObjekt legger til nye objekter (ny sau, nytt spøkelse og ny hindring etter poeng) og fjerner objekter (sau som blir hentet).
Subklassene:
Menneskeharfart,poengogbærerSau. Metodene erbeveg(int, retning)for styring med piltastene,reduserFartogøkPoeng,bærSau(Sau)når mennesket henter en sau, ogsjekkKollisjon()som finner ut om mennesket treffer en hindring, en sau, et spøkelse eller kanten.SpøkelseharendreRetning(), som brukes når spøkelset treffer kanten av brettet eller en frisone.Hindringhar ingen egne egenskaper. Den står stille.SauharblirBåretog metodeneblirLøftet()ogfjernSau().
Polymorfi. plassering(int, int) står i superklassen og igjen i alle subklassene. Det betyr at subklassene overstyrer metoden. Reglene for startplassering er ulike: mennesket i venstre frisone, sauene tilfeldig i høyre frisone, og spøkelser og hindringer tilfeldig utenfor frisonene.
Svakheter som kan rettes i b). Spøkelse mangler egenskaper for fart og retning (for eksempel dx og dy), selv om spøkelset beveger seg med konstant fart på skrå. sjekkKollisjon() kunne ligget i SpillObjekt, siden kollisjonstesten er den samme for alle objekter. Sau har både blirBåret og Menneske.bærerSau, så den samme informasjonen lagres to steder. Modellen har heller ingen klasse eller metode som styrer selve spillet (spill-løkke, tastetrykk, poengvisning og avslutning).