Versions Compared

Key

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

...

GridProvider og GridListener er grensesnitt som fokuserer på tilstanden til rutenettet, men ikke på hvordan tilstanden endres eller den overordned gangen i spillet, f.eks. oppstart eller brukerens kommandoer. De gir heller ingen mulighet til å styre hvordan rutenettet vises til brukeren eller vise annen type status for spillet. Dette er fokuset for GridGame- og GridOutput-grensesnittene.

PlantUML Macro
interface GridGame {
    public void init(String level)
    public void run(GameOutput output)
    public Integer doCommand(String command)
    public GridProvider getGridProvider()
	public String getTextFor(Object)
    public String getImageFor(Object o)
    public Integer gridElementSelected(int x, int y)
}

interface GameOutput {
    public void info(String message)
    public void warning(String message)
    public void error(String message)
}

class DittRutenettspill {
}

class GridGameImpl {
}

GridGame <|-- DittRutenettspill
DittRutenettspill --> GameOutput: gridOutput
GameOutput <|-- GridGameImpl
GridGameImpl --> GridGame: gridGame
Code Block
languagejava
titleGridGame- og GameOutput-grensesnittene
collapsetrue
public interface GridGame {
    
    /**
     * Loads and initializes the game to a (new) specified level. The String can be anything, e.g. a file name or a String encoding a level.
     * Note that there should be no output at this point.
     * @param level the String decribing a level, e.g. path or URL
     */
    public void init(String level);
    
    /**
     * Start the game (that was just initialized with init) and use the argument for all game output
     * @param output the object used for providing text-based output to the user (messages, warnings and errors)
     */
    public void run(GameOutput output);
    
    /**
     * Perform a command (line). This method may update the underlying grid and provide output to the user using the GameOutput object given to.
     * @param command
     * @return
     */
    public Integer doCommand(String command);
    /**
     * Returns the object that encapsulates the underlying grid.
     * @return  the object that encapsulates the underlying grid
     */
    public GridProvider getGridProvider();
    
    /**
     * Returns the locationtext (URLlabel) or file) of the image corresponding to the provided grid elementcorresponding to the provided grid element, or null of there is none.
     * @param o the object
     * @return the locationtext (URL or file) of the image label) corresponding to the provided grid element
     */
    public String getImageForgetTextFor(Object o);
    
    /**
     * PerformReturns anthe actionlocation corresponding(URL toor selectingfile) aof gridthe element.image Thiscorresponding methodto may update the underlyingprovided grid andelement, provideor outputnull toof thethere user using the GameOutput object given tois none.
     * @param o commandthe object
     * @return
 the location (URL or */
file) of the image publiccorresponding Integerto gridElementSelected(int x, int y);
}

public interface GameOutput {the provided grid element
     */
    
public String   getImageFor(Object o);

 	/**
     * OutputsPerform an aaction messagecorresponding to user, e.g. selecting a statusgrid update.
     * @param message the message
     */element. This method may update the underlying grid and provide output to the user using the GameOutput object given to.
    public void* info(String message);@param command
     */**
    public *void Outputs a message to user, with a style indicating it is a warning.gridElementSelected(int x, int y);

    
    /**
     * @paramPerform messagean theaction warningcorresponding message
to moving in a certain */
direction. This method may publicupdate voidthe warning(String message);
    /**
     * Outputs a message to user, with a style indicating it is an errorunderlying grid and provide output to the user using the GameOutput object given to.
     * @param message the error messagecommand
     */
    public void errordirectionInput(String message);
}int dx, int dy);
}

public interface GameOutput {
    
    /**
     * Outputs a message to user, e.g. a status update.
     * @param message the message
     */
    public void info(String message);
    /**
     * Outputs a message to user, with a style indicating it is a warning.
     * @param message the warning message
     */
    public void warning(String message);
    /**
     * Outputs a message to user, with a style indicating it is an error.
     * @param message the error message
     */
    public void error(String message);
}

