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

Compare with Current View Page History

« Previous Version 6 Next »

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

I denne oppgaven skal spillogikken og (det innkapslede) rutenettet fra tidligere spill kobles til et ferdig skrevet grafisk brukergrensesnitt (GUI). Det samme GUI-et skal kunne fungere mot mange spill og realiseringsteknikker, og den beste måten å gjøre det på er å definere spesifikke grensesnitt som brukergrensesnittet kan forutsette er implementert. De ulike grensesnittene svarer til ulik type funksjonalitet som (må) finnes i rutenettbaserte spill for å kunne kobles til et GUI.

Det første grensesnittet er knyttet til rutenettdata og heter GridProvider. Tanken er at GUI-et må kunne spørre rutenettet om dimensjoner og innhold og 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 GridListener-grensesnittet, og siden det er GUI-et som skal holdes oppdatert, så er det den ferdigimplementerte GUI-klassen som må implementere GridListener.

GridProviderpublic int getGridWidth()public int getGridHeight()public Object getGridElement(int x, int y)public void addGridListener(GridListener gridListener)public void removeGridListener(GridListener gridListener)GridListenervoid gridChanged(GridProvider grid, int x, int y, int w, int h)DinRutenettklassegridListeners*
public interface GridProvider {
    
    /**
     * Gets the width (number of columns) of the grid
     * @return the width of the grid
     */
    public int getGridWidth();
    /**
     * Gets the height (number of rows) of the grid
     * @return the height of the grid
     */
    public int getGridHeight();
    /**
     * Gets the element at the specified x (column) and y (row) position 
     * @param x the x-coordinate of the element
     * @param y the y-coordinate of the element
     * @return the object at the specified position
     */
    public Object getGridElement(int x, int y);
    /**
     * Adds the listener, so it will be notified when the grid changes
     * @param gridListener the listener to add
     */
    public void addGridListener(GridListener gridListener);
    /**
     * Removes the listener, so it no longer will be notified when the grid changes
     * @param gridListener the listener to remove
     */
    public void removeGridListener(GridListener gridListener);
}

public interface GridListener {
    /**
     * Notifies the listener that the grid has changed. The changed region is a rectangle at x,y with dimensions w,h.
     * @param grid the grid that has changed
     * @param x the x coordinate of the changed rectangle
     * @param y the y coordinate of the changed rectangle
     * @param w the width of the changed rectangle
     * @param h the height of the changed rectangle
     */
    public void gridChanged(GridProvider grid, int x, int y, int w, int h);
}

Metodene i GridProvider er som følger:

  • int getGridWidth() - returnerer bredden eller antall kolonner i rutenettet, f.eks. 3 for standard Tic Tac Toe
  • int getGridHeight() - returnerer høyden eller antall rader i rutenettet, f.eks. 3 for standard Tic Tac Toe
  • Object getGridElement(int x, int y) - returnerer objektet som er lagret i en bestemt rute angitt med x,y-koordinater (altså kolonne,rad). Dette kan være noe så enkelt som et tegn, f.eks. 'x', 'o' eller ' ' for Tic Tac Toe, eller noe mer komplisert for Sudoku. Object brukes som returtype, for å kunne håndtere alle type spill og implementasjoner.
  • void addGridListener(GridListener) - registrere en lytter skal skal få beskjed hver gang rutenettet endres
  • void removeGridListener(GridListener) - avregistrere en lytter som tidligere er registrert med addGridListener

GridListener har kun én metode:

  • gridChanged(GridProvider grid, int x, int y, int w, int h) - metoden kalles for å gi beskjed om at rutenettet (grid) er endret. Den delen av rutenettet som er endret, utgjøres av en rektangel i posisjon x, y og med 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. Merk at selv om en kaller denne metoden, så er det ikke dermed sagt at alle rutene i det angitte rektangelet er endret, det betyr bare at en eller flere (eller ingen!) ruter i dette rektangelet kan det være endret. Det er opp til rutenett-klassen å avgjøre om endringer av flere ruter rapporteres med ett eller flere kall til gridChanged-metoden. Dersom rutene 1,2 og 2,2 er endret, så kan det også rapporteres med to kall hvor både w=1 og h=1, ett hvor x=1, y=2 og ett hvor x=2, y=2.

 

 

 

I denne oppgaven inngår en del grensesnitt som må forstås og evt. implementeres. Disse

  • No labels