Denne oppgaven er en videreføring av de tidligere spilloppgavene TicTacToe, Sokoban, Sudoku og Battleship, hvor en skal gjøre rutenettet sitt observerbart.


I denne oppgaven skal spillogikken og rutenettet fra tidligere spill gjøres observerbart, slik at andre klasser skal kunne lytte på det å få med seg endringene. Disse endringene skal gjøres i Game-mappen.

Beskrivelse

GenericGridGameflere metoder..void addGridListener(GridListener gridListener)void removeGridListener(GridListener gridListener)GridListenervoid gridChanged(GenericGridGame grid, int col, int row, String value)DinSpillklassegridListeners*

Lag GridListener-grensesnittet, som gjør det mulig å lage en observatør av spillklassen din og krever metoden:

  • gridChanged(GenericGridGame gridGame, int col, int row, String value) - metoden kalles for å gi beskjed om at en eller flere ruter i rutenettet (grid) innenfor det angitte rektanglet er endret. Rektanglet er angitt med posisjon x, y og har fått en ny verdi Value. Oppdater med eventuelt flere argumenter avhengig av hva du føler spillet ditt trenger. Du står og fritt til å endre typen til variablene i dette grensesnittet.

Lag en eksempelklasse som implementerer dette grensesnittet. For eksempel GenericGameListener, som kan kunne lytte på spillet ditt, og vise at endringer oppdateres. Vis at GenericGameListener får med seg endringer som skjer i spillet ditt med å printe til konsollen når det skjer en endring. Du kan og implementere GridListener i GameController fra øving 4 og 7.

Lag et grensesnitt GenericGridGame som inkluderer følgende metoder for lytterhåndtering:

  • void addGridListener(GridListener) - registrerer en lytter skal skal ha beskjed hver gang rutenettet endres
  • removeGridListener(GridListener) - avregistrere en lytter som tidligere er registrert med addGridListener

Spillet ditt et skal implementere dette grensesnittet slik at lyttere kan registreres til spillet. Tanken er at lyttere skal kunne registrere seg selv som lytter til spillet ditt. Spillklassen din må da holde styr på sine lyttere, og bør bruke de to sistnevnte metodene til dette. Dette er observert-delen av observatør-observert-teknikken.

 

 

Ekstraoppgave

De spesielt interesserte kan utvide spillet sitt med enda mer funksjonalitet. Den utvidede funksjonaliteten er ikke støttet i JavaFX-applikasjonen, men du har mulighet til å selv legge til knapper eller lignende for å støtte dette. Relevante filer er FXML og Controller-filene fra øving 7. 

TicTacToe

TicTacToe skal utvides med muligheten for å la datamaskinen spille.

  • void doAIMove() - utfører et trekk for spilleren som er i trekket. Det er opp til deg hvordan datamaskinen velger trekk, enten et tilfeldig lovlig trekk (enklest) eller et optimalt trekk (utfordring).

Battleship

Spillet ditt skal utvides med muligheten for å la datamaskinen spille som den ene spilleren. Den enkleste versjonen vil være å la AI-en skyte tilfeldig helt til spillet er over. En mer utfordrene løsning vil være å først la den skyte tilfeldig, men når den treffer så leter den etter resten av målet i nærliggende ruter. For mer informasjon og tips se http://www.datagenetics.com/blog/december32011/.

Sudoku

Spillet ditt skal utvides med en funksjon for å vise lovlige tall som kan plasseres i en rute:

  • List<Integer> placeableDigits(int x, int y) - returnerer en liste med hvilke tall som er lovlige å plassere på lokasjonen angitt ved x, y. Altså, alle tall som verken er til stede i tilstøtende blokk, kolonne eller rad.

Sokoban

Sokoban skal utvides med to funksjoner, som begge gjør det raskere å flytte spilleren. 

  • String movePlayerTo(int x, int y) - flytter spilleren til cellen (x,y) ved hjelp av en sekvens med flytt (altså ikke dytt), og returnerer en String som representerer flyttene. Flyttene representeres med tegnene l, r, u, og d for i indikere retning, altså l for left/venstre, r for right/høyre, u for up/opp og d for down/ned. Dersom et kall til metoden gjør at spilleren flytter til venstre og så opp, så skal altså metoden returnere "lu". Hvis flyttet ikke er lovlig/mulig, så skal metoden returnere null.
  • String moveBox(int x, int y, ind dy, int dy) - flytter boksen i cellen (x,y) i retning (dx, dy) ved hjelp av en sekvens med flytt, for om nødvendig å få spilleren i rett posisjon, og så et dytt for å flytte boksen. Metoden skal returne en streng som representerer flyttene og dyttet. Flyttene representeres som beskrevet over, mens det siste dyttet er tilsvarende store bokstav, altså L, R, U, eller D. Som over så skal metoden returnere null, dersom sekvensen ikke er lovlig/mulig.

movePlayerTo-metoden er nok vanskeligst, fordi en må prøve seg frem med ulike sekvenser av flytt for å se om en kan nå frem til ønsker rute. Det kan være lurt å kunne lagre litt hjelpeinformasjon i en rute, for å gjøre det enklere. moveBox-metoden er enklere, og nøkkelen er å innse at for å kunne dytte boksen i den angitt retningen, så må spilleren først flytte seg til riktig (motsatt) side av boksen, før boksen dyttes. Og flytting av spilleren er jo nettopp det movePlayerTo gjør!

 

  • No labels