Console 10: DoppioUno (metodi_II, switch)


   Adesso cerchiamo di definire il nostro metodo tiraDadi(). Questo metodo ci ritornerà un intero, il quale, in generale, sarà il punteggio ottenuto (questo se entrambi i dadi, d1, d2, sono > 1); dobbiamo però trovare un modo di distinguere i casi in cui uno o entrambi i dadi abbiano fatto uno. Se uno solo dei dadi ha fatto uno, il punteggio non è di nessuno aiuto (1+5 = 2+4). Usando gli if annidati, tutto questo si risolve facilmente:


 int tiraDadi(){

 int r=0,d1,d2;

 d1 = (int)(Math.random()*6)+1;
 d2 = (int)(Math.random()*6)+1;

 if(d1 == 1 & d2 == 1){  //d1*d2 == 1
	System.out.println("Dado 1:  :< ");
	System.out.println("Dado 2:  :< ");
	r = -1;}

 else if(d1 == 1 & d2 > 1){
	System.out.println("Dado 1:  :< ");
	System.out.println("Dado 2: "+d2);
	r =0;
	}
 else if(d2 == 1 & d1 > 1){
	System.out.println("Dado 1: "+d1);
	System.out.println("Dado 2:  :< ");
	r = 0;
	}

 else{
	System.out.println("Dado 1: "+d1);
	System.out.println("Dado 2: "+d2);
	r = d1 +d2;}
	
 return r;
 }//fine tiraDaddi()


Se entrambi i dadi hanno tirato più di uno, allora r = d1+d2 > 2; quindi non c'è nessuna ambiguità: se r = -1, il giocatore ha fatto doppio uno: perde il turno e il suo punteggio viene azzerato, se r = 0, il giocatore ha tirato uno, ed uno solo, uno: perde il turno, il suo punteggio rimane invariato; finalmente se r > 0, il giocatore mantiene il turno e il suo punteggio viene aumentato di r. Per distinguere tra questi vari casi, useremo l'istruzione switch

switch

La sintassi di switch è la seguente:

switch(espressione){
	case val1:
	//codice
	break;

	case val2:
	//codice
	break;

	.......
	case valn:
	//codice
	break;

	default:
	//codice
		}


L'espressione deve restituire un tipo semplice, i valori (val1,..., valn) di case devono essere compatibili (cioè dello stesso tipo) con l'espressione e costanti (letterali, non variabili). Il valore dell'espressione viene confrontato con ogni valore val1, ..., valn; se viene trovata una corrispondenza, viene eseguito il codice corrispondente a quel case, quando si arriva ad un break, si esce dallo switch (gli altri casi vengono ignorati). Se non viene trovata nessuna corrispondenza, viene eseguito il codice di default. Per esempio nel nostro caso (r è il valore ritornato da tiraDadi()):


 switch(r){
	case -1:
	punt = 0;
	cambiaTurno();
	break;

	case 0:
	cambiaTurno();
	break;

	default:
	punt = punt +r;
	 }


Quando si tratta di fare delle scelte multiple in base al valore di una variabile di tipo semplice (per esempio un int), lo switch è generalmente più efficace di una lunga serie di if ... else. Il codice è anche più limpido.
Osserviamo per concludere che il break non è obbligatorio, in assenza di break, si passerà al case successivo.