Console 7: Su e Giu (if ... else)


    Tanto per essere sicuri di avere capito bene quanto detto prima, cerchiamo di applicare le conoscenze fin qui acquisite alla realizzazione di un giochino, molto semplice, chiamato Su e Giu.

Il gioco si svolge così:
  1. Il computer genera un numero casuale (meglio: quasi-casuale), x, tra 0 e 10
  2. L'utente (=il giocatore) deve cercare di indovinare il numero "segreto" del computer per tentativi
  3. L'utente immette un numero, a. Se a < x, il computer risponde "Più su!"; se a > x, il computer risponde: "Più giù!"; se a = x, il computer risponde "Hai vinto!!" e la partita è finita.
  4. A fine partita, viene stampata a video, la domanda: "Un'altra? (0) Uscire? (1)" Digitando 0, si inizia una nuova partita, digitando 1, il programma termina.

Il primo problema è generare un numero "casuale" tra 0 e 10. Questo, a priori, è un problema molto difficile. Nel nostro caso, per fortuna, qualcuno ci ha pensato prima! Infatti Java dispone di un metodo (funzione), Math.random(), che definisce un numero (in formato double) "pseudo-casuale" x, con 0 <= x < 1. Per esempio: 0,6549843, oppure 0,234763. Bene, ma noi vogliamo un numero, intero, tra 0 e 10! Come si fa? Basta moltiplicare x per 11 e chiedere che il risultato sia un intero:
int n = (int)(Math.random()*11);

Infatti Math.random() fornisce un numero x con 0 <= x < 1. Moltiplicando per 11 abbiamo un numero, X, con: 0 <= X < 11.

Quindi: X = Math.random()*11; // è un numero (double) X, tale che 0 < = X < 11

int x = (int)X; //è la parte intera di X, cioè si tralascia tutto quello che c'è dopo la virgola

Per esempio: 0,6549843*11 = 7,2048273; oppure 0,99*11 = 10,89. Prendendo le parti intere (cioè tralasciando quanto viene dopo la virgola) e questo corrisponde a fare (int)X;
viene: (int)(0,6549843*11) = 7;   (int)(0,99*11) = 10

In conclusione l'istruzione: int n = (int)(Math.random()*11);
ci fornisce un int "pseudo-casuale" tra 0 e 10 (chi è interessato al perchè del "pseudo", può seguire questo link).

Quindi, ci sembra che il nostro programma potrebbe iniziare così:


public class SuGiu_0{

public static void main(String[] arg){

int x = (int)(Math.random()*11);

//... altre cose



Nel seguito si assumerà che l'utente conosca le regole del gioco (che potrebbero trovarsi per esempio in un file "SuGiu_Leggimi.txt"). Quindi, a questo punto, noi aspettiamo che l'utente ci comunichi, tramite la riga dei comandi, un numero tra 0 e 10. Perciò la nostra prossima istruzione sarà di ricuperare questo numero. Lo facciamo tramite la funzione Leggi.Risposta(String), cioè:


int a = Leggi.Risposta("Inserisci un numero tra 0 e 10");


A questo punto ci sono tre casi: a < x;   a > x;   a = x.
Nel primo caso dobbiamo rispondere: "Piu' su!", nel secondo "Piu' giu'!", nel terzo: "Hai vinto!!" (e la partita finisce qui). Quindi avremo qualcosa del genere:


if(a < x){
	System.out.println("Piu' su!");
	}

if(a > x){
	System.out.println("Piu' giu'!");
	}

if(a == x){
	System.out.println("Hai vinto!!");
	}



Rimane da inserire tutto in un ciclo while e, nel caso di vittoria bisogna chiedere all'utente se vuole continuare o uscire. Se vuole uscire basta cambiare il valore del contatore che abbiamo messo nel while:


int finito = 1;
while(finito == 1){
// codice
...
if(a == x){
	System.out.println("Hai vinto!!");
	int r = Leggi.Risposta("Altra partita? (1) Uscire? (0)");
	if(r == 0){finito =0;} //si esce dal while e poi dal programma


E se l'utente vuole continuare?? Dobbiamo rimanere nel ciclo while (quindi non modificare l'int finito) ma dobbiamo cambiare il numero segreto x. Per esempio:

if(r == 1){x = (int)(Math.random()*11);}


C'è un modo più elegante di fare ciò con l'istruzione if ... else
L'istruzione if ... else funziona così (if ... else significa: se ... altrimenti)

	if(condizione 1){
			codice 1;
			}
	else{
		codice 2;
		}
	codice 3;


Se la condizione 1 è vera, sarà effetuato il codice 1. Il codice 2 verrà ignorato e si proseguirà col codice 3.
Se la condizione 1 è falsa, il codice 1 sarà ignorato (normale, siamo in un if), ma sarà effetuato il codice 2 e si proseguirà col codice 3.

In conclusione uno, ed uno solo, tra codice 1 e codice 2 sarà eseguito.



Quindi possiamo concludere nel modo seguente:
if(r == 0){finito = 0;}
else{
	x = (int)(Math.random()*11);}



Mettendo tutto insieme, ecco il codice completo:


 public class SuGiu_0{


 public static void main(String[] arg){

 int x,a=-1;

 x = (int)(Math.random()*11);

 int finito = 1;


 while(finito == 1){

 a = Leggi.Risposta("Inserisci il tuo numero:");


 System.out.println("Il tuo numero e':"+a+"  il numero segreto e': "+x); /* controllo, da commentare

 (cioè togliere) per la versione finale*/

 if(a < x){System.out.println("Piu su!");}

 if(a > x){System.out.println("Piu giu!");}

 if(a == x){System.out.println("Hai vinto!");
		int r = Leggi.Risposta("Altra partita? (1) Uscire? (0)");
		if(r == 0){finito = 0;}
		else{x = (int)(Math.random()*11);}
		}  //fine if(a == x)
	 }//fine while
   }//fine main 
 }//fine classe



Un'ultima cosa: nel file .java, si possono fare dei commenti (che vengono ignorati dal compilatore, ma che servono al programmatore) in due modi, su una riga o su più righe:

// tutto quello che viene dopo, su questa riga, è un commento

commento su più righe racchiuso tra /* e */:

/* questo
è
un commento*/