Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Oppgaven handler om spillet Sokoban. Sokoban består av et brett som inneholder mål, bokser, vegger og en spiller. Spilleren skal forsøke å flytte alle boksene til et mål. Spilleren vinner spillet når alle boksene står på et mål.

Oppgaven omfatter tre klasser, Cell, Sokoban og SokobanProgram. Cell Cell, Sokoban og SokobanProgramCell-klassen representer hvert enkelt felt på brettet og dekkes av del 1. Del 2 omfatter Sokobanomfatter Sokoban-klassen, som kapsler inn brettet og har metoder for å utføre trekk og sjekke om spillet er avsluttet. Begge disse dele har har JExercise-tester. SokobanProgram SokobanProgram-klassen lages i del 3 og håndterer tekstbasert interaksjon og bruker Sokoban-klassen. Her skal spilleren taste inn ønsket trekk etter tur helt til man har vunnet eller gir opp. 

Del 1 - Representasjon av felter (15 %)

Denne klassen er en hjelpeklasse for å holde styr på verdien til hvert enkelt felt på brettet.

Tilstanden til en Cell er et tegn, e.g. ’#’ for vegg eller ’+’ for spiller, samt posisjon på brettet, angitt som x- og y- koordinater.

...

TegnBetydning

'#'

vegg
'.'mål
'$'boks
'*'boks på mål
'@'spiller
'+'spiller på mål
' 'tomt felt

Cell-klassen må ha følgende metoder:

  • void RemoveBox() - fjerner  – fjerner en boks fra feltet.
  • void RemovePlayer() –fjerner – fjerner spilleren fra feltet.
  • void AddPlayer() – setter spilleren på feltet.
  • boolean isTarget() – returnerer hvorvidt feltet er et mål eller ikke.
  • boolean isFree()  - returnerer  – returnerer hvorvidt det er mulig å flytte en boks eller spilleren til feltet.
  • boolean containsPlayer() -  returnerer  – returnerer om spilleren står på feltet.
  • boolean containsBox()  - returnerer  – returnerer om en boks står på feltet.
  • String toString() – skriver tegnet på feltet til en streng.
  • int getX(), getY() - returnerer  – returnerer henholdsvis x- og y- koordinatene til feltet

...

Implementer støtte for tilstand og metoder beskrevet over slik at JExercise-testkoden fullfører feilfritt. Testkoden finner du her: 

Del 2 – Logikk og representasjon av brett (60 %)

Tilstanden i Sokoban-klassen må holde rede på flere ting. Man må håndtere hvordan brettet ser ut til enhver tid. Videre må man holde styr på hvor målene på brettet befinner seg. Spillerens posisjon må også lagres.

Det finnes mange ulike brett av forskjellig størrelse. Tilstanden bør derfor lagre størrelsen på brettet, både høyde og bredde. Brettet utgjør et koordinatsystem med følgende innhold:

*###########*
#           ## 
#           #
... ... 
## 
 #
*$$ $.$ 
##
 #
# $*+$ $*$$
## 
 #
*$$ $.$ 
## 
 #
...  .  
##          
 #
#           #
*###########* 

 

 

 

 

Et trekk ned (sør) gir følgende brett

*###########*
#           ## 
#           #
... ... 
## 
 #
*$$ $.$ 
##
 #
# $*.$ $*$$
## 
 #
*@$ $.$ 
## 
 #
.*.  .  
##          
 #
#           #
*###########*

Sokoban-klassen må ha følgende metoder:

  • Sokoban(String[]) – konstruktøren skal ta inn en array med strenger som utgjør brettet. Strengene må leses og angi starttilstanden for hvert felt på brettet.
  • boolean canMove(int) – denne metoden tar inn en retning og angir om spilleren kan bevege seg i denne retningen eller ikke.
  • void doMove(int) – denne metoden tar inn en retning og flytter spilleren og en eventuell boks i den angitte retningen på brettet.
  • boolean hasWon() – denne metoden returnerer hvorvidt spilleren har vunnet eller ikke; med andre ord om alle målene har bokser på.
  • String toString() – denne metoden returnerer brettet som en streng, hvor hver linje er adskilt med ”\n”.

...