/*
Prova 5
Paolo, Francesco e Luigi vanno in palestra. Paolo può fare esercizi di ogni tipo ma deve finire in 30 minuti.
Francesco può passare tempo illimitato ma in totale non deve consumare piu' di 2000 calorie.
Luigi può esercitarsi per 30 minuti ma non deve consumare più di 2000 calorie.
Ogni esercizio ha una durata intera in minuti (random) tra 1 e 5 e una richiesta di
calorie intera (random) tra 100 e 500.
Si vuole simulare la situazione e sapere quanti esercizi e quante calorie e per quanto tempo i tre amici si allenano.
ATTENZIONE: non si vuole ottimizzare l'allenamento dei tre amici!
-----------------------------------------------------------------------------------
In questa versione si è creato un Array di atleti
*/
public class Palestra {
public static void main(String args[]) {
String[] nomiatleti = {"Paolo", "Francesco", "Luigi", "Giovanni", "Aldo", "Franco"};
Atleta[] atleti = new Atleta[nomiatleti.length];
//crea atleti
double cas;
for (int c=0; c<nomiatleti.length; c++) {
cas = Math.random();
if (cas<.3) atleti[c] = new Atleta1(nomiatleti[c], 30);
else if (cas<.6) atleti[c] = new Atleta2(nomiatleti[c], 2000);
else atleti[c] = new Atleta3(nomiatleti[c], 30, 2000);
System.out.println("Creato " + atleti[c]);
}
//Esercita
boolean esegui=true;
for (int c=0; c<nomiatleti.length; c++) {
esegui = true;
while (esegui) esegui = atleti[c].faiEsercizio();
}
//statistiche
for (int c=0; c<nomiatleti.length; c++)
atleti[c].getStatistiche();
}
}
abstract class Atleta {
//var istanza
protected int calorie, tempo, esercizi;
protected String nome;
//costruttore
public Atleta(String ilnome) {
calorie = 0; tempo = 0; esercizi = 0;
nome = ilnome;
}
//metodi pubblici
public void getStatistiche() {
System.out.println("\nAtleta " + nome +
"\nTipo: " + this +
"\nCalorie: " + calorie + "\nTempo: " + tempo +
"\nNumero esercizi: " + esercizi);
}
abstract boolean faiEsercizio();
}
class Atleta1 extends Atleta {
private int maxTempo;
//builder
public Atleta1(String ilnome, int limtempo) {
super(ilnome);
maxTempo = limtempo;
}
//metodo pubblico
public boolean faiEsercizio() {
Exerciser Ex = new Exerciser();
if (tempo + Ex.getTempo() < maxTempo) {
esercizi++;
tempo += Ex.getTempo();
calorie += Ex.getCalorie();
return true;
}
else return false;
}
public String toString() {return nome + ", atleta con Limite di tempo: " + maxTempo;}
}
class Atleta2 extends Atleta {
private int maxCalorie;
//builder
public Atleta2(String ilnome, int limcal) {
super(ilnome);
maxCalorie = limcal;
}
//metodo pubblico
public boolean faiEsercizio() {
Exerciser Ex = new Exerciser();
if (calorie + Ex.getCalorie() < maxCalorie) {
esercizi++;
tempo += Ex.getTempo();
calorie += Ex.getCalorie();
return true;
}
else return false;
}
public String toString() {return nome + ", atleta con Limite di calorie: " + maxCalorie;}
}
class Atleta3 extends Atleta {
private int maxCalorie, maxTempo;
//builder
public Atleta3(String ilnome, int limtempo, int limcal) {
super(ilnome);
maxCalorie = limcal;
maxTempo = limtempo;
}
//metodo pubblico
public boolean faiEsercizio() {
Exerciser Ex = new Exerciser();
if (calorie + Ex.getCalorie() < maxCalorie &&
tempo + Ex.getTempo() < maxTempo) {
esercizi++;
tempo += Ex.getTempo();
calorie += Ex.getCalorie();
return true;
}
else return false;
}
public String toString() {return nome + ", atleta con Limite di tempo e calorie : " +
maxTempo + " " + maxCalorie;}
}
class Exerciser {
private int time, kilocal;
public Exerciser() {
time = (int)(Math.random()*5+1);
kilocal = (int)(Math.random()*401+100);
}
public int getTempo() {return time;}
public int getCalorie() {return kilocal;}
}