You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 38 Next »

Oppgaven handler om spillet Sokoban (prøv spillet her). Sokoban består av et brett med vegger, tomme ruter, målruter, bokser og en spiller. Spilleren skal forsøke å flytte boksene til hver sine målrute. Spilleren har klart brettet når alle boksene står på en målrute.

Sokoban forklares enklest ved demonstrasjon:

Brett som bildeBrett som tekstForklaring
#######
#.@ # #
#$* $ #
#   $ #
# ..  #
#  *  #
#######

Utgangsposisjon for et brett, med tomme ruter (' '), vegger ('#'), målruter ('.'), bokser ('$' og '*') og spilleren ('@'). En boks som står på en tom rute er rød ('$'), en boks på en målrute er grønn ('*').

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

Spilleren beveget seg litt og så dyttet en boks mot venstre / vest.

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

Spilleren har skjøvet en boks mot en vegg og kan ikke lenger flytte den, så spillet er låst og tapt (ihvertfall uten angre-mulighet).

#######
#* # #
# * #
#   #
# **@ #
#  *  #
#######

Spilleren har plassert boksene på hvert sitt mål og har klart brettet.

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 to klasser; en klasse for å representere (innholdet i) en rute på brettet, og en spillklasse for brettet med ruter. Disse må være ordentlig innkapslet.
  • Spillet må kunne spilles via JavaFX-applikasjonen som spesifisert under.
  • Spillklassen må kunne initialiseres med en String på standard-formatet , som beskrevet i tabellen under.
  • Spillklassen må ha en toString()-metode som returnerer en String på samme format som brettet initialiseres med.
Standard-formatet
TegnBetydningUtskrift

'#'

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 (tomme ruter, målruter og vegger) og de flyttbare (bokser og spiller) delene av brettet.
  • Det er vanlig å bevege en spiller med tastene a, s, d og w, for henholdsvis venstre (vest), ned (sør), høyre (øst) og opp (nord).
Det ligger fire testbrett du kan bruke i filen: SokobanSampleLevels.java. Ved å kalle Sokoban(SampleLevels.SAMPLE_LEVEL3) vil du opprette brettet vist i tabellen over.

JavaFX-applikasjon

Det er laget en JavaFX-applikasjon som i praksis gjør to ting: den tar inn tekstlig input fra brukeren og endrer tilstanden i spillklasse-objektet basert på dette, og den viser spillklassens toString()-metode i applikasjonsvinduet. For at applikasjonen skal være kjørbar med spillklassen, må følgende gjøres:

  • GameController, deklarer spillet ditt og initialiser det slik kommentarene i koden forklarer. 
  • I spillklassen, lag en metode void getInput(String in), som tar inn bruker-input (som kommer fra applikasjonen), og endrer tilstanden på spillet tilsvarende. Her kommer det altså inn posisjonen for neste trekk, som så skal bli utført. Formatet på strengen er valgfritt, men det er anbefalt å bruke standarden, som er a, s, d og w.
  • Når spillet er ferdig, skal spilleren få vite dette. GameController bruker spillklassens toString()-metode for å vise spillets tilstand. Oppdater denne metoden slik at den også gir beskjed om at spillet er over når dette skjer.

Du kan nå kjøre applikasjonen (Game.fxml > Run As > FXML Application) og teste spillet ditt.

Met hjelp til kjøring av JavaFX og generelt om øvinger finner du i Hjelp til øvinger.

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 lavere nivåene fungerer som beskrevet.

  • No labels