Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Excerpt
med

 

I denne oppgaven vil vi gå ut ifra allerede implementerte spill. Vi vil legge til nye funkjoner kommandoer og anvende grensesnitt-mekanismen. Vi vil bygge på oppgavene SudokuTicTacToeSokoban og TicTacToe og Sudoku

Del 1

Her skal du implementere kommandoer for å angre og gjenta funksjoner. Hvis du velger å angre trekket ditt, (eng: undo) handlinger (legg, trekk, ...) og gjenta (eng: redo) handlinger som er angret. Hvis brukeren angrer en handling, så skal spillet settes tilbake til den forgje tilstanden det hadde før du gjorde siste trekk. Ved å velge gjenta vil det trekket du forrige tilstanden, dvs. tilstanden før handlingen. Dersom brukeren gjentar en handling (altså angrer angringen) vil handlingen som brukeren angret bli utført på nytt.Du kan se på trekkene dine som to LIFO-køer. Ved angring pop'er du trekk fra den ene LIFO-køen til en annen som vil kunne inneholde angrede trekk. Når du gjentar et trekk vil du pop'e de tilbake igjen. 

Angre- og gjenta-logikken kan implementeres med to Stack-objekter som inneholder "handling"-objekter, dvs. objekter som inneholder informasjon om en brukerhandling. Når en handling er utført så legges den på angre-stack'en. Ved angring tas det øverste elementet av angre-stack'en, handlingen som dette objektet representerer reverseres og legges på gjenta-stack'en. Ved gjenta, så tas det øverste elementet av gjenta-stack'en, handlingen som dette objektet representerer utføres og legges (tilbake) på angre-stack'en. For å implementere angre og gjenta må en altså:

  • finne en måte å representere brukerhandlinger, dvs. lage en klasse som kan lagre informasjon om handlinger
  • implementere logikk for å reversere og gjenta handlingen som slike objekter representerer
  • administrere angre- og gjenta-stack'er som forklart over (eller tilsvarende logikk)

Del 2

I denne delen skal du definere et grensesnitt. Grensesnittet skal dekke lagring av spillet ditt til fil. Det skal også dekke lesing av en fil med et allerede lagret spill.

Del 3

I denne delen skal du lage en klasse som implementerer grensesnittet fra del 2. Klassen skal kunne lagret spillets nåværende tilstand til en fil. Den skal også kunne lese et allerede lagret spill fra en fil, og fortsette fra den tilstanden som det lagrede spilelt var i sist (altså et interface) knyttet til innlesing av nye eller tidligere lagrede spill, slik at en lett kan bytte til andre lagringsformat. Du skal lage minst én implementasjon som brukes av spillet ditt, så brukeren kan starte et nytt spill evt. gjenoppta et tidligere lagret spill. Du skal også forklare hvordan du med en annen implementasjon kan støtte et annet lagringsformat.

Del 4

La spillet ditt implemetere implementere det allerede definerste definerte grensesnittet ConsoleGame. ConsoleGame

TODO fyll mer beskrivene info om det her.

Del 5

I denne delen skal du lage en UI-klasse som bruker ConsoleGame-interfacet. Brukeren skal kunne gi kommandoer til klassen og klassen vil kommunisere med spillobjektet igjennom de definerte interface-metodene.

-grensesnittet definerer metoder for å initialisere, starte og styre spill:

  • init()-metoden fjerner all informasjon om et evt. spill som er igang og gjør det klar til å starte et nytt. Denne må kalles før run()-metoden.
  • run()-metoden starter et nytt spill, i den forstand at det er klar til å ta imot kommandoer fra brukeren.
  • Integer doLine(String)-metoden utfører en kommandolinje, som om den ble skrevet inn av brukeren. Returnverdien angir om spillet er ferdig og hva resultatet ble. Dersom returverdien er null, så er spillet fortsatt igang, dersom verdien er positiv så vant spilleren (evt. spiller 1), dersom verdien er negativ så tapte spilleren (evt. spiller 1) og dersom den er 0 så er resultatet udefinert evt. uavgjort. I løpet av kallet til doLine, så skal informasjon om (den nye) tilstanden til spillet skrives til System.out.

Det er viktig å merke seg at all styring av spillet må skje gjennom doLine-metoden, inkludert å lese inn nye evt. tidligere spill fra fil, siden det ikke finnes noen spesifikk metode som gjør dette. Dette betyr at du må lage kommando-syntaks for dette, som fungerer ved siden av de andre kommandoene for å styre spillet. F.eks. kan en tenke seg følgende kommandoer for lagring og lesing av tilstanden til spillet:

  • > filnavn: lagrer tilstanden til spillet i filen ved navn filnavn
  • < filnavn: leser inn og (re)starter spillet lagret i filen ved navn filnavn
  • ... andre kommandoer for å styre spillet, f.eks. w for opp, s for ned, a for venstre, d for høyre eller koordinatpar x,y for å legge brikke i rutenett osv.

Det blir gitt ut en klasse som "driver" et spill som implementerer ConsoleGame-grensesnittet, som du kan bruke til å teste om implementasjonen din fungerer etter hensikten. Dersom denne klassen heter GameDriver og din spill-klasse heter MittSpill, så skal følgende main-metode kunne brukes for å kjøre ditt spill ved hjelp av GameDriver-klassen:

Code Block
public static void main(String[] args) {
	ConsoleGame consoleGame = new DittSpill(); // evt. en annen konstruktør
	GameDriver gameDriver = new GameDriver(consoleGame);
	gameDriver.run();
} 

Hensikten her er å vise at en kan lage en generell driver for mange typer spill, hvis disse spillene implementerer et felles grensesnitt med relevante metoder. 

 

Include Page
Bunntekst for oppgaver
Bunntekst for oppgaver

...