Scopo: Realizzare un'interfaccia per un gioco in cui una pallina si muove in un ambiente di lavoro che presenta ostacoli contro i quali la pallina puo' urtare e buchi in cui la pallina puo' cadere. Lo scopo del gioco e' non far cadere la pallina in un buco.
Consideriamo una rappresentazione bidimensionale. Abbiamo una pallina che si muove in un'ambiente di lavoro con una certa velocita'. La pallina e' un cerchio, l'ambiente di lavoro un rettangolo.
L'ambiente presenta ostacoli e buchi. Ogni ostacolo e' un rettangolo. Quando la pallina urta un ostacolo, viene rimbalzata indietro. Lo stesso avviene quando la pallina urta una parete dell'ambiente di lavoro.
Ogni buco e' un cerchio.
Se durante il moto la pallina passa con il suo baricentro sopra un
buco, e il buco ha diametro superiore a quello
della pallina, ci cade dentro, e il gioco termina.
L'utente puo' iniziare un nuovo gioco collocando un'altra pallina.
L'utente puo' variare la velocita' della pallina e le sue dimensioni
ad animazione ferma.
Puo' aggiungere ostacoli e buchi, cancellarli, spostarli, cambiarne
le dimensioni.
Ad animazione in corso l'utente puo' agire sulla direzione dela velocita' della pallina attraendola verso un punto oppure verso un lato dell'ambiente di lavoro.
Il programma che implementa l'applicazione viene dato a scatola chiusa e contiene una serie di strutture dati ed operazioni che l'interfaccia puo' utilizzare, senza modificarle.
Il programma applicativo contiene al suo interno le strutture dati per rappresentare:
Un buco e' descritto da:
Un ostacolo e' descritto da:
Una pallina e' descritta da:
L'ambiente di lavoro e' descritto da:
Il programma applicativo fornisce funzioni per:
Inizializzare lo spazio di lavoro, leggere e modificare le sue
informazioni.
Inizialmente nello spazio di lavoro non sono presenti
ne' buchi, ne' ostacoli, ne' la pallina.
Creare / eliminare un ostacolo, leggere e modificare le sue informazioni.
Creare / eliminare un buco, leggere e modificare le sue informazioni.
Inserire la pallina, modificare le sue informazioni, rimuoverla.
Posizionare (in modo casuale) un insieme di ostacoli e buchi
in una sotto-parte dell'ambiente di lavoro.
La sotto-parte e' rettangolare, puo' coincidere con tutto l'ambiente di
lavoro. Al momento in cui si chiama la funzione, la sotto-parte deve
essere vuota.
Occorre specificare il raggio minimo e massimo di un buco da inserire
e il lato minimo e massimo di un ostacolo da inserire.
Nonche' la percentuale reciproca fra ostacoli e buchi.
Esempio:
Genera 40% di buchi di raggio fra 6 e 8 e 60% di ostacoli
di lato fra 10 e 40 in sotto-parte di diagonale (10,10) - (130,70).
Svuotare una sotto-parte dell'ambiente di lavoro dai buchi e ostacoli presenti (parzialmente o totalmente contenuti in essa).
Ottenere tutti gli ostacoli e tutti i buchi presenti nell'ambiente di lavoro.
Ottenere la pallina.
Attrarre la velocita' della pallina verso
un punto oppure verso un lato dell'ambiente di lavoro, con una
una certa percentuale di attrazione.
La velocita' della pallina
tendera' a convergere verso il punto o il lato.
La convergenza e' proporzionale alla percentuale di attrazione.
Esempi:
100% = la velocita' si dirige a puntare esattamente verso l'attrattore,
50% = ruota di meta' dell'angolo che sarebbe necessario a puntare
direttamente verso l'attrattore ecc.
Avanzare di un'unita' di tempo nella simulazione. Se la pallina deve rimbalzare contro un ostacolo o cadere dentro un buco, questo comportamento viene gestito internamente dall'applicazione.
L'interfaccia deve usare il programma applicativo a scatola chiusa, senza modificarli. Deve fornire all'utente strumenti per compiere le seguenti operazioni:
Inizializzare le dimensioni dell'ambiente di lavoro. Questa operazione va eseguita ad ambiente di lavoro vuoto.
Caricare da file ostacoli e buchi.
Aggiungere, cancellare o modificare singoli ostacoli e singoli buchi.
Riempire l'intero ambiente o una sua sotto-area di una miscela di ostacoli e buchi in percentuali assegnate.
Cancellare ostacoli e buchi specificando una sotto-area che deve essere svuotata.
Visualizzare la situazione corrente (si intende il disegno grafico!).
Inserire la pallina, spostarla, modificare la sua velocita', cancellarla.
Modificare la direzione della velocita' della pallina mediante un attrattore. L'attrattore puo' essere un punto all'interno dell'ambiente di lavoro oppure un lato dell'ambiente di lavoro.
Eseguire la simulazione in animazione continua (con velocita' controllabile dall'utente), con possibilita' per l'utente di stabilire pause a comando oppure pause automatiche ad intervalli di tempo stabiliti (ogni tot unita' di tempo), oppure ad ogni urto.
Tutte le operazioni
possono essere eseguite all'inizio o durante qualsiasi pausa della
simulazione.
La simulazione deve poi riprendere dalla situazione in cui si era
fermata, con le modifiche apportate dall'utente.
Unica eccezione l'attrazione della velocita' che puo' essere eseguita
anche a simulazione in corso (questo e' il modo in cui l'utente
cerca di evitare che la pallina cada nei buchi).
L'animazione puo' essere eseguita solo se c'e' la pallina e c'e' almeno un buco nell'ambiente.
La visualizzazione deve riflettere in ogni momento lo stato corrente della simulazione.