04.06.2008 | 22:12:22
immagine
Ing. Emanuele Scapin

Java, gestione thread che simulano dei giocatori di dadi.
  • Si propone di sviluppare un'applicazione Java che simuli dei giocatori di dadi, vince il giocatore che ha totalizzato più punti entro un verto numero di giocate.


  • La classe del thread ha dei dati che identificano il giocatore, il tempo di attesa tra una giocata e l'altra, il totale dei punti ottenuti, il valore massimo da raggiungere per vincere.
    Il thread deve conoscere la finestra (interfaccia grafica) al fine di scrivere su una txtArea.

    public class Giocatore extends Thread {
        private String nome;
        private int attesa = 1; // in secondi
        private Finestra finestra;
        private int totale = 0;
        private int massimo = 100;
    
        public Giocatore(String nome, int attesa) {
            this.nome = nome;
            this.attesa = attesa;
        }
       
        public Giocatore(String nome, int attesa, Finestra finestra) {
            this.nome = nome;
            this.attesa = attesa;
            this.finestra = finestra;
        }
        
        public Giocatore(String nome, int attesa, Finestra finestra, int massimo) {
            this.nome = nome;
            this.attesa = attesa;
            this.finestra = finestra;
            this.massimo = massimo;
        }    
    
        public String getNome() {
            return nome;
        }
    
        public int getAttesa() {
            return attesa;
        }
    
        public int getMassimo() {
            return massimo;
        }
    
        @Override
        public void run() {
            while(totale < massimo) {
                try {
                    Random r = new Random();
                    int v = r.nextInt(11)+2;
                    
                    System.out.println("thread "+ nome +", valore "+ v +", totale "+ totale);
                    finestra.stampa("thread "+ nome +", valore "+ v +", totale "+ totale);
                    
                    totale = totale + v;
                    if (totale >= massimo) finestra.setVittoria(nome);
                    
                    sleep(attesa * 1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Giocatore.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
            
    }
            

  • La classe che definisce la finestra (jframe, interfaccia grafica), ha uno spinner per stabilire il numero di giocatori, ha un combobox per stabilire il valore da raggiungere per ottenere la vittoria, ha un bottone di avvio dei threads e un bottone per fermarli, inltre è presente il bottone Esci per chiudere il programma.
    Per permettere ai threads di scrivere nella textArea è presente un metodo pubblico stampa sincronizzato per evitare conflitti. E' inoltre presente un metodo setVittoria che permettere al giocatore che arriva per primo al valore massimo di punteggio di definirsi vincitore, nessun altro lo potrà fare successivamente.

    public class Finestra extends javax.swing.JFrame {
    
        private ArrayList<Giocatore> lista = new ArrayList<>();
        private boolean vittoria = false;
    
        /**
         * Creates new form Finestra
         */
        public Finestra() {
            initComponents();
        }
        
        public synchronized void stampa(String txt) {
            txtArea.append(txt+"\n");
        }
        
        public synchronized boolean setVittoria(String txt) {
            boolean ret = false;
            
            if (!vittoria) {
                vittoria = true;
                ret = true;
                stampa(txt + " ha vinto!");
            }
            else ret = false;
            
            return ret;
        }                    
    
        private void btnEsciActionPerformed(java.awt.event.ActionEvent evt) {                                        
            System.exit(0);
        }                                       
    
        private void btnAvviaActionPerformed(java.awt.event.ActionEvent evt) {                                         
            int num = Integer.parseInt(spnNumGiocatori.getValue().toString());
            int max = Integer.parseInt(cmbMassimo.getSelectedItem().toString());
    
            txtArea.selectAll();
            txtArea.replaceSelection("");
    
            for(int i=0; i < num; i++) {
                Giocatore g = new Giocatore("Giovatore "+ (i+1), 1, this, max);
                lista.add(g);
                g.start();
            }
        }                                        
    
        private void btnChiudiActionPerformed(java.awt.event.ActionEvent evt) {                                          
            for(int i=0; i < lista.size(); i++) {
                lista.get(i).stop();
            }
        }                                         
    
        // Variables declaration - do not modify                     
        private javax.swing.JButton btnAvvia;
        private javax.swing.JButton btnChiudi;
        private javax.swing.JButton btnEsci;
        private javax.swing.JComboBox<String> cmbMassimo;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JLabel jLabel2;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JSpinner spnNumGiocatori;
        private javax.swing.JTextArea txtArea;
        // End of variables declaration                   
    }
            

© Emanuele Scapin 2008-2018

 

Valid HTML 4.01! Valid CSS!