gioco della Tombola.

In questo esercizio si crea l'applicazione che disegna il tabellone, estrae i numeri, li colloca sul tabellone e gestisce le vincite.

Proprietà della classe:

private int Urna[] = new int[90];

private int estratto, nrDentro;

private int punteggi[] = new int[18];

private int prosVinc;

final int DIM = 30;

Significato delle variabili:

Disegno del tabellone

Nella classe viene inserito il metodo Disegna, che può essere richiamato quando si è pronti per iniziare il gioco:

private void disegna(){

  Graphics2D g = (Graphics2D) jPanel1.getGraphics();

  int x, y, i=0;

  for(y=60, i=1; y<9*DIM+60; y+=DIM)

    for (x=10; x<(10*DIM+10); x+=DIM, i++) {

      g.drawString(""+i, x, y);

    }

  estratto = 0;

  nrDentro=90;

  for (i=0; i<18; i++) punteggi[i]=0;

  prosVinc=0;

  jButton1.setEnabled(true);

  g.drawLine(5, 40, 10*DIM+5, 40);

  g.drawLine(5, 40+3*DIM, 10*DIM+5, 40+3*DIM);

  g.drawLine(5, 40+6*DIM, 10*DIM+5, 40+6*DIM);

  g.drawLine(5, 40+9*DIM, 10*DIM+5, 40+9*DIM);

  g.drawLine(5, 40, 5, 40+9*DIM);

  g.drawLine(5*DIM, 40, 5*DIM, 40+9*DIM);

  g.drawLine(10*DIM+5, 40, 10*DIM+5, 40+9*DIM);

}

Commenti:

Si ottiene un riferimento al contesto grafico del pannello, con il quale si disegna sul pannello.

Utilizzando la costante DIM si calcolano le posizioni dei numeri sul tabellone.

Il pulsante per chiedere l'estrazione di un numero viene abilitato.

Vengono tracciate delle linee, per delimitare le 6 cartelle in cui è suddiviso il tabellone.

il metodo estrai()

La classe deve gestire l'estrazione di un numero:

private int estrai() {

  int n = Urna[estratto++];

  return n;

}

Mescolare i tasselli.

Creare un menu. Aggiungere la voce "Inizia gioco" e completare il gestore di evento:

private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {

  // TODO add your handling code here:

  disegna();

  int i, indice, tmp;

  // generazione dei numeri nell'urna
  for (i=0; i<90; i++) Urna[i] = i+1;

  Random caso = new Random();

  // mescola i 90 numeri nell'urna

  for (i=89; i>1; i--) {

    indice = caso.nextInt(i);

    tmp = Urna[indice];

    Urna[indice] = Urna[i];

    Urna[i] = tmp;

    }

  }

Gestione dell'evento "Estrai"

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

  // TODO add your handling code here:

  if (nrDentro==0) return;

  nrDentro--;

  Graphics2D g = (Graphics2D)jPanel1.getGraphics();

  int n = estrai(), x, y;

  y = (int) (n-1)/10*DIM+45;

  x = ((n-1)%10)*DIM + 8;

  jTextArea1.append("\n"+(90-nrDentro)+": "+n);

  g.drawOval(x, y, DIM/2, DIM/2);

  Vincita(n);

}

Calcolare il punteggio

private void Vincita(int n){

  // controllo del punteggio.

  int riga = (n-1)/5;

  ++punteggi[riga]; // conta i numeri sulla riga.

  

  if (punteggi[riga]==2 && prosVinc==0) {

    jTextArea1.append("\nAmbo");

    prosVinc++;

  }

  if (punteggi[riga]==3 && prosVinc==1) {

    jTextArea1.append("\nTerno");

    prosVinc++;

  }

  if (punteggi[riga]==4 && prosVinc==2) {

    jTextArea1.append("\nQuaterna");

    prosVinc++;

  }

  if (punteggi[riga]==5 && prosVinc==3) {

    jTextArea1.append("\nCinquina");

    prosVinc++;

  }

  // Tombola se in una sottocartella ci sono 15 numeri estratti.

  if (prosVinc==4) {

    for(int i=0; i<18; i+=3)

      if ((punteggi[i]+punteggi[i+1]+punteggi[i+2])==15) {

        jTextArea1.append("\nTombola");

        // fermare il gioco e proporre nuova partita

      }

  }

}


Tombola in rete.

Server.

Nella sezione proprietà della classe, aggiungere la dichiarazione:

private final int TOTCART = 24;

private String cartelle[] = new String[TOTCART];

private int nrCon, nrUt;

private final int NRCON=3;

private Socket[] socket;

quindi scrivere il metodo per inizializzare gli elementi dell'array:

