Oppgaven handler om spillet Sokoban (prøv spillet her). Sokoban består av et brett med 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.
![](/wiki/plugins/servlet/confluence/placeholder/unknown-macro?name=metadata-list&locale=en_US&version=2)
Sokoban forklares enklest ved demonstrasjon (for en nærmere forklaring, se http://sokobano.de/wiki/index.php?title=Main_Page):
Brett som bilde | Brett som teskt | Forklaring |
---|---|---|
####### #.@ # # #$* $ # # $ # # .. # # * # ####### | Utgangsposisjon for et brett | |
####### #. # # #$* $ # # $@ # # .. # # * # ####### | Spilleren har flyttet en boks mot venstre / øst | |
####### #*$ # # # @ $ # # $ # # .. # # * # ####### | Spilleren har skjøvet en boks mot en vegg og kan ikke lenger flytte den | |
####### #* # # # * # # # # **@ # # * # ####### | Spilleren har plassert alle boksene på et mål og har vunnet spillet |
Implementasjon av Sokoban
Sokoban-oppgaven er en åpen oppgave, hvor man selv velger løsninger for hvordan spillet skal implementeres. Det stilles likevel følgende krav:
- Programmet må bestå av minst tre klasser; en klasse for å representere et felt på brettet, en klasse for brettet med ruter og ett hovedprogram for interaksjon med spilleren.
- Brett-klassen må kunne ta inn et vilkårlig brett som en array av strenger (String[], se format i brettene oppgitt i Java-filen under).
- Brett-klassen må ha en toString()-metode som skriver ut brettet i formatet vist i tabellen nedenfor.
- Spillet må kunne spilles gjennom konsollen. Dvs. at en spilleren må kunne skrive instruksjoner i konsollen, som deretter utføres i spillet.
Tegn | Betydning | Utskrift |
---|---|---|
'#' | vegg | ####### #. # # #$* $ # # $@ # # .. # # * # ####### |
'.' | mål | |
'$' | boks | |
'*' | boks på mål | |
'@' | spiller | |
'+' | spiller på mål | |
' ' | tomt felt |
Hint:
- I representasjonen av brettet kan det være lurt å skille mellom de faste (vegger ++) og de bevelige (spilleren ++) delene av brettet
- For interaksjon med spilleren er det lurt å bruke en Scanner.
- Det er vanlig å bevege en spiller med tastene a, s, d og w, som representerer henholdsvis venstre (vest), ned (sør), høyre (øst) og opp (nord).
Det ligger fire testbrett du kan bruke i filen: objectstructures/SampleLevels.java. Ved å kalle Sokoban(SampleLevels.level3) vil du opprette brettet vist i tabellen over.
Vurdering
Oppgaven blir vurdert etter hvorvidt spillet kan
- Nivå 0 (10%): skrive ut brettet ved oppstart.
- Nivå 1 (30%): flytte spilleren (med input fra brukeren) i et tomt brett; altså ingen vegger, bokser eller mål.
- Nivå 2 (40%): utvide med vegger, men fortsatt ingen bokser eller mål.
- Nivå 3 (60%): utvide med bokser som kan flyttes, men ingen mål.
- Nivå 4 (80%): full støtte for alt ruteinnhold.
- Nivå 5 (100%): logikk for spillets gang, dvs. oppdage at alle målrutene er dekket av bokser.
Hvert nivå innbærer at all funksjonalitet i nivåene under fungerer som beskrevet.
Eksempel
Eksempel på et fungerende spill (Samplelevels.level4) spilt gjennom konsollen (input er vist i grønt):