Ciao ragazzi.
Premetto che sono alle mie prime armi con java. Il prof mi ha detto di separare la grafica dal codice. Il gioco è stile Memory. Qualcuno sa darmi una mano? Grazie in anticipo


codice:
 
package soup;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.util.Random;

@SuppressWarnings("serial")
public class Partita extends JPanel{
	private Tessera[] ts;	//Contiene le tessere visualizzate
	private ImageIcon[] v;	//contiene le immagini da associare alle tessere
	private int[]cont;		//Tiene conto del numero di assegnazioni di un'immagine
	private Tessera[]confronto=new Tessera[2];	//contiene le tessere selezionate
	private GridLayout gl;
	private ScorePanel s;	//Pannello con le informazioni di gioco
	private Suono ok;		
	private Suono end;
	private JDialog avviso;
	private JDialog avviso2;
	private int numCoppie;	//Numero di coppie visualizzate
	private int sel=0;		//Numero di tessere selezionate
	private int punteggio;
	private int tentativi;
	private int finePartita;	//Coppie trovate
	private Timer pausa;	//Timer per aiuto "svela tessere per 2 secondi"
	
	
	/**
	 * @param tes
	 * Numero totale di tessere da visualizzare
	 * @param imgs
	 * Numero di immagini da utilizzare
	 * @param righe
	 * Numero di righe dell'area di gioco
	 * @param col
	 * Numero di colonne dell'area di gioco
	 */
	
