In questo esercizio si crea l'applicazione che disegna il tabellone, estrae i numeri, li colloca sul tabellone e gestisce le vincite.
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:
Urna è un array di 90 interi
estratto contiene il numero tolto dall'urna
nrDentro conta quanti numeri sono rimasti nell'urna
punteggi è un array che conta quanti numeri sono stati estratti su ciascuna delle 18 righe del tabellone. Serve, quindi, per individuare i punteggi realizzati (ambo, terno, ecc.).
prosVinc tiene conto del prossimo punteggio atteso. Inizalmente vale 0 per indicare che si aspettqa l'ambo, poi vale 1 per indicare che si apsetta il terno, ecc.
DIM è una costante intera che rappresenta il lato di un quadrato in cui viene rappresentato il numero 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.
La classe deve gestire l'estrazione di un numero:
private int estrai() {
int n = Urna[estratto++];
return n;
}
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;
}
}
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);
}
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
}
}
}
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) { }
}
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");
}
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);
}