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

Compare with Current View Page History

« Previous Version 9 Next »

Oppgaven handler om en Sokoban-klasse som holder representasjon, logikk og funksjonalitet for å spille spilllet Sokoban gjennom konsollen.

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.

Sokoban forklares enklest ved demonastrasjon (for en nærmere forklaring, se http://sokobano.de/wiki/index.php?title=Main_Page):  

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

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 lese av brett på samme format som brettene oppgitt i Java-filen under.
  • Brett-klassen må ha en toString()-metode som skriver ut brettet slik det er beskrevet under.
  • Spillet må kunne spilles gjennom konsollen. 

 

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 (vegger ++) og de bevelige (spilleren ++) delene av brettet
  • For interaksjon med spilleren er det lurt å bruke en Scanner.
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):

 


JExercise lar deg sjekke din egen kode vha. forhåndslagde JUnit-tester og JExercise-panelet

Bruk av JExercise:

  1. Sørg for at jexercise-standalone.jar er lagt til i ditt prosjekts Build Path. Dette må gjøres hver gang du oppretter et nytt prosjekt, og det er derfor lurt å gjenbruke samme prosjekt til alle oppgaver.
  2. JExercise-tillegget må være installert. Installer tillegget fra følgende oppdateringsadresse: http://folk.ntnu.no/hal/dev/updatesite.
  3. Åpne JExercise-panelet via Window -> Show View -> Other, og navigere deg fram til JExercise i vinduet som kommer opp, velge det og klikke OK.
  4. Klikke og dra oppgavens testklasse, <oppgavenavn>Test.java fra pakkeoversikten og slippe den i JExercise panelet. 
  5. Testene kan så kjøres ved å dobbeltklikke på testen som ønskes kjørt.

Ved trøbbel, se først om du finner løsningen i Løsninger på trøbbel med JExercise.

Unknown macro: {html}

Twitre gjerne om oppgaven når du er ferdig: <a href="https://twitter.com/share" class="twitter-share-button" data-hashtags="jexercise">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>

 

 

  • No labels