	public Partita(int tes,int imgs,int righe,int col){
		this.s=new ScorePanel();
		this.ts=new Tessera[tes];
		this.v=new ImageIcon[10];
		this.cont=new int[10];
		this.confronto=new Tessera[2];
		this.numCoppie=(tes/2);
		this.gl=new GridLayout(righe,col);
		
		setBackground(new Color(45,105,238));
		setLayout(gl);
		gl.setVgap(37);
		gl.setHgap(20);
		
		this.ok=new Suono("Data/Cashreg.wav");
		this.end=new Suono("Data/Applause.wav");
		
		this.punteggio=0;
		this.tentativi=0;
		this.finePartita=0;
		
		v[0]=new ImageIcon("prof/.....jpg");
		v[1]=new ImageIcon("prof/.....jpg");
		v[2]=new ImageIcon("prof/.....jpg");
		v[3]=new ImageIcon("prof/.....jpg");
		v[4]=new ImageIcon("prof/.....jpg");
		v[5]=new ImageIcon("prof/.....jpg");
		v[6]=new ImageIcon("prof/.....jpg");
		v[7]=new ImageIcon("prof/.....jpg");
		v[8]=new ImageIcon("prof/.....jpg");
		v[9]=new ImageIcon("prof/.....jpg");
		
		Random r=new Random();	//Generatore di numeri casuali
		
		for(int i=0;i<cont.length;i++)
			cont[i]=0;
		int conteggio=0;	//Numero di ripetizioni della stessa immagine
		if(imgs==4)		//Se la difficoltà è facile
			conteggio=4;
		else			//Difficoltà intermedia o difficile DA AGGIUSTARE
			conteggio=2;
		
	c:	for(int i=0;i<ts.length;i++){
			int x=r.nextInt(imgs);	//Sceglie casualmente un'immagine
			
			if(cont[x]<conteggio){
				ts[i]=new Tessera(v[x],x,i);
				cont[x]++;
			}
			if(ts[i]==null){	//Se non è stata associata un'immagine alla tessera
				i--;
				continue c;
			}
			final int a=i;
			ts[i].getTB().addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					ts[a].getTB().setEnabled(false);
					
					if(!s.isRunning())	//La selezione della prima 
						s.startTimer();	//tessera fa partire il Timer
					
					if(sel==0){	//Se non ci sono tessere selezionate
						confronto[sel++]=ts[a];
					}
					else{	//E' già attiva un'altra tessera 
						confronto[sel]=ts[a];	//quindi si esegue il confronto
						if(confronto[0].getEQ()==confronto[1].getEQ()){
							//Le Tessere sono uguali
							confronto[0].getTB().setEnabled(false);
							confronto[1].getTB().setEnabled(false);
							confronto[0].getTB().setVisible(false);
							confronto[1].getTB().setVisible(false);
							tentativi++;
							punteggio+=10;
							sel=0;
							finePartita++;
							ok.play();
							s.aggiornaPunti(punteggio,tentativi);
						}
						else{
							//Tessere diverse
							confronto[0].getTB().setEnabled(true);
							confronto[1].getTB().setEnabled(true);
							confronto[0].getTB().setSelected(false);
							confronto[1].getTB().setSelected(false);
							tentativi++;
							punteggio-=2;
							sel=0;
							s.aggiornaPunti(punteggio,tentativi);
						}
					}
					if(finePartita==numCoppie){
						//Tutte le coppie sono state trovate
						terminaPartita();
					}
				}
			});
		}
		
		for(int i=0;i<ts.length;i++){	//Aggiunge le tessere al JPanel
			add(ts[i].getTB());
			ts[i].getTB().setEnabled(false);
		}
		
		ActionListener a1=new ActionListener(){	//Aiuto 1
			public void actionPerformed(ActionEvent e) {
				if(!s.isRunning())
					s.startTimer();
				svelaTessere();
			}
		};
		ActionListener a2=new ActionListener(){	//Aiuto 2
			public void actionPerformed(ActionEvent e) {
				if(!s.isRunning())
					s.startTimer();
				trovaCoppia();
			}
		};
		ActionListener a3=new ActionListener(){	//Aiuto 3
			public void actionPerformed(ActionEvent e) {
				if(!s.isRunning())
					s.startTimer();
				trovaCorrispondente();
			}
		};
		
		//Aggiunge gli actionListener agli aiuti nello ScorePanel
		s.addListeners(a1, a2, a3);	
	}//Costruttore
	
	public void terminaPartita(){
		end.play();
		s.stopTimer();
		int [] time=s.getTime();
		FinePartita fp=new FinePartita(punteggio,time[0],time[1]);
		fp.setVisible(true);
		s.disattivaAiuti();
		//oracle
	}
	
	public ScorePanel getScorePanel(){
		return this.s;
	}
	public void attivaTessere(){
		for(int i=0;i<ts.length;i++)
			ts[i].getTB().setEnabled(true);
	}
	public void setNomeGiocatore(String n){
		s.setNomeGiocatore(n);
	}
	
	public void svelaTessere(){
		if(sel==1){	
			//se c'è una tessera già selezionata non è possibile usare questo aiuto
			avviso2=new JDialog();
			avviso2.setLayout(null);
			avviso2.setResizable(false);
			avviso2.setModal(true);
			avviso2.setTitle("Avviso !");
			avviso2.setBounds(300,300,210,130);
			JLabel msg=new JLabel("C'è una tessera selezionata !");
			msg.setBounds(20,10,200,20);
			msg.setFont(new Font("Calibri",1,14));
			JButton ok=new JButton("OK");
			
			ok.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					avviso2.setVisible(false);
				}
			});
			ok.setBounds(50,50,100,30);
			avviso2.add(msg);
			avviso2.add(ok);
			avviso2.setVisible(true);
		}
		else{
			s.setEnabledAiuto1(false);
			punteggio-=3;
			s.aggiornaPunti(punteggio, tentativi);
			
			this.pausa=new Timer(2000,new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					for(int i=0;i<ts.length;i++){
						ts[i].getTB().setEnabled(true);
						ts[i].getTB().setSelected(false);
					}
					pausa.stop();
				}
			});
			for(int i=0;i<ts.length;i++){
				ts[i].getTB().setEnabled(false);
				ts[i].getTB().setSelected(true);
			}
			pausa.start();
		}
	}
	public void trovaCoppia(){
		boolean trovato=false;
		s.setEnabledAiuto2(false);
		
		for(int i=0;i<ts.length;i++){
			for(int j=0;j<ts.length;j++){
				if(ts[i].getTB().isVisible()&&ts[j].getTB().isVisible()&&ts[i].getEQ()==ts[j].getEQ()&&i!=j){
					trovato=true;
					ts[i].getTB().setEnabled(false);
					ts[j].getTB().setEnabled(false);
					ts[i].getTB().setVisible(false);
					ts[j].getTB().setVisible(false);
					tentativi++;
					punteggio+=5;
					finePartita++;
					ok.play();
					s.aggiornaPunti(punteggio,tentativi);
				}
				if(trovato)break;
			}
			if(trovato)break;
		}
		if(finePartita==numCoppie){
			terminaPartita();
		}
	}
	public void trovaCorrispondente(){
		if(sel==0){ 
			//Non è possibile usare questo aiuto senza una tessera già selezionata 
			this.avviso=new JDialog();
			avviso.setLayout(null);
			avviso.setResizable(false);
			avviso.setModal(true);
			avviso.setTitle("Avviso !");
			avviso.setBounds(300,300,210,130);
			JLabel msg=new JLabel("Selezionare prima una tessera !");
			msg.setBounds(10,10,200,30);
			msg.setFont(new Font("Calibri",1,14));
			JButton ok=new JButton("OK");
			ok.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					avviso.setVisible(false);
				}
			});
			ok.setBounds(50,50,100,30);
			avviso.add(msg);
			avviso.add(ok);
			avviso.setVisible(true);
		}
		else{
			s.setEnabledAiuto3(false);
			
			for(int i=0;i<ts.length;i++){
				if(ts[i].getTB().isVisible()&&confronto[0].getEQ()==ts[i].getEQ()&&ts[i].getID()!=confronto[0].getID()){
					confronto[1]=ts[i];
					confronto[0].getTB().setEnabled(false);
					confronto[1].getTB().setEnabled(false);
					confronto[0].getTB().setVisible(false);
					confronto[1].getTB().setVisible(false);
					tentativi++;
					punteggio+=5;
					finePartita++;
					sel=0;
					ok.play();
					s.aggiornaPunti(punteggio,tentativi);
					
					break;
				}
			}
			if(finePartita==numCoppie){
				terminaPartita();
			}
		}
	}
}

class Tessera{
	private JToggleButton tb;	//Rappresenta graficamente la tessera
	private ImageIcon def;		//Immagine di default della tessera non selezionata
	private int eq;				//Le tessere con la stessa immagine hanno eq uguale
	private int id;				//Identifica univocamente una tessera
	
	public Tessera(ImageIcon selected,int a,int id){
		this.def=new ImageIcon("Data/QmBlu.jpg");
		this.tb=new JToggleButton(def,false);
		this.tb.setSelectedIcon(selected);
		this.tb.setDisabledSelectedIcon(selected);
		this.tb.setSize(100,100);
		this.eq=a;
		this.id=id;
	}
	
	public JToggleButton getTB(){
		return this.tb;
	}
	public int getEQ(){
		return this.eq;
	}
	public int getID(){
		return this.id;
	}
}