DTU 
 

 

02362: Projekt i software-udvikling (f22)

Opgave V3 (til 1. marts): Eksekvering af program med brugerinteraktion
 
 

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:

  1. 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.

     

  2. 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 GameControllerens 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 GameControlleren 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.

     

  3. 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).

     

  4. 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.

     

  5. 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.

     

  6. 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!

     

Yderlige informationer

 

I kan finde mere information om JavaDoc under [JD:HowTo] og information hvordan man kan generere HTML-siderne manuelt fra disse kommentarer under [IJ:JavaDoc].

 

 

Ekkart Kindler (), 14. februar 2022