Det här är hemtentan som går lördag 11 december 2010 i kursen Mobiltelefonapplikationer med Java ME.
Ansvarig lärare är
Thomas Padron-McCarthy
(thomas.padron-mccarthy@oru.se),
telefon 070-73 47 013.
Instruktioner
-
Skriv och provkör programmet som beskrivs i uppgiften,
och skicka sen in det färdiga programmet till mig
(thomas.padron-mccarthy@oru.se)
senast klockan 08:00 söndag 12 december 2010.
-
Uppgiften ska lösas enskilt, dvs inga grupper av två eller flera studenter.
-
Du får använda dator, böcker och vilka andra hjälpmedel som helst, men
du får inte samarbeta eller fråga någon (utom mig).
-
Om du behöver fråga något, så kontakta gärna mig.
Det är nog bäst att ringa eller SMS:a
(se mobilnumret ovan),
för jag lovar inte att jag kollar e-posten under dagen.
-
Packa ihop hela katalogen med applikationen i en Zip-fil, och skicka den som en bilaga.
Men döp först om Zip-filen från nånting.zip till exempelvis nånting.info för att överlista överambitiösa virusfilter.
Om applikationen bara består av en enda Java-fil kan man i stället skicka bara den filen.
-
Om du inte senast på söndagen fått e-post från mig med en bekräftelse
på att du skickat in uppgiften,
bör du kontakta mig, enklast genom att ringa eller SMS:a mig
(ifall det är e-posten som inte fungerar).
-
Godkänt resultat på den här hemtentan ger betyget G på teoridelen av kursen.
Tillsammans med godkända inlämningsuppgifter ger detta betyget G på hela kursen.
Om man vill ha betyget VG ska man dessutom själv hitta på och göra en mindre projektuppgift.
Uppgiften
Vi vill göra ett program som visar en "mask" som rör sig på skärmen:
Den röda punkten är "maskhuvudets" aktuella position,
och den gråa kurvan är maskhuvudets senaste hundra positioner.
Maskhuvudet flyttar sig slumpmässigt,
och genom att vi ritar ut maskhuvudets spår
(högst hundra steg tillbaka) ser det hela ut som en mask.
Vi börjar med att låta maskhuvudet flytta sig slumpmässigt, så här:
int dx = prng.nextInt(3) - 1;
int dy = prng.nextInt(3) - 1;
x += dx;
y += dy;
prng är en slumpgenerator av klassen java.util.Random.
x och y är maskhuvudets aktuella position,
och bägge dessa kan alltså slumpmässigt ändras med antingen -1, 0 eller +1.
Dessutom måste man lägga till kod som hanterar vad som händer när maskhuvudet
försöker åka utanför skärmen.
Tyvärr fungerar det ganska dåligt.
Maskhuvudet åker inte omkring som vi vill,
utan det står och vinglar fram och tillbaka på ungefär samma ställe hela tiden:
Det blir så, eftersom vi slumpar varje nytt steg
utan att bry oss om åt vilket håll masken rörde sig innan.
För att få en mask som rör sig lite mer realistiskt (om det nu är rätt ord),
kan vi prova med att hålla reda på inte bara maskens aktuella position,
utan också dess aktuella rörelseriktning och hastighet,
och så låter vi slumpen påverka rörelsen,
inte positionen direkt.
Ny programkod:
double ddx = 0.1*(prng.nextInt(3) - 1);
double ddy = 0.1*(prng.nextInt(3) - 1);
dx += ddx;
dy += ddy;
x += dx;
y += dy;
Nu lagrar vi alltså inte bara x och y,
utan också dx och dy,
som är förändringen per simuleringssteg av x och y.
dx och dy ändras slumpmässigt med antingen -0.1, 0 eller +0.1.
Därefter påverkas positionen (x och y) av hastigheten (dx och dy).
Kanske blir det ännu snyggare om man låter slumpen påverka accelerationen,
som sen i sin tur påverkar hastigheten,
som sen i sin tur påverkar positionen?
Uppgiften är att göra ett program där man kan provköra
åtminstone de två första fallen (som vi gett programkod för).
Det här är de krav som finns på programmet:
-
Masken ska röra sig på skärmen enligt beskrivningen,
med ett huvud samt en kropp som består av huvudets senaste positioner.
-
Det ska gå att byta mellan de olika sätten för programmet att röra maskhuvudet,
så att man kan se vilket som blir snyggast.
-
Programmet ska minst klara av två lägen:
att slumpmässigt ändra positionen direkt,
och att slumpmässigt ändra hastigheten som sedan påverkar positionen.
-
Ytterligare nivåer, som att accelerationen,
eller kanske accelerationens derivata, eller andraderivata,
ändras, är valfria.
-
Det är också möjligt (men inte ett krav) att ha andra inställningar,
till exempel så att man kan ange med hur mycket slumpen kan påverka,
eller kanske mer avancerade formler. (Låta masken påverkas av gravitationen, kanske?)
-
Programmet får inte krascha,
till exempel om man ger en oväntad kombination av kommandon.
-
Var noga med att programmet "bara fungerar".
Användaren ska inte behöva krångla,
till exempel med att skapa extra filer eller köra särskilda installationsprogram,
för att kunna installera och köra programmet.
Thomas Padron-McCarthy
(thomas.padron-mccarthy@oru.se),
10 december 2010