private void creaCartelle() {

  cartelle[0] = ".6..2330..51..78....17..3941..60..85..1925..4358....89";

  cartelle[1] = ".2..20..42..6874...3..29..4453..76....15..34..5569..80";

  cartelle[2] = ".5..22..48..63..81..12..36..54..7586.8..24....5664..90";

  cartelle[3] = ".7..21..45..6172...913..32..57..73....18..3547..65..88";

  cartelle[4] = "..11..3746....7082.4..2638..59..77....1428..49..66..87";

  cartelle[5] = "..10..31..50..7183.1..27..40..6279....16..33..5267..84";

  cartelle[6] = "..1323..4055..70...7..2534..59..73....15..3646..64..87";

  cartelle[7] = "..11..31..5062..82.1..28..4254..78....18..3345..6579..";

  cartelle[8] = "..19..32..5160..86.4..24..47..6372...6..26..49..697288";

  cartelle[9] = "..10..35..56..7680.8..21..44..66..81..14..38..5867..83";

  cartelle[10] = "..1220..43..61..85.216..37..53..74...9..29..48....7790";

  cartelle[11] = "..17..30..5268..84.3..22..41....7189.5..2739..57..75..";

  cartelle[12] = "..10..3543..63..82.316..38..51..73....1724..4556..79..";

  cartelle[13] = ".5..2630..53..74...7..28..48..68..84..14..34..55..7589";

  cartelle[14] = "..11..31..57..7186.2..20..46..6272...6....32..5869..88";

  cartelle[15] = ".4..22..4054..77...9..25..42..60..80..12..39..5967..83";

  cartelle[16] = "..1523..41..61..81.8..2736..52..76....18..3747..66..90";

  cartelle[17] = "..1321..44..6470....19..33..50..7885.1..29..49..65..87";

  cartelle[18] = ".1..20..4655..72....10..3149..60..82..182737..50....90";

  cartelle[19] = ".2..22..40..61..83..12..33..54..7189.4..25..45..6678..";

  cartelle[20] = ".5..2332..53..73....1329..42..63..87.917..38..57..76..";

  cartelle[21] = "..16....445265..80.6..28....58..7484..19..3547..69..86";

  cartelle[22] = ".8..26..43..64..81..14..34..51..7085..15..3948..6779..";

  cartelle[23] = ".3..2136..56....88.7..24..41..6275....11..30..506877..";

}

Alla fine del metodo disegna() aggiungere le seguenti righe:

  g.drawLine(10*DIM+5, 40, 10*DIM+5, 40+9*DIM);

  creaCartelle();

  try {

    ascolta();

  } catch(IOException e) { }

}

Il metodo ascolta()

public void ascolta() throws IOException {

  nrCon=NRCON-1; // max 3 connessioni

  nrUt = 0;

  socket = new Socket[NRCON];

  //out = new PrintWriter[NRCON];

  ServerSocket server = new ServerSocket(9090);

  while(nrCon>=0) {

    if (nrUt==24) return;

    try {

      socket[nrCon] = server.accept();

      try {

        PrintWriter out = new PrintWriter(socket[nrCon].getOutputStream(), true);

        out.println(cartelle[nrUt++]);

      } catch(IOException e) { }

    } catch(IOException e) { }

    nrCon--;

  }

  System.out.println("tutti gli utenti sono connessi");

}

Client.

Proprietà della classe:

private BufferedReader in;

private PrintWriter out;

Sul Frame, inserire un pulsante, una textArea e un pannello in cui disegnare la cartella.

Scrivere il gestore del pulsante:

try {

  connetti();

} catch(IOException e) { }

Inserire il metodo richiamato dal gestore dell'evento clic sul pulsante:

public void connetti() throws IOException {

  // Crea la connessione e inizia la trasmissione.

  Socket socket = new Socket("127.0.0.1", 9090);

  in = new BufferedReader(

                new InputStreamReader(socket.getInputStream()));

  out = new PrintWriter(socket.getOutputStream(), true);

  String Cart = in.readLine();

  String Num;

  jTextArea1.append(Cart + "\n");

  Graphics2D g = (Graphics2D) jPanel1.getGraphics();

  for (int i=0; i<18; i+=2) {

    Num = Cart.substring(i,i+2);

    g.drawString(Num, i*20+20, 40);

  }

  for (int i=18; i<36; i+=2) {

    Num = Cart.substring(i,i+2);

    g.drawString(Num, (i-18)*20+20, 80);

  }

  for (int i=36; i<54; i+=2) {

    Num = Cart.substring(i,i+2);

    g.drawString(Num, (i-36)*20+20, 120);

  }

  g.drawLine(10, 25, 370, 25);

  g.drawLine(10, 55, 370, 55);

  g.drawLine(10, 95, 370, 95);

  g.drawLine(10, 135, 370, 135);

  for (int i=0; i<20; i+=2)

    g.drawLine(i*20+10, 25, i*20+10, 135);

}

Versione completa