Det er GUI-et som lager en instans av spillklassen og styrer oppstart og utvikling av spillet, dvs. laster inn et nytt nivå eller bra, setter spillet igang og driver det fremover ved å ta imot input fra brukeren og videreformidle det til spillet. Spillklassen din må innordne seg hvordan GUI-et gjør dette, ved å tilby et standard sett med metoder definert i GridGame-grensesnittet. De viktigste metodene er knyttet til den overordnede livssyklusen til spillet:

  • void init(String) - denne metoden kalles av GUI-et for å initialisere et nytt spill, men uten at det settes igang. Argumentet er ment å angi et nivå, brett eller det som gir mening for spillet ditt. Det kan f.eks. være en nettadresse hvor nivået ligger, nivået koden direkte i en String eller dimensjonene til et brett. Det er brukeren som skriver String-argumentet inn, og det er opp til implementasjonen av metoden å tolke og bruke det.
  • GridProvider getGridProvider() - denne metoder returnerer objektet som representerer selve rutenettet, som ble initialisert av init-metoden. Ved hjelp av dette objektet, kan GUI-et vise frem rutenettet og registrere seg som lytter for å få beskjed om endringer i rutenettet.
  • void run(GameOutput) - denne metoden setter igang spillet. Argumentet er et objekt som spillet må huske og som under spillets gang kan brukes for å gi meldinger og statusoppdateringer til brukeren. (I praksis er dette objektet GUI-et selv, og GUI-ets implementasjon av GameOutput-metodene angjør hvordan meldinger vises til brukeren.)
  • Integer doCommand(String) - det er denne metoden som driver spillet fremover ved at brukerinput formidles fra GUI-et til spillet. Argumentet er en slags kommandolinje, på et format som kan tolkes og brukes av spillet. Returverdien er spillets måte å fortelle GUI-et om spillet er ferdig og i tilfelle hva som ble resultatet. En null-verdi betyr at spillet ikke er ferdig og 0 betyr at det ikke ble noe resultat (eller uavgjort). En negativ eller positiv verdi angir hhv. tap eller seier, evt. hvilken av to spillere som vant.

Den viktigste logikken i spillet ligger typisk i doCommand-metoden, siden den håndterer input fra brukeren. Som respons vil spillet typisk endre rutenettet, og dette fanges opp av GUI-et, som lytter til rutenettendringer, og dermed kan oppdatere den grafisk visningen. I tillegg kan spillet gi meldinger og statusoppdateringer til brukeren vha. GameOutput-objektet som ble gitt til run-metoden, da spillet startet. Det er derfor dette objektet må lagres unna, slik at det er tilgjengelig for doCommand-metoden.

GameOutput-objektet tilbyr tre metoder, for meldinger av ulik alvorlighetsgrad:

  • info(String) - viser String-argumentet som en enkelt statusoppdatering, f.eks. "x sin tur" eller "4 av 8 bokser er på plass".
  • warning(String) - viser String-argumentet som et (forsiktig) varsel. f.eks. "Ulovlig trekk".
  • error(String) - viser String-argumentet som et (kraftig) varsel. f.eks. "Inkonsistent brett".

Akkurat hvordan meldingen vises er opp til GUI-et, som implementerer metodene, men tanken er når alvorlighetsgraden øker, så blir meldinger mer tydelig og påtrengende. F.eks. kan info oppdatere en statuslinje, mens error åpner en meldingsdialog.

GridGame har i tillegg til metodene angitt over, metoder for å angi hvordan elementene i rutenettet vises og for å håndtere ikke-tekstlig input. Tanken er at hver rute i rutenettet

Det er GUI-et som lager en instans av spillklassen og styrer oppstart og utvikling av spillet, dvs. laster inn et nytt nivå eller bra, setter spillet igang og driver det fremover ved å ta imot input fra brukeren og videreformidle det til spillet.