Menu

#2 Dubbi su possibili stranezze applet

open
nobody
None
5
2005-11-24
2005-11-24
Anonymous
No

Scusatemi se il problema che vi pongo può sembrarvi
banale per un esperto, ma, dopo essermi appassionato
all'idea di partecipare a JRobots, sono sorti in me
tutta una serie di dubbi sul funzionamento dei robots
e soprattutto sul modo in cui l'applet gestisce le
partite.

Ho corredato l'esposizione dei miei dubbi con codice
d'esempio che serva a chiarire i concetti.
Per ovvi motivi, ho testato questi robot solo in
locale, evitando di caricarli on-line per il timore
di bloccare tutto.

DUBBIO #1: PERCHE' IL CLOCK DEVE INFLUIRE SULLA MIA
TRAIETTORIA?

MOTIVAZIONE: Osservate il codice seguente:

public class __Prova1_ extends JJRobot
{
void main()
{
int i, a;
int[] angoli = {90, 180, 270, 0};
drive(0, 50);
a = 0;
while(true)
{
for(i = 0; i < 5e+4; ++i)
drive(angoli[a], 50);
++a;
a %= 4;
}
}
}

Se eseguo questo robot ideato per seguire una
traiettoria pressoché quadrata, ho una brutta
sorpresa. Se eseguo il codice con Clock 1x, i
quadrati disegnati sono relativamente grandi; se,
invece, eseguo con Clock /2, allora i quadrati sono
molto più piccoli; e ancora, se eseguo con Clock 2x,
i quadrati son molto più grandi.
Il mio dubbio è: perché il clock deve far variare
così il percorso seguito da questo robot? In questo
modo è impossibile usare un clock più lento per
osservare con calma il comportamnto del robot, dato
che poi, quando viene eseguito in tempo reale il
comportamento sarà un altro. Analogamente, non potrò
mai usare un clock più veloce per vedere velocemente
dei combattimenti e fare una stima statistica delle
prestazioni del robot, in quanto il comportamento
durante un eventuale torneo sarebbe diverso.
A tempi virtuali uguali a cui corrispondono
istruzioni uguali, non dovrebbero corrispondere spazi
percorsi uguali?
E' come se il codice da me inserito fosse eseguito
sempre alla stessa velocità (dipendente dal mio
processore), mentre il clock influisse soltanto
sull'esecuzione delle funzioni predefinite nel robot.
Che senso ha un comportamento del genere? Il clock
non dovrebbe influire in maniera proporzionale su
tutto il codice in modo da simulare coerentemente un
combattimento a diverse velocità???

DUBBIO #2: PERCHE' IL MIO CODICE DEVE INFLUIRE
SULL'ESECUZIONE DEL CODICE ALTRUI?

MOTIVAZIONE: Osservate il codice seguente:

public class __Prova2_ extends JJRobot
{
void main()
{
int i, a;
int[] angoli = {90, 180, 270, 0};
drive(0, 50);
a = 0;
while(true)
{
for(i = 0; i < 5e+4; ++i);
drive(angoli[a], 50);
++a;
a %= 4;
}
}
}

Il codice precedente è diverso da quello del dubbio
#1, in quanto usa un ciclo for vuoto per simulare un
ritardo in termini di istruzioni. Lo scopo era quello
di provare che penalità ha un robot che perde tempo
ad eseguire molti calcoli rispetto a uno che ne
esegue pochi o niente. Immaginate la mia sorpresa
quando ho eseguito il robot e mi son reso conto che
invece di penalizzare il mio robot, quel ciclo
RALLENTAVA TUTTA L'APPLET!!!
Anche se il mio robot resta fermo, non è importante.
Il fatto è che mi aspettavo che il MIO E SOLO IL MIO
robot fosse penalizzato rispetto ad altri robots e
invece mi accorgo che tutta l'applet rallenta
paurosamente.
Che senso ha una cosa del genere? Se il mio robot
esegue molte istruzioni, non dovrei rimetterci solo
io???

DUBBIO #3: PERCHE' IL MIO CODICE BLOCCA TUTTA
L'APPLET?

MOTIVAZIONE: Osservate il codice seguente:

public class __Prova3_ extends JJRobot
{
void main()
{
drive(0, 50);
while(true);
}
}

Come è possibile che, eseguendo questo robot, tutta
l'applet si blocca??? Io m'aspettavo che il mio robot
si bloccasse sul posto o che si andasse a schiantare
dritto contro il muro di destra, ma non è così:
ancora una volta il mio codice influenza tutta
l'applet invece di danneggiare solo i miei risultati.
Che senso ha questo comportamento?

DUBBIO #4: PERCHE' UN CODICE APPARENTEMENTE SIMILE A
QUELLO DEL DUBBIO #3 VIENE ESEGUITO COME PREVISTO
SOLO PERCHE' VENGONO INVOCATE LE FUNZIONI PREDEFINITE
DEL ROBOT?

MOTIVAZIONE: Osservate il codice seguente:

public class __Prova4_ extends JJRobot
{
void main()
{
drive(0, 50);
while(true)
loc_x(); // oppure cannon
(.,.); o time();
}
}

Il codice precedente funziona, cioè permette al robot
di vivere e sbattere contro il muro fino a che il
nemico non lo uccide, solo perché viene ciclicamente
invocata una funzione predefinita del robot. Se al
posto di quella istruzione ci fosse qualcos'altro
programmato da me, anche il semplice incremento di un
intero, l'applet non funzionerebbe.
Che senso ha questo comportamento? E' un obbligo
chiamare ciclicamente funzioni predefinite del robot
anche se non servono solo per far funzionare il gioco?

Discussion


Log in to post a comment.