Versions Compared

Key

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

Denne oppgaven er en videreføring av de tidligere spilloppgavene TicTacToe, Sokoban, Sudoku og Battleship, hvor en skal gjøre rutenettet observerbart og implementere et par grensesnitt, så spillogikken kan kobles til et ferdig skrevet grafisk brukergrensesnitt. I tillegg skal spillet utvides med ekstra funksjonalitet.

I denne oppgaven skal spillogikken og (det innkapslede) rutenettet fra tidligere spill kobles til et ferdig skrevet grafisk brukergrensesnitt (GUI). Dette er en videreføring av de samme brukergrensesnittene som ble utdelt i tidligere utgaver av spilloppgavene. Nytt for brukergrensesnittet utdelt i denne oppgaven er at de nå også skal ha mulighet for å registrere seg som lyttere på spillklassen, for å legge til rette for oppdatering av skjermbildet når det skjer endringer i tilstanden.

Filene som er nødvendig for å knytte ditt spill opp mot vårt GUI er tilgjengelig i Del 2 av denne oppgaven.

ObservableGrid- og GridListener-grensesnittene

Det første grensesnittet er knyttet til rutenettdata og heter ObservableGrid. Tanken er at GUI-et må kunne registrere seg som lytter, slik at det holdes oppdatert når rutenettet endres. Dette er observert-delen av observatør-observert-teknikken. Observatør-delen av observatør-observert-teknikken utgjøres av GridListener-grensesnittet, og siden det er GUI-et som skal holdes oppdatert, så er det den ferdigimplementerte GUI-klassen som må implementere GridListener. GUI-klassen utdelt i Del 2 av denne oppgaven implementerer allerede GridListener, så det er kun nødvendig å la din spillklasse implementere ObservableGrid og samt skrive logikken for å varsle registrerte GridListener-objekter når det skjer endringer i spilltilstandenrutenettet.

PlantUML Macro
interface ObservableGrid {
    +void addGridListener(GridListener gridListener)
    +void removeGridListener(GridListener gridListener)
}

interface GridListener {
    +void gridChanged(ObservableGrid grid, int x, int y, int w, int h)
}

class DinRutenettklasse DinSpillklasse{
}

ObservableGrid <|.. DinRutenettklasseDinSpillklasse
DinRutenettklasseDinSpillklasse --> "*" GridListener: gridListeners

ObservableGrid har følgende metoder for lytterhåndtering:

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

Lytterne må implementere GridListener og dermed følgende metode:

  • gridChanged(ObservableGrid grid, int x, int y, int w, int h) - 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 dimensjonene w, h (bredde, høyde).

Hvis f.eks. metoden kalles med x=1, y=2, w=2 og h=1, så angir det at rutene 1,2 og 2,2 er endret. Det er opp til rutenett-klassen å avgjøre om endringer av flere ruter rapporteres med ett eller flere kall til gridChanged-metoden. Så endringer i rutene 1,2 og 2,2 kan også rapporteres med to kall, ett hvor x=1, y=2 og ett hvor x=2, y=2, med w=1 og h=1 for begge. Så selv om en kaller denne metoden, så er det ikke dermed sagt at alle rutene i det angitte rektangelet er endret (strengt tatt trenger ingen å være det).

 

For denne delen av oppgaven trenger du følgende filer: imagegrid/GridListener.java og imagegrid/ObservableGrid.java

Del 2: Utvidelse av spillet

I denne deloppgaven skal spillet utvides med ny funksjonalitet. Hva denne funksjonaliteten består i avhenger av hvilket spill du har valgt å implementere. Dette er beskrevet på egne sider for hvert spill:

Filene som er nødvendige for å kjøre det forhåndsskrevne GUI-et er tilgjengelig på disse ulike oppgavesidene. Siden det er GUI-et som styrer showet, så er det klassen <spill>FX.java som skal startes ved kjøring av spillet ditt.