Mobiltelefonapplikationer med Java ME: Hemtentamen 2010-12-11

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

  1. 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.
  2. Uppgiften ska lösas enskilt, dvs inga grupper av två eller flera studenter.
  3. 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).
  4. 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.
  5. 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.
  6. 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).
  7. 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:

Skärmbild 1

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:

Skärmbild 1

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:


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 10 december 2010