Console 12: DoppioUno: il codice completo


   Ecco, finalmente, il codice completo di DoppioUno:


public class DoppioUno{

static boolean compTurno=true, giocTurno=false, giocare = true;  //inizia il computer
static int puntC,puntG; //punteggio Computer, Giocatore
static int win = 40; //vince chi ha >= 40 punti


public static void main(String[] arg){
	System.out.println("*********************************************");
	System.out.println("+++++++++++++++++++++++++++++++++++++++++++++");
	System.out.println("+ DoppioUno: un buffo gioco di dadi!!        +");
	System.out.println("+++++++++++++++++++++++++++++++++++++++++++++");
	System.out.println("+ Per le regole leggi il file DoppioUno.txt +");
	System.out.println("*********************************************");
	System.out.println("*********************************************");
	
while(giocare){
	while(compTurno){ //gioca il computer
	int r = tiraDaddi();
	switch(r){
		case -1:
		puntC =0;
		System.out.println("Ho perso tutto!! Tocca a te...");
		cambiaTurno();
		break;
		
		case 0:
		System.out.println("Ho perso il turno! Tocca a te...");
		cambiaTurno();
		break;
		
		default:
		puntC += r;
		if(puntC >= win){
			System.out.println("Il mio punteggio e': "+puntC+" Ho vinto!!");
			finePartita();}
		else{
			int n = (int)(Math.random()*10);
			if(n > 5){
				System.out.println("Il mio punteggio e': "+puntC);
				System.out.println("Passo, tocca a te!");
				cambiaTurno();
				}
			}//fine else
		}//fine switch
	}// fine while(compTurno)

	while(giocTurno){
	int r = tiraDaddi();
	switch(r){
		case -1:
		puntG =0;
		System.out.println("Hai perso tutto!! Tocca a me!");
		cambiaTurno();
		break;
		
		case 0:
		System.out.println("Hai perso il tuo turno! Tocca a me");
		System.out.println("Punteggio giocatore: "+puntG);
		System.out.println("Punteggio computer: "+puntC);
		cambiaTurno();
		break;
		
		default:
		puntG += r;
		if(puntG >= win){
			System.out.println("Il tuo punteggio e': "+puntG+" Hai vinto!!");
			finePartita();
			}
		System.out.println("Punteggio giocatore: "+puntG);
		System.out.println("Punteggio computer: "+puntC);
		int a = Leggi.Risposta("Continuare? (1) Passare? (0)");
		if(a == 0){
			System.out.println("Ok, gioco io!");
			cambiaTurno();
			}
		}//fine switch
	}//fine while
	} // fine while(giocare)
}// fine main
/////////////////////////////////////////////////////////////
////////////////// tiraDaddi() ///////////////////////////////
static int tiraDaddi(){

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()

//////////////////////////////////////////////////////////////
/////////////////// finePartita() ////////////////////////////

static void finePartita(){

	int a = Leggi.Risposta("Altra partita? (1) Uscire? (0)");
	if( a == 0){
		System.exit(0);} 
	else{
		puntC = 0;
		puntG = 0;
		}
	}//fine finePartita()

///////////////////////////////////////////////////////////////////
/////////////////////// cambiaTurno() ////////////////////////////

static void cambiaTurno(){
	if(compTurno == true){
		compTurno = false;
		giocTurno = true;}
	else{
		compTurno = true;
		giocTurno = false;
		}
	}// fine cambiaTurno()
	
}//fine classe


Osservazioni:
  1. All'inizio della classe le variabili compTurno, ..., puntC, ... ecc vengono dichiarate "static" perchè sono poi usate nel metodo main che è "static". (Per il momento non entriamo nei dettagli e ci accontentiamo di questa spiegazione!)
  2. Abbiamo tre metodi (di cui due con ritorno void e senza parametri). Il lettore è caldamente invitato ha riflettere sull'utilità dell'avere definito questi metodi. Diciamo solo che, oltre ad averci risparmiato alcune righe di codice (sempre le stesse), semplificano il codice rendendolo più compatto e intuitibile.
  3. La scelta dei nomi (per le variabili, i metodi, ecc...) è molto importante: avremo potuto chiamare compTurno c e giocTurno, b. Certo è più corto! Però quanto poi si va a rileggere il codice (magari per modificarlo, ampiarlo) è molto più difficile ricordarsi chi è chi. Un nome non deve essere troppo lungo, ma neanche troppo corto: deve descrivere la variabile (o il metodo). Questo vale soprattutto per le variabili globali che compaiono spesso in tutto il programma. La lingua inglese che è molto sintetica, può tornare utile per trovare dei nomi azzecati.
  4. Nella giocata del computer, quando il computer deve decidere se rigiocare o passare, abbiamo introdotto una funzione aleatoria:
    int n = (int)(Math.random()*10);
    			if(n > 5){
    				System.out.println("Il mio punteggio e': "+puntC);
    				System.out.println("Passo, tocca a te!");
    				cambiaTurno();
    				}
    
    questa scelta non è molto realistica. Una scelta più strategica potrebbe essere così: se il computer sta vincendo, allora ha tendenza a passare (non vuole rischiare di perdere tutto), se invece è indietro, ha tendenza a rigiocare. Provate a modificare il programma seguendo questa impostazione.
  5. Prima di iniziare a scrivere codice è bene avere un'idea chiara della struttura generale, isolando quelle procedure ricorrenti che poi diventerano dei metodi. Per questo un buon metodo consiste nel prendere una penna ed un pezzo di carta e scrivere, a grandi linee, i metodi generali (tracciando magari qualche "diagramma di flusso").