I denne opgave får I en forståelse for hvordan controlleren som eksekverer
et programkort kan give kontrollen tilbage til brugeren for at træffe et valg.
Og når brugeren har truffet sit valg, skal kontrollen gå tilbage til controlleren,
og controlleren kan så reagere på det trufne valg.
Eksemplet er eksekvering af spillerens (robottens) program, som vi begyndte med
allerede med i opgave V2, hvor softwaren
udfører robotternes programmer helt automatisk. I den nye version bliver der tilføjet
en ny slags kommandokort, som tillader, at spilleren kan vælge mellem nogle kommandoer,
når kortet bliver eksekveret. Derfor må eksekvering af programmerne sættes på pause der,
og softwarens GUI skal vise brugeren hvilket muligheder spilleren må vælge imellem.
Først når spilleren har truffet sit valg (i det han klikker på en af kommandokortens
option), skal programmet så forsætte med det valgte kommando. Det bliver diskuteret lidt
nærmere under timen.
Derudover skal I nu dokumentere det endelige program færdigt med JavaDoc og også generere
websiderne med softwarens dokumentation.
Dette er en V-opgave og skal derfor ikke afleveres. Resultaterne skal
vises til underviseren/hjælpelærere den 1. marts (om to uger).
Her er de forskellige trin for at klare opgaven:
- Som udgangspunkt, skal i brure jeres løsning til
opgave V2. Denne version har en enumeration
(enum)
Command i pakke model , som indtil videre
repræsenterer fire forskellige kommandoer (som ikke kræver brugerinteraktion).
Nu får I udleveret en ny version af denne enumeration, som indeholder et
interaktiv kommando, hvor brugeren kan vælge mellem at dreje til venstre
eller til højre, når dette kommando bliver eksekveret. Denne enumeration findes
her: Command.java .
Sæt denne nye enumeration ind i jeres projekt i sted for den oprindelige.
Som det første skal I sætte jer ind i dens struktur og hvordan den virker.
Bemærk at konstruktoren bliver brugt til at initialisere et kommando
med dettes navn; og hvis det er et interaktiv kommando, med et optionelt
parameter options , som er en liste med de optioner, som
brugeren må vælge imellem, når dette interaktive kommando bliver
eksekveret. For at gøre det let at bruge den, er der også en metode
isInteractive() , som siger om det pågældende kommando
er interaktiv, og en metode getOptions() , som returnerer
en liste med alle kommandoets optioner, som brugeren må vælge imellen.
Det bliver forklaret lidt nærmere i timen.
Bemærk at denne enumeration, konstruktoren og metoderne ikke har
dokumentationen endnu i form af JavaDoc. Dem skal i tilføje (se
sidste trin).
Efter I har opdateret jeres projekt med dette nye Command ,
skal I afprøve om programmet kan kompileres og startes. Men indtil videre
vil interaktive kommandokort bare blive ignoreret når robotternes programmer
bliver startet. Det skal I gøre om i de næste trin.
- I første omgang skal I sørge for at eksekvering af robotternes programmer stopper
så snart eksekvering "rammer" et interaktiv programkort. Det ville ske indenfor
GameController ens metoden executeNextStep() .
Så skal spillet skifte til fase PLAYER_INTERACTION og
metoden executeNextStep() afsluttes (med return ).
Skift til fasen PLAYER_INTERACTION vil så medføre at
GameController en stopper eksekvering af robotternes programmer.
Det bliver diskuteret lidt nærmere i timen.
Start jeres software og vælg nogle interaktive kort til robotternes programmer,
og start eksekvering af robotternes program. Så burde eksekvering af robotternes
program stoppe, når det første interaktive kort bliver eksekveret; og der burde
vises to optioner, "Option 1" og "Option 2" (som er fast programmeret og har
ikke noget med det interaktive kort at gøre). Det bliver også vist under timen,
hvordan det skal se ud. Hvis jeres program ikke stopper og ikke viser de to optioner,
så find ud af hvad fejlen er — sandsynligvis kan det betale sig at bruge
debuggeren.
- I næste trin, skal I så sørge for at der bliver vist de rigtige optioner på
spillerens panel (i sted for "Option 1" og "Option 2"). Find det sted i
metoden
udpdateView() i klassen PlayerView i pakken
view (se også kommentare TODO Assignment V3 ). Der
skal I programmere en løkke, som viser de virkelige optioner af
robottens aktuelle interaktive kommandokort: Først tilgå det aktuelle kort,
så tilgå listen
med kommandoets optioner, og programmer en løkke som tilføjer en knap
på det aktuelle panel til hver option (se knapperne "Option 1" og "Option 2"
hvordan man kan gøre det). Indtil videre må de tilknyttes GameControllerens
metode notImplemented() . Også dette trin bliver diskuteret lidt
nærmere under selve timen.
Afprøv om det virker og om kortenes optioner dukker op. Hvis ikke, debug jeres
program, indtil det virker (og spørge hjælpelærerne/underviseren om hjælp).
- Næste trin er at I implementere en ny metode i jeres
GameController ,
som fx. kunne hedde executeCommandOptionAndContinue , som har
et parameter Command option . Denne metoder skal så skifte
spillet tilbage til fasen ACTIVATION , eksekvere
den valgte option for den aktuelle spiller, og bagefter
skifte eksekvering af robotternes program videre til næste programkort.
Hvordan man kan skifte videre til det næste programkort,
kan ses i metoden executeNextStep() ; indtil videre må I
kopiere koden derfra (det er faktisk dårlig stil, men det problem løser
vi en anden gang). Og det bliver også diskuteret under selve timen.
Sørg for, at I nu tilknytter de knapper fra sidste trin til den ny implementerede
metode, hvor den aktuelle paramter option skal være den option,
som svarer til knappen.
Afprøv om jeres løsning virker og, hvis ikke, find fejl i det I bruger debuggeren.
- Jeres software burde nu være i stand til at eksekvere robotternes programmer. Og når
der kommer et interaktiv kort, burde spilleren så kunne vælge imellem kortes optioner.
Når spilleren klikker på en option, burde denne option eksekveres og derefter
burde robotternes program stå på det næste programkort. Med knapperne "Execute Program"
eller "Execute Current Register" kan brugeren så henholdsvis eksekvere resten af
robotternes program eller bare næste skridt.
Men det ville være lidt bedre at, hvis hele programmet var startet med "Execute Program",
at den automatiske eksekvering af programmet ville så fortsætte efter et interaktiv kort
er blevet eksekveret.
For at opnå det, kunne I som sidste skridt i metoden
executeCommandOptionAndContinue() sørge for at progammets eksekvering
fortsætter, hvis spillet ikke er i step -modus og programmet ikke var slut
(det er faktisk derfor metodens navn ender med "AndContinue").
Prøv at implementere det.
Til sidst skal I sørge for at jeres nye metode også får et hensigtsmæssigt
JavaDoc-kommentar.
- Til at forstå mere af selve projektet skal i dokumentere koden med
JavaDoc-kommentarer (se pakke
designpatterns for
eksempler på sådanne kommentarer og også [JD:HowTo]).
Dokumenter alle pakker, klasser og (offentlige/public )
metoder af dette projekt med JavaDoc-kommentarer og generer en HTML-dokumentation
ud af det (det vises under selve timen, hvordan man kan gøre det med Maven).
Hvis I gør det manuelt, glem ikke at inkludere filen overview.html (men
Maven-opsætningen er konfigureret, så at den ved hvor overview.html ligger henne).
Med projektopsætningen, som I fik udleveret, er det faktisk rimeligt nemt at generere
websiderne med dokumentation af jeres software. Åbn Maven-tab på højre side af
jeres IntelliJ, og så åbn "Plugins" og "javadoc" og dobbel-klik på målet "javadoc:javadoc".
Så bliver websiderne genereret som index.html i folderen "target/site".
Tjek disse sider i det i åbner dem i jeres webbrowser. Også det vil blive diskuteret
under selve timen.
Bemærk at jeres endelige aflevering skal indeholde alle disse kommentarer alligevel.
Derfor kan I lige så godt gør det nu!
|