ancient-projects

My earliest programs (2006-2010)
git clone https://git.tronto.net/ancient-projects
Download | Log | Files | Refs | README

Frame.java (21146B)


      1 /*
      2 Copyright 2009-2010 Sebastiano Tronto <sebastiano@luganega.org>
      3 
      4 This file is part of JBriscola.
      5 
      6     JBriscola is free software; you can redistribute it and/or modify
      7     it under the terms of the GNU General Public License as published by
      8     the Free Software Foundation; either version 2 of the License, or
      9     (at your option) any later version.
     10 
     11     JBriscola is distributed in the hope that it will be useful,
     12     but WITHOUT ANY WARRANTY; without even the implied warranty of
     13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14     GNU General Public License for more details.
     15 
     16     You should have received a copy of the GNU General Public License
     17     along with JBriscola; if not, write to the Free Software
     18     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     19 
     20 */
     21 
     22 import javax.swing.*;
     23 import javax.sound.sampled.*;
     24 import java.io.*;
     25 import java.net.*;
     26 import java.awt.*;
     27 import java.awt.event.*;
     28 
     29 public class Frame extends JFrame {
     30 	
     31 	/* Booleana per determinare se disegnare il mazzo di carte o no (se
     32 	 * è l'ultima mano). */
     33 	public static boolean mazzo;
     34 	
     35 	public static Main main;
     36 	
     37 	/* Menu, bottoni, pannelli e componenti vari. */
     38 	public static Pannello pannello;
     39 	public static JPanel pannello2;
     40 	public static JButton button;
     41 	public static JMenuBar barraMenu;
     42 	public static JMenu file, puntoInterrogativo;
     43 	public static JMenuItem nuovaPartita, nuovaPartitaAiTrenta, opzioni, esci, informazioni, punti, cartePassate, aggiornamenti, trucchi, tastiRapidi, briscola;
     44 	
     45 	/* Immagini delle carte. */
     46 	public static ImageIcon retro1, retro2, ultimaCarta;
     47 	public static ImageIcon[] giocata = new ImageIcon[2];
     48 	public static ImageIcon[] carteInMano = new ImageIcon[3];
     49 	public static ImageIcon[] carteCPU = new ImageIcon[3];
     50 	public static ImageIcon[] arrayCarteMescolate = new ImageIcon[40];
     51 	public static ImageIcon[] arrayCartePassate = new ImageIcon[40];
     52 	public static ImageIcon[][] arrayCarte = new ImageIcon[10][4];
     53 	
     54 	public Frame() {
     55 		
     56 		super( "Tronto's JBriscola " + main.version );
     57 		
     58 		mazzo = true;
     59 		main = new Main();
     60 		pannello = new Pannello();
     61 		pannello2 = new JPanel( new FlowLayout() );
     62 		
     63 		button = new JButton( main.stringaBottonePrendi );
     64 		button.addActionListener( new ActionListener() {
     65 			
     66 			/* Quando viene premuto il bottone per prendere/lasciare le carte,
     67 			 * valuta innanzitutto se il giocatore ha giocato, poi a chi
     68 			 * darle ed eventualmente, se è finita la partita, a caricare
     69 			 * il suono adatto. */
     70 			public void actionPerformed( ActionEvent e ) {
     71 
     72 				arrayCartePassate[main.mano*2] = giocata[0];
     73 				arrayCartePassate[main.mano*2+1] = giocata[1];
     74 				
     75 				if ( giocata[0] != null && giocata[1] != null )
     76 					main.mano++;
     77 					
     78 				try {
     79 					main.chiPrende();
     80 				} catch ( Exception ex ) {
     81 					/* Avvisa di giocare una carta. */
     82 					JOptionPane.showMessageDialog( Frame.this, main.stringaPrimaGioca, "JBriscola " + main.version, JOptionPane.WARNING_MESSAGE );
     83 				}
     84 				
     85 				/* Avvisa che si è arrivati alla quartultima mano. */
     86 				if ( main.mano == 16 )
     87 					JOptionPane.showMessageDialog( Frame.this, main.stringaUltime4, "JBriscola " + main.version, JOptionPane.INFORMATION_MESSAGE );
     88 				
     89 				/* Non disegna più la briscola e il mazzo se sono già state
     90 				* pescate tutte le carte. */
     91 				if ( main.mano == 17 ) {
     92 					mazzo = false;
     93 					ultimaCarta = null;
     94 					pannello.repaint();
     95 					Frame.this.repaint();
     96 				}
     97 
     98 				/* Mostra il punteggio e carica i suoni se è finita la partita. */
     99 				if ( main.mano == 20 ||
    100 				   ( main.aiTrenta &&
    101 				 ( ( main.punteggio >= 30 || main.punteggioCPU >= 30 ) ) ) ) {
    102 				
    103 					String titolo = "";
    104 					String suonoFinale = "";
    105 				
    106 					if ( main.punteggio > main.punteggioCPU ) {
    107 						titolo = main.stringaVinto;
    108 						suonoFinale = "sounds/perso.wav";
    109 					}
    110 					if ( main.punteggio < main.punteggioCPU ) {
    111 						titolo = main.stringaPerso;
    112 						suonoFinale = "sounds/vinto.wav";
    113 					}
    114 					if ( main.punteggio == main.punteggioCPU ) {
    115 						titolo = main.stringaPareggio;
    116 						suonoFinale = "sounds/pareggio.wav";
    117 					}
    118 				
    119 					if ( main.sound ) {
    120 						try {
    121 							AudioFileFormat aff = AudioSystem.getAudioFileFormat( ClassLoader.getSystemResource( suonoFinale ) );
    122 							AudioInputStream ais = AudioSystem.getAudioInputStream( ClassLoader.getSystemResource( suonoFinale ) );
    123 							AudioFormat af = aff.getFormat();
    124 							DataLine.Info info = new DataLine.Info( Clip.class, ais.getFormat(), ( (int) ais.getFrameLength() * af.getFrameSize() ) );
    125 							Clip ol = ( Clip ) AudioSystem.getLine( info );
    126 							ol.open(ais);
    127 							ol.loop( 0 );
    128 						} catch ( Exception ex ) {
    129 						System.err.println( e );
    130 						}
    131 					}
    132 				
    133 					JOptionPane.showMessageDialog( Frame.this, main.stringaGiocatore + main.punteggio + main.stringaComputer + main.punteggioCPU, titolo, JOptionPane.INFORMATION_MESSAGE );
    134 					
    135 					main.pulisciTavolo();
    136 					
    137 				}
    138 				if ( main.toccaAllaCPU )
    139 					if ( main.aiTrenta )
    140 						main.giocaCPUAiTrenta();
    141 					else
    142 						main.giocaCPU();
    143 			}
    144 		} );
    145 		button.addKeyListener( new KeyAdapter() {
    146 			/* Aggiunge il keyListener per le scorciatoie da tastiera. Dato
    147 			 * che il bottone prendi/lascia è l'unico componente effettivo
    148 			 * della finestra, avrà obbligatoriamente il focus ed è necessario
    149 			 * che sia lui a gestire gli eventi della tastiera. */
    150 			public void keyReleased( KeyEvent key ) {
    151 
    152 				if ( main.keys ) {
    153 					switch ( key.getKeyCode() ) {
    154 						case KeyEvent.VK_1:
    155 							if ( mettiCarta( 231, 500 ) ) {
    156 								if ( !main.CPUHaGiocato )
    157 									if ( main.aiTrenta )
    158 										main.giocaCPUAiTrenta();
    159 									else
    160 										main.giocaCPU();
    161 							}
    162 							break;
    163 							
    164 						case KeyEvent.VK_2:
    165 							if ( mettiCarta( 301, 500 ) ) {
    166 								if ( !main.CPUHaGiocato )
    167 									if ( main.aiTrenta )
    168 										main.giocaCPUAiTrenta();
    169 									else
    170 										main.giocaCPU();
    171 							}
    172 							break;
    173 							
    174 						case KeyEvent.VK_3:
    175 							if ( mettiCarta( 371, 500 ) ) {
    176 								if ( !main.CPUHaGiocato )
    177 									if ( main.aiTrenta )
    178 										main.giocaCPUAiTrenta();
    179 									else
    180 										main.giocaCPU();
    181 							}
    182 							break;
    183 							
    184 						case KeyEvent.VK_F1:
    185 							JOptionPane.showMessageDialog( Frame.this, main.stringaTasti2, "JBriscola - " + main.version, JOptionPane.INFORMATION_MESSAGE );
    186 							break;
    187 							
    188 						case KeyEvent.VK_F2:
    189 							if ( main.mano == 20 ) {
    190 								main.aiTrenta = false;
    191 								main.mischia();
    192 								pannello.repaint();
    193 								repaint();
    194 							}
    195 							else {
    196 								int selezione = JOptionPane.showOptionDialog( Frame.this, main.stringaVuoiDavveroIniziare, "JBriscola " + main.version, JOptionPane.YES_NO_OPTION,  JOptionPane.QUESTION_MESSAGE, null, new String[] { main.stringaSi, main.stringaNo }, main.stringaNo );
    197 								if ( selezione == JOptionPane.YES_OPTION ) {
    198 									main.aiTrenta = false;
    199 									main.mischia();
    200 									pannello.repaint();
    201 									repaint();
    202 								}
    203 							}
    204 							break;
    205 							
    206 						case KeyEvent.VK_F3:
    207 							OptionFrame optionFrame = new OptionFrame();
    208 							optionFrame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
    209 							optionFrame.setResizable( false );
    210 							optionFrame.setAlwaysOnTop( true );
    211 							optionFrame.setSize( 300, 200 );
    212 							optionFrame.setLocation( (Toolkit.getDefaultToolkit().getScreenSize().width - 300) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - 150) / 2);
    213 							optionFrame.setVisible( true );
    214 							break;
    215 							
    216 						case KeyEvent.VK_F4:
    217 							JOptionPane.showMessageDialog( Frame.this, main.stringaGiocatore + main.punteggio + main.stringaComputer + main.punteggioCPU, main.stringaPunteggio, JOptionPane.INFORMATION_MESSAGE );
    218 							break;
    219 
    220 						case KeyEvent.VK_F5:
    221 							CartePassateFrame cartePassateFrame = new CartePassateFrame();
    222 							cartePassateFrame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
    223 							cartePassateFrame.setResizable( false );
    224 							cartePassateFrame.setAlwaysOnTop( true );
    225 							cartePassateFrame.setSize( 700, 560 );
    226 							cartePassateFrame.setLocation( (Toolkit.getDefaultToolkit().getScreenSize().width - 700) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - 560) / 2);
    227 							cartePassateFrame.setVisible( true );
    228 							break;
    229 							
    230 						case KeyEvent.VK_F6:
    231 							JOptionPane.showMessageDialog( Frame.this, main.stringaInformazioni2, main.stringaInformazioni, JOptionPane.PLAIN_MESSAGE );
    232 							break;
    233 							
    234 						case KeyEvent.VK_F7:
    235 							String latest = main.version;
    236 							try {
    237 								URL latestIs = new URL( "http://porkynator.altervista.org/jbriscola-latest.is" );
    238 								BufferedReader latestIsReader = new BufferedReader( new InputStreamReader( latestIs.openStream() ) );
    239 								latest = latestIsReader.readLine();
    240 							} catch ( Exception ex ) {
    241 								JOptionPane.showMessageDialog( Frame.this, main.stringaNoInternet, "JBriscola - " + main.version, JOptionPane.ERROR_MESSAGE );
    242 							}
    243 							if ( latest.equals( main.version ) )
    244 								JOptionPane.showMessageDialog( Frame.this, main.stringaAggiornamentiNo, "JBriscola - " + main.version, JOptionPane.INFORMATION_MESSAGE );
    245 							else
    246 								JOptionPane.showMessageDialog( Frame.this, main.stringaAggiornamentiSi + "\n" + main.version + " ==> " + latest + "\n\n" + main.stringaScarica, "JBriscola - " + main.version, JOptionPane.INFORMATION_MESSAGE );
    247 							break;
    248 							
    249 						case KeyEvent.VK_F8:
    250 							if ( main.mano == 20 ) {
    251 								main.aiTrenta = true;
    252 								main.mischia();
    253 								pannello.repaint();
    254 								repaint();
    255 							}
    256 							else {
    257 								int selezione = JOptionPane.showOptionDialog( Frame.this, main.stringaVuoiDavveroIniziare, "JBriscola " + main.version, JOptionPane.YES_NO_OPTION,  JOptionPane.QUESTION_MESSAGE, null, new String[] { main.stringaSi, main.stringaNo }, main.stringaNo );
    258 								if ( selezione == JOptionPane.YES_OPTION ) {
    259 									main.aiTrenta = true;
    260 									main.mischia();
    261 									pannello.repaint();
    262 									repaint();
    263 								}
    264 							}
    265 							break;
    266 							
    267 						case KeyEvent.VK_F9:
    268 							main.trucco( JOptionPane.showInputDialog( Frame.this, main.stringaInserisciCodice, "JBriscola - " + main.version, JOptionPane.PLAIN_MESSAGE ) );
    269 							break;
    270 							
    271 						case KeyEvent.VK_Q:
    272 							int selezione = JOptionPane.showOptionDialog( Frame.this, main.stringaVuoiDavveroUscire, "JBriscola  " + main.version, JOptionPane.YES_NO_OPTION,  JOptionPane.QUESTION_MESSAGE, null, new String[] { main.stringaSi, main.stringaNo }, main.stringaNo );
    273 							if ( selezione == JOptionPane.YES_OPTION )
    274 								Frame.this.dispose();
    275 							break;
    276 					}
    277 				}
    278 			}
    279 		} );
    280 		
    281 		barraMenu = new JMenuBar();
    282 		
    283 		file = new JMenu( "File" );
    284 		
    285 		nuovaPartita = new JMenuItem( main.stringaNuovaPartita );
    286 		nuovaPartita.addActionListener( new ActionListener() {
    287 			/* Avvia una nuova partita, chiedendo prima conferma se ce n'è
    288 			 * già una in corso. */
    289 			public void actionPerformed( ActionEvent e ) {
    290 				if ( main.mano == 20 ) {
    291 					main.aiTrenta = false;
    292 					main.mischia();
    293 					pannello.repaint();
    294 					repaint();
    295 				}
    296 				
    297 				else {
    298 					int selezione = JOptionPane.showOptionDialog( Frame.this, main.stringaVuoiDavveroIniziare, "JBriscola " + main.version, JOptionPane.YES_NO_OPTION,  JOptionPane.QUESTION_MESSAGE, null, new String[] { main.stringaSi, main.stringaNo }, main.stringaNo );
    299 					if ( selezione == JOptionPane.YES_OPTION ) {
    300 						main.aiTrenta = false;
    301 						main.mischia();
    302 						pannello.repaint();
    303 						repaint();
    304 					}
    305 				}
    306 			}
    307 		});
    308 		
    309 		nuovaPartitaAiTrenta = new JMenuItem( main.stringaNuovaPartitaAiTrenta );
    310 		nuovaPartitaAiTrenta.addActionListener( new ActionListener() {
    311 			/* Avvia una nuova partita ai 30, chiedendo prima conferma se
    312 			 * ce n'è già una in corso. */
    313 			public void actionPerformed( ActionEvent e ) {
    314 				if ( main.mano == 20 ) {
    315 					main.aiTrenta = true;
    316 					main.mischia();
    317 					pannello.repaint();
    318 					repaint();
    319 				}
    320 				
    321 				else {
    322 					int selezione = JOptionPane.showOptionDialog( Frame.this, main.stringaVuoiDavveroIniziare, "JBriscola " + main.version, JOptionPane.YES_NO_OPTION,  JOptionPane.QUESTION_MESSAGE, null, new String[] { main.stringaSi, main.stringaNo }, main.stringaNo );
    323 					if ( selezione == JOptionPane.YES_OPTION ) {
    324 						main.aiTrenta = true;
    325 						main.mischia();
    326 						pannello.repaint();
    327 						repaint();
    328 					}
    329 				}
    330 			}
    331 		});
    332 		
    333 		trucchi = new JMenuItem( main.stringaTrucchi );
    334 		trucchi.addActionListener( new ActionListener() {
    335 			public void actionPerformed( ActionEvent e ) {
    336 				/* Esegue il trucco */
    337 				main.trucco( JOptionPane.showInputDialog( Frame.this, main.stringaInserisciCodice, "JBriscola - " + main.version, JOptionPane.PLAIN_MESSAGE ) );
    338 			}
    339 		} );
    340 		
    341 		opzioni = new JMenuItem( main.stringaOpzioni );
    342 		opzioni.addActionListener( new ActionListener() {
    343 			/* Apre una OptionFrame per modificare le opzioni. */
    344 			public void actionPerformed( ActionEvent e ) {
    345 				
    346 				OptionFrame optionFrame = new OptionFrame();
    347 				optionFrame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
    348 				optionFrame.setResizable( false );
    349 				optionFrame.setAlwaysOnTop( true );
    350 				optionFrame.setSize( 300, 200 );
    351 				optionFrame.setLocation( (Toolkit.getDefaultToolkit().getScreenSize().width - 300) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - 150) / 2);
    352 				optionFrame.setVisible( true );
    353 			}
    354 		});
    355 		
    356 		esci = new JMenuItem( main.stringaEsci );
    357 		esci.addActionListener( new ActionListener() {
    358 			/* Ciede conferma prima di uscire. */
    359 			public void actionPerformed( ActionEvent e ) {
    360 				int selezione = JOptionPane.showOptionDialog( Frame.this, main.stringaVuoiDavveroUscire, "JBriscola  " + main.version, JOptionPane.YES_NO_OPTION,  JOptionPane.QUESTION_MESSAGE, null, new String[] { main.stringaSi, main.stringaNo }, main.stringaNo );
    361 				if ( selezione == JOptionPane.YES_OPTION )
    362 					Frame.this.dispose();
    363 			}
    364 		});
    365 		
    366 		file.add( nuovaPartita );
    367 		file.add( nuovaPartitaAiTrenta );
    368 		file.add( trucchi );
    369 		file.add( opzioni );
    370 		file.addSeparator();
    371 		file.add( esci );
    372 		
    373 		puntoInterrogativo = new JMenu( "?" );
    374 		
    375 		informazioni = new JMenuItem( main.stringaInformazioni );
    376 		informazioni.addActionListener( new ActionListener() {
    377 			/* Visualizza le informazioni. */
    378 			public void actionPerformed( ActionEvent e ) {
    379 				JOptionPane.showMessageDialog( Frame.this, main.stringaInformazioni2, main.stringaInformazioni, JOptionPane.PLAIN_MESSAGE );
    380 			}
    381 		} );
    382 		
    383 		tastiRapidi = new JMenuItem( main.stringaTasti );
    384 		tastiRapidi.addActionListener( new ActionListener() {
    385 			/* Visualizza i tasti rapidi. */
    386 			public void actionPerformed( ActionEvent e ) {
    387 				JOptionPane.showMessageDialog( Frame.this, main.stringaTasti2, "JBriscola - " + main.version, JOptionPane.INFORMATION_MESSAGE );
    388 			}
    389 		} );
    390 		
    391 		briscola = new JMenuItem( main.stringaBriscola );
    392 		briscola.addActionListener( new ActionListener() {
    393 			/* Visualizza il seme di briscola corrente. */
    394 			public void actionPerformed( ActionEvent e ) {
    395 				JOptionPane.showMessageDialog( Frame.this, main.stringaBriscola + ": " + main.semi[main.semeBriscola], "JBriscola - " + main.version, JOptionPane.INFORMATION_MESSAGE );
    396 			}
    397 		});
    398 		
    399 		punti = new JMenuItem( main.stringaPunteggio );
    400 		punti.addActionListener( new ActionListener() {
    401 			/* Visualizza il punteggio. */
    402 			public void actionPerformed( ActionEvent e ) {
    403 				JOptionPane.showMessageDialog( Frame.this, main.stringaGiocatore + main.punteggio + main.stringaComputer + main.punteggioCPU, main.stringaPunteggio, JOptionPane.INFORMATION_MESSAGE );
    404 			}
    405 		} );
    406 
    407 		cartePassate = new JMenuItem( main.stringaCartePassate );
    408 		cartePassate.addActionListener( new ActionListener() {
    409 			/*Visualizza le carte passate*/
    410 			public void actionPerformed( ActionEvent e ) {
    411 				CartePassateFrame cartePassateFrame = new CartePassateFrame();
    412 				cartePassateFrame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
    413 				cartePassateFrame.setResizable( false );
    414 				cartePassateFrame.setAlwaysOnTop( true );
    415 				cartePassateFrame.setSize( 700, 560 );
    416 				cartePassateFrame.setLocation( (Toolkit.getDefaultToolkit().getScreenSize().width - 700) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - 560) / 2);
    417 				cartePassateFrame.setVisible( true );
    418 			}
    419 		} );
    420 		
    421 		aggiornamenti = new JMenuItem( main.stringaAggiornamenti );
    422 		aggiornamenti.addActionListener( new ActionListener() {
    423 			/* Cerca aggiornamenti sul sito http://porkynator.altervista.org,
    424 			 * confrontando la versione del programma con quella scritta nel
    425 			 * file jbriscola-latest.is (online). */
    426 			public void actionPerformed( ActionEvent e ) {
    427 				String latest = main.version;
    428 				try {
    429 					URL latestIs = new URL( "http://porkynator.altervista.org/jbriscola-latest.is" );
    430 					BufferedReader latestIsReader = new BufferedReader( new InputStreamReader( latestIs.openStream() ) );
    431 					latest = latestIsReader.readLine();
    432 				} catch ( Exception ex ) {
    433 					JOptionPane.showMessageDialog( Frame.this, main.stringaNoInternet, "JBriscola - " + main.version, JOptionPane.ERROR_MESSAGE );
    434 				}
    435 				if ( latest.equals( main.version ) )
    436 					JOptionPane.showMessageDialog( Frame.this, main.stringaAggiornamentiNo, "JBriscola - " + main.version, JOptionPane.INFORMATION_MESSAGE );
    437 				else
    438 					JOptionPane.showMessageDialog( Frame.this, main.stringaAggiornamentiSi + "\n" + main.version + " ==> " + latest + "\n\n" + main.stringaScarica, "JBriscola - " + main.version, JOptionPane.INFORMATION_MESSAGE );
    439 			}
    440 		} );
    441 		
    442 		puntoInterrogativo.add( punti );
    443 		puntoInterrogativo.add( cartePassate );
    444 		puntoInterrogativo.add( briscola );
    445 		puntoInterrogativo.add( tastiRapidi );
    446 		puntoInterrogativo.add( informazioni );
    447 		puntoInterrogativo.add( aggiornamenti );
    448 		
    449 		barraMenu.add( file );
    450 		barraMenu.add( puntoInterrogativo );
    451 		
    452 		setJMenuBar( barraMenu );
    453 		
    454 		/* Inizializza le immagini del retro delle carte. */
    455 		retro1 = new ImageIcon( ClassLoader.getSystemResource( "img/retro1.jpg" ) );
    456 		retro2 = new ImageIcon( ClassLoader.getSystemResource( "img/retro2.jpg" ) );
    457 		
    458 		/* Inizializza tutte le immagini delle carte scorrendo l'array bidimensionale. */
    459 		for (int i = 0; i < 10; i++)
    460 			for (int j = 0; j < 4; j++)
    461 				arrayCarte[i][j] = new ImageIcon( ClassLoader.getSystemResource( "img/" + (i+1) + "-" + (j+1) + ".jpg" ) );
    462 		
    463 		/* Mischia le carte. */
    464 		main.mischia();
    465 		
    466 		/* Aggiunge i vari componenti. */
    467 		pannello2.add( button );
    468 		setLayout( new BorderLayout() );
    469 		add( pannello, BorderLayout.CENTER );
    470 		add( pannello2, BorderLayout.SOUTH );
    471 		
    472 		/* Chiama il metodo mettiCarta se l'utente clicca. */
    473 		addMouseListener(
    474 			new MouseAdapter() {
    475 				public void mouseClicked ( MouseEvent e ) {
    476 					if ( mettiCarta( e.getX(), e.getY() ) ) {
    477 						if ( !main.CPUHaGiocato )
    478 							if ( main.aiTrenta )
    479 								main.giocaCPUAiTrenta();
    480 							else
    481 								main.giocaCPU();
    482 					}
    483 				}
    484 			}
    485 		);
    486 		
    487 		/* Chiede conferma prima di uscire quando viene chiusa la finestra. */
    488 		addWindowListener(
    489 			new WindowAdapter() {
    490 				public void windowClosing( WindowEvent e ) {
    491 					int selezione = JOptionPane.showOptionDialog( Frame.this, main.stringaVuoiDavveroUscire, "JBriscola  " + main.version, JOptionPane.YES_NO_OPTION,  JOptionPane.QUESTION_MESSAGE, null, new String[] { main.stringaSi, main.stringaNo }, main.stringaNo );
    492 					if ( selezione == JOptionPane.YES_OPTION )
    493 						System.exit( 0 );
    494 				}
    495 			}
    496 		);
    497 	}
    498 	
    499 	/* Se il giocatore ha cliccato su una carta la gioca e riproduce un suono casuale. */
    500 	public boolean mettiCarta( int x, int y ) {
    501 		
    502 		if ( !main.toccaAllaCPU && giocata[0] == null ) {
    503 			if ( main.sound && 
    504 				( ( x > 230 && x < 290 && y > 340 && y < 566 && carteInMano[0] != null ) ||
    505 				  ( x > 300 && x < 360 && y > 340 && y < 566 && carteInMano[1] != null ) || 
    506 				  ( x > 370 && x < 430 && y > 340 && y < 566 && carteInMano[2] != null ) ) ) {
    507 				try {
    508 					
    509 					double a = Math.random() * 6;
    510 					int i = (int) a;
    511 					
    512 					AudioFileFormat aff = AudioSystem.getAudioFileFormat( ClassLoader.getSystemResource("sounds/" + i + ".wav") );
    513 					AudioInputStream ais = AudioSystem.getAudioInputStream( ClassLoader.getSystemResource("sounds/" + i + ".wav") );
    514 					AudioFormat af = aff.getFormat();
    515 					DataLine.Info info = new DataLine.Info( Clip.class, ais.getFormat(), ( (int) ais.getFrameLength() * af.getFrameSize() ) );
    516 					Clip ol = ( Clip ) AudioSystem.getLine( info );
    517 					
    518 					ol.open(ais);
    519 					ol.loop( 0 );
    520 					
    521 				} catch ( Exception e ) {
    522 					System.err.println( e );
    523 				}
    524 			}
    525 			
    526 			if ( x > 230 && x < 290 && y > 340 && y < 566 && carteInMano[0] != null ) {
    527 				giocata[0] = carteInMano[0];
    528 				carteInMano[0] = null;
    529 				pannello.repaint();
    530 				return true;
    531 			}
    532 			
    533 			if ( x > 300 && x < 360 && y > 340 && y < 566 && carteInMano[1] != null ) {
    534 				giocata[0] = carteInMano[1];
    535 				carteInMano[1] = null;
    536 				pannello.repaint();
    537 				return true;
    538 			}
    539 			
    540 			if ( x > 370 && x < 430 && y > 340 && y < 566 && carteInMano[2] != null ) {
    541 				giocata[0] = carteInMano[2];
    542 				carteInMano[2] = null;
    543 				pannello.repaint();
    544 				return true;
    545 			}
    546 		}
    547 		
    548 		return false;
    549 	}
    550 }
    551 
    552