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

Compare with Current View Page History

« Previous Version 33 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 (for en nærmere forklaring, se her):  

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 tre klasser; en klasse for å representere (innholdet i) en rute på brettet, en klasse for brettet med ruter og et hovedprogram for interaksjon med spilleren. De to første av disse må være ordentlig innkapslet.
  • Spillet må kunne spilles gjennom konsollen. Dvs. at en spilleren må kunne skrive instruksjoner i konsollen, som deretter utføres i spillet.
  • Brett-klassen må kunne initialiseres med en String på standard-formatet , som beskrevet i tabellen under.
  • Brett-klassen 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.
  • For interaksjon med spilleren er det lurt å bruke en Scanner.
  • 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: objectstructures/Sokoban/SampleLevels.java. Ved å kalle Sokoban(SampleLevels.SAMPLE_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 lavere nivåene fungerer som beskrevet.

Eksempel

Eksempel på et fungerende spill (Samplelevels.SAMPLE_LEVEL4) spilt gjennom konsollen (input er vist i grønt):

JavaFX-app

Konsollbasert IO er greit for å teste spillet, men det er kanskje artigere å lage en ordentlig app, med grafisk visning av rutenettet og bruk av piltastene for styring av spilleren. Vi har laget en JavaFX-basert app, som du kan laste ned og koble til dine Sokoban-klasser. App-koden forutsetter at spill-logikken er implementert i en klasse som implementerer ISokoban-grensesnittet (i pakken games.sokoban.sokoban1). Når brukeren starter spillet, så lages det en instans av spillklassen din i app-en, og det er denne som holder rede på spill-tilstanden, dvs. hvordan rutenettet ser ut, hvor spilleren er osv. Med bruk av grensesnitt, så gjøres det klart hvilke metoder appen trenger og som du må implementere.

Last først ned ISokoban-grensesnittet fra /games/sokoban/sokoban1/ISokoban.java, og programmer din spill-klasse slik at den implementerer dette grensesnittet. Så laster du ned app-klassene (og filene), så du kan prøve om det virker:

Fil-tre som må lastes ned evt. importeres med Digital Compendium-panelet
emfs
/games/ #java #package
    FxmlApp.java                 @ git@github.com:hallvard/javafx/games/src/games/FxmlApp.java;
    FxmlBuilderFactory.java     @ git@github.com:hallvard/javafx/games/src/games/FxmlBuilderFactory.java;
    FxmlGame.java                @ git@github.com:hallvard/javafx/games/src/games/FxmlGame.java;
    imagegrid/ #java #package
        ImageGrid.java        @ git@github.com:hallvard/javafx/games/src/games/imagegrid/ImageGrid.java;
        ImageGridGame.java        @ git@github.com:hallvard/javafx/games/src/games/imagegrid/ImageGridGame.java;
        ;
    sokoban/ #java #package
        sokoban1/ #java #package
            SokobanFX.java    @ git@github.com:hallvard/javafx/games/src/games/sokoban/sokoban1/SokobanFX.java;
            SokobanFX.fxml    @ git@github.com:hallvard/javafx/games/src/games/sokoban/sokoban1/SokobanFX.fxml;
            ;
        box_on_target16x16.png    @ git@github.com:hallvard/javafx/games/src/games/sokoban/box_on_target16x16.png;
        box16x16.png            @ git@github.com:hallvard/javafx/games/src/games/sokoban/box16x16.png;
        empty16x16.png            @ git@github.com:hallvard/javafx/games/src/games/sokoban/empty16x16.png;
        player_on_target16x16.png    @ git@github.com:hallvard/javafx/games/src/games/sokoban/player_on_target16x16.png;
        player16x16.png            @ git@github.com:hallvard/javafx/games/src/games/sokoban/player16x16.png;
        target16x16.png            @ git@github.com:hallvard/javafx/games/src/games/sokoban/target16x16.png;
        wall16x16.png            @ git@github.com:hallvard/javafx/games/src/games/sokoban/wall16x16.png;

Merk at du godt kan la være bruke å ISokoban-grensesnittet, men da må du omprogrammere appen, så den bruker andre metoder enn vi har forutsatt. Det er nok mer arbeid, men kanskje enda mer lærerikt?

 

  • No labels