Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: 2017-versjon med JavaFX

...

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 to klasser; en klasse for å representere (innholdet i) en rute på brettet, og en klasse spillklasse for brettet med ruter og et hovedprogram for interaksjon med spilleren. De to første av disse . 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.via JavaFX-applikasjonen som spesifisert under.
  • Spillklassen Brett-klassen må kunne initialiseres med en String på standard-formatet , som beskrevet i tabellen under.
  • Brett-klassen 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

...

  • 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 kan det være 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: 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

...

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):

Image RemovedImage RemovedImage Removed

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, 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:

Code Block
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!