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

Compare with Current View Page History

« Previous Version 6 Next »

Memory er et spill hvor en prøver å huske og gjenta en så lang sekvens som mulig med tall, bilder eller andre "objekter". Sekvensen blir lengre og lengre og spillet fortsetter helt til en gjentar den feil. Dette kodeeksemplet viser hvordan vi kan implementere en enkel tekstlig versjon av spillet.

Selv om et slikt enkelt spill kan implementeres med én klasse, så legger vi opp til en klassisk todeling i én hovedprogram-klasse, som håndterer kommunikasjone med brukeren, og én logikk-klasse, som håndterer spill-logikken. Dersom logikk-klassen gjøres anvendelig og generell nok, vil en senere kunne gjenbruke den i en grafisk versjon. Todelingen illustreres under med et objektdiagram:

MemoryProgramKommuniserer med brukerenHovedprogram-objektMemoryHåndterer tilstanden underveis i spilletLogikk-objektmemory

I et spill som dette vil hovedprogrammet hovedsaklig bestå av en løkke som utvider sekvensen med tall og deretter ber brukeren om å gjenta hele sekvensen. For hvert tall brukeren gir inn, må det sjekkes om tallet stemmer med neste tall i sekvensen. Vi kan tenke oss dialogen som følger (system-output i kursiv og bruker-input i fet skrift):

Element nr. 1 er 3
Gjenta element nr. 1 av 1
3
Element nr. 2 er 4
Gjenta element nr. 1 av 2
3
Gjenta element nr. 2 av 2
4
Element nr. 3 er 7
Gjenta element nr. 1 av 3
3
Gjenta element nr. 2 av 3
4
Gjenta element nr. 3 av 3
5
Feil! Den lengste sekvensen du klarte var på 2 elementer.
Vil du prøve på nytt (ja/nei)?
ja
Element nr. 1 er 8
...

Det som ikke kommer frem av dialogen er hvordan MemoryProgram-objektet samspiller med Memory-objektet, dvs. hvilke kall MemoryProgram utfører på Memory og hvilke verdier som flyter frem (argumentverdier) og tilbake (returverdier). Dette er den vanskeligste delen av programmering: å bestemme når og hvordan objektene samhandler, altså å fordele oppgaver mellom objektene og konkretisere oppgavene som metoder med argumenter og returverdier. En måte å komme litt videre på er å legge inn kommentarer i dialogen over, som illustrerer hvordan MemoryProgram bruker Memory underveis. (Dette kunne vært tegnet som et sekvensdiagram, men det er litt tidlig å bruke en så formell notasjon, siden vi ennå ikke har satt navn på metoder og gitt dem argument- og returtyper.)

// Memory genererer nytt tall i sekvensen => 3
Element nr. 1 er 3
Gjenta element nr. 1 av 1
3
// Memory sjekker om 3 er riktig neste tall => ok og ferdig
// Memory genererer nytt tall i sekvensen => 4
Element nr. 2 er 4
Gjenta element nr. 1 av 2
3
// Memory sjekker om 3 er riktig neste tall => ok, men ikke ferdig
Gjenta element nr. 2 av 2
4
// Memory sjekker om 4 er riktig neste tall => ok og ferdig
// Memory genererer nytt tall i sekvensen => 7
...

Vi ser at Memory hovedsaklig tilbyr to tjenester: å generere nye tall i sekvensen og å ta imot et nytt tall (fra brukeren) og sjekke det mot fasiten. Det er dessuten underforstått at Memory må huske både tall-sekvensen og hvor langt brukeren har kommet i å gjenta den. Vi kan nå oppdatere diagrammet vårt med denne innsikten:

MemoryProgramKommuniserer med brukerenMemorytallsekvenssekvensPosisjongenererNesteTall()sjekkNesteTallFraBruker()memory
  • No labels