Laoratorio di sistemi Estrazione di una carta senza ripetizione Java [NetBeans] Figura 1 - Estraggo la prima carta (l'ultima di un mazzo ordinato) Figura 2 - Michio il mazzo e ne estraggo un'altra estrai_carta_v2.pdf Pag. 1/9 Cozzetto © Laoratorio di sistemi Estrazione di una carta senza ripetizione Java [NetBeans] Figura 3 - Una volta estratte tutte le carte, visualizzo un messaggio /* * Card.java * * Creato il 21 settembre 2006, 9.25 * * */ package cartejavaapp; import javax.swing.*; /** * * @author Maurizio Cozzetto */ public class Card { /** Creates a new instance of Carta */ private String valore; private String seme; // Gestisco l'immagine all'interno della classe private ImageIcon img; public Card() { // nessuna attività } estrai_carta_v2.pdf Pag. 2/9 Cozzetto © Laoratorio di sistemi Estrazione di una carta senza ripetizione Java [NetBeans] // Overloading del costruttore public Card(String valore,String seme) { // Preparo una carta con valore e seme fissati, caricandone l'immagine this.valore=valore; this.seme=seme; img = new javax.swing.ImageIcon(getClass().getResource("/img/"+this.getImageName())); } // Metodi getter public String getValore() { return valore; } public String getSeme() { return seme; } // Restituisce la stringa contenente valore e seme, es. AC, asso di cuori public String getCard() { return valore+seme; } // Ritorna il nome del file immagine, es AC.png public String getImageName() { return getCard()+".png"; } // Metodi setter public void setSeme(String seme) { this.seme=seme; } public void setValore(String valore) { this.valore=valore; } // Ritorna un oggetto di tipo ImageIcon contenente l'immagine public ImageIcon getImageCard() { return img; } } estrai_carta_v2.pdf Pag. 3/9 Cozzetto © Laoratorio di sistemi Estrazione di una carta senza ripetizione Java [NetBeans] /* * Deck.java * * Creato il 21 settembre 2006, 9.29 * * */ package cartejavaapp; import javax.swing.JOptionPane; /** * * @author Maurizio Cozzetto */ public class Deck { private final int NUMERO_CARTE=52; private Card[] deck=new Card[NUMERO_CARTE]; private final String[] semi={"C","Q","F","P"}; private final String[] valori={"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; // Conta il numero di carte rimanenti private int n = NUMERO_CARTE; /** Creates a new instance of Deck */ public Deck() { int k=0; int i; int j; for (i=0; i<semi.length ; i++) { String seme=new String(semi[i]); for (j=0; j<valori.length ; j++) { Card temp=new Card(valori[j],seme); deck[k]=temp; k++; } } } // Mischia il mazzo public void shuffle() { Card temp; for (int i=0; i<n; i++) { int j=(int)(Math.random()*(n-1)); temp=deck[i]; deck[i]=deck[j]; deck[j]=temp; } } estrai_carta_v2.pdf Pag. 4/9 Cozzetto © Laoratorio di sistemi Estrazione di una carta senza ripetizione Java [NetBeans] // Estrae dal mazzo una carta a caso public Card estrai() { Card temp; int p; // Trovo un numero casuale compreso tra 0 e n-1 p=(int)(Math.random()*(n-1)); // Se ho ancora carte, scambio la carta di posto p con quella di posto n-1 if (n>0) { temp=deck[p]; deck[p]=deck[n-1]; deck[n-1]=temp; // Manca una carta per cui decremento n n=n-1; return temp; } else { return null; } } // Estraggo le carte in sequenza a partire dalla più alta public Card estraiInSequenza() { Card temp; n--; if (n < 0) return null; else return deck[n]; } // Estrae la prima carta public Card primaCarta() { return deck[0]; } public Card ultimaCarta() { return deck[n-1]; } } estrai_carta_v2.pdf Pag. 5/9 Cozzetto © Laoratorio di sistemi Estrazione di una carta senza ripetizione Java [NetBeans] /* * CarteJFrame.java * * Creato il 21 settembre 2006, 9.58 */ package cartejavaapp; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.JOptionPane; /** * * @author Maurizio Cozzetto */ public class CarteJFrame extends javax.swing.JFrame { private Deck d; /** Creates new form CarteJFrame */ public CarteJFrame() { // Inizializzo il mazzo di carte d = new Deck(); // Preparo i componenti della finestra initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { estraijButton = new javax.swing.JButton(); cartajLabel = new javax.swing.JLabel(); mischiaMazzojButton = new javax.swing.JButton(); EstraiInSequjButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("Estrazione di una carta da gioco senza ripetizione"); estraijButton.setText("Estrai"); estraijButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { estraijButtonActionPerformed(evt); } }); cartajLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); mischiaMazzojButton.setText("Mischia mazzo"); mischiaMazzojButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mischiaMazzojButtonActionPerformed(evt); estrai_carta_v2.pdf Pag. 6/9 Cozzetto © Laoratorio di sistemi Estrazione di una carta senza ripetizione Java [NetBeans] } }); EstraiInSequjButton.setText("Estrai in sequenza"); EstraiInSequjButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { EstraiInSequjButtonActionPerformed(evt); } }); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(cartajLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE) .add(mischiaMazzojButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE) .add(estraijButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE) .add(EstraiInSequjButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(cartajLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 171, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(24, 24, 24) .add(mischiaMazzojButton) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(estraijButton) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(EstraiInSequjButton) .addContainerGap(13, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void EstraiInSequjButtonActionPerformed(java.awt.event.ActionEvent evt) { // Estraggo le carte in sequenza partendo dall'ultima Card c = d.estraiInSequenza(); // Se ci sono carte da estrarre, ne visualizzo l'immagine if (c!=null) { ImageIcon icon=c.getImageCard(); cartajLabel.setIcon(icon); } else { JOptionPane.showMessageDialog(null,"Non ci sono più carte da estrarre."); estrai_carta_v2.pdf Pag. 7/9 Cozzetto © Laoratorio di sistemi Estrazione di una carta senza ripetizione Java [NetBeans] } } private void mischiaMazzojButtonActionPerformed(java.awt.event.ActionEvent evt) { // Mischio il mazzo d.shuffle(); } private void estraijButtonActionPerformed(java.awt.event.ActionEvent evt) { // Estraggo una carta a caso dal mazzo Card c = d.estrai(); // Se ci sono carte da estrarre, preparo l'immagine if (c!=null) { ImageIcon icon=c.getImageCard(); cartajLabel.setIcon(icon); } else { JOptionPane.showMessageDialog(null,"Non ci sono più carte da estrarre."); } } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new CarteJFrame().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton EstraiInSequjButton; private javax.swing.JLabel cartajLabel; private javax.swing.JButton estraijButton; private javax.swing.JButton mischiaMazzojButton; // End of variables declaration } estrai_carta_v2.pdf Pag. 8/9 Cozzetto © Laoratorio di sistemi Estrazione di una carta senza ripetizione Java [NetBeans] /* * Main.java * * Creato il 21 settembre 2006, 9.24 * */ package cartejavaapp; /** * * @author Maurizio Cozzetto */ public class Main { /** Creates a new instance of Main */ public Main() { } /** * @param args the command line arguments */ public static void main(String[] args) { CarteJFrame f = new CarteJFrame(); f.setVisible(true); } } estrai_carta_v2.pdf Pag. 9/9 Cozzetto ©