Problema com jogo da memória

Bom, meu primeiro post aqui, e ai pessoal :slight_smile:

È o seguinte, eu tenho que fazer um jogo da memória, é um trabalho da faculdade, eu consegui fazer ele todo, o problema está na comparação de peças, não propriamente a comparação, ela esta funcionando, o problema é dar um tempo antes de desvirar as peças caso elas sejam diferentes.
Eu pesquisei na internet e achei um jeito que é usar o Thread.sleep(), ele até funciona, mas quando eu uso ele acho que ele para a thread principal também, qual seria a solução para esse meu pequeno problema? criar uma thread separada? ou existe alguma outra função pra fazer um pequeno delay(1seg)?

vlw ^^

Código do Programa

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;

class Memoria extends JFrame implements ActionListener {
    private JPanel pmenu,pbarra,frame;
    private JLabel acerto,erro;
    private JButton botoes[];
    private JMenuBar menu;
    private short aux,qntbotao;
    private int vet[],nacerto,nerro,contador=0,click;
    private String nomes[] =
	{"imagem/0.gif",
	"imagem/0.gif",
	"imagem/1.gif",
	"imagem/1.gif",
	"imagem/2.gif",
	"imagem/2.gif",
	"imagem/3.gif",
	"imagem/3.gif",
	"imagem/4.gif",
	"imagem/4.gif",
	"imagem/5.gif",
	"imagem/5.gif",
	"imagem/6.gif",
	"imagem/6.gif",
	"imagem/7.gif",
	"imagem/7.gif",
	"imagem/8.gif",
	"imagem/8.gif",
	"imagem/9.gif",
	"imagem/9.gif",
	"imagem/10.gif",
	"imagem/10.gif",
	"imagem/11.gif",
	"imagem/11.gif",
	"imagem/12.gif",
	"imagem/12.gif",
	"imagem/13.gif",
	"imagem/13.gif",
	"imagem/14.gif",
	"imagem/14.gif",};	


    private Icon icones[] = 
	{new ImageIcon(nomes[0]),
	new ImageIcon(nomes[1]),
	new ImageIcon(nomes[2]),
	new ImageIcon(nomes[3]),
	new ImageIcon(nomes[4]),
	new ImageIcon(nomes[5]),
	new ImageIcon(nomes[6]),
	new ImageIcon(nomes[7]),
	new ImageIcon(nomes[8]),
	new ImageIcon(nomes[9]),
	new ImageIcon(nomes[10]),
	new ImageIcon(nomes[11]),
	new ImageIcon(nomes[12]),
	new ImageIcon(nomes[13]),
	new ImageIcon(nomes[14]),
	new ImageIcon(nomes[15]),
	new ImageIcon(nomes[16]),
	new ImageIcon(nomes[17]),
	new ImageIcon(nomes[18]),
	new ImageIcon(nomes[19]),
	new ImageIcon(nomes[20]),
	new ImageIcon(nomes[21]),
	new ImageIcon(nomes[22]),
	new ImageIcon(nomes[23]),
	new ImageIcon(nomes[24]),
	new ImageIcon(nomes[25]),
	new ImageIcon(nomes[26]),
	new ImageIcon(nomes[27]),
	new ImageIcon(nomes[28]),
	new ImageIcon(nomes[29]),}, bola = new ImageIcon("imagem/bola.gif");
 
    Memoria() 
    {
	super("Jogo da Memória");
		JMenu fileMenu = new JMenu ("Arquivo");
        	JMenuItem newgameItem = new JMenuItem ("Novo Jogo");
        	fileMenu.add (newgameItem);
		fileMenu.addSeparator();
		JMenuItem rankItem = new JMenuItem ("Ranking");
        	fileMenu.add (rankItem);
		fileMenu.addSeparator();
       	 	JMenuItem exitItem = new JMenuItem ("Sair");
       	 	fileMenu.add (exitItem);

		JMenu difMenu = new JMenu ("Dificuldade");
        	JMenuItem diffacil = new JMenuItem ("Facil");
      		difMenu.add (diffacil);

  	      	JMenuItem difmedio = new JMenuItem ("Medio");     
    	    	difMenu.add (difmedio);

		JMenuItem difdificil = new JMenuItem ("Dificil");       
    	    	difMenu.add (difdificil);
	
        	JMenu helpMenu = new JMenu ("Ajuda");
        	JMenuItem aboutItem = new JMenuItem ("Sobre");
        	helpMenu.add (aboutItem);

		menu = new JMenuBar();
        	menu.add (fileMenu);
		menu.add (difMenu);
        	menu.add (helpMenu);

		diffacil.addActionListener(new ActionListener()   
                {   
                	public void actionPerformed(ActionEvent mouseClicked) 
			{      
				frame.setLayout(new GridLayout(3,4,25,25));
				frame.setBackground(Color.green);
				qntbotao = 12;	
				vet = new int[qntbotao];			
				aux = MontaTabela(aux,qntbotao);
			} 
                });

		difmedio.addActionListener(new ActionListener()   
                {   
                	public void actionPerformed(ActionEvent mouseClicked) 
			{   
				frame.setLayout(new GridLayout(4,5,25,25));
				frame.setBackground(Color.yellow);
				qntbotao = 20;	
				vet = new int[qntbotao];			
				aux = MontaTabela(aux,qntbotao);
			}   
                });

		difdificil.addActionListener(new ActionListener()   
                {   
                	public void actionPerformed(ActionEvent mouseClicked) 
			{   
				frame.setLayout(new GridLayout(5,6,25,25));
				frame.setBackground(Color.red);
				qntbotao = 30;	
				vet = new int[qntbotao];			
				aux = MontaTabela(aux,qntbotao);         								
			}   
                });

		aboutItem.addActionListener(new ActionListener()   
                {   
                	public void actionPerformed(ActionEvent mouseClicked) 
			{   
                       		JOptionPane.showMessageDialog(null, "Desenvolvidor por: \n\nDiego Bernardes");				
			}   
                });

		exitItem.addActionListener(new ActionListener()   
                {   
                	public void actionPerformed(ActionEvent mouseClicked) 
			{   
                       		System.exit(0);				
			}   
                });

		newgameItem.addActionListener(new ActionListener()   
                {   
                	public void actionPerformed(ActionEvent mouseClicked) 
			{   
                       		if(aux==12)
				{
					frame.setLayout(new GridLayout(3,4,25,25));
					frame.setBackground(Color.green);
					qntbotao = 12;	
					vet = new int[qntbotao];			
					aux = MontaTabela(aux,qntbotao);		
				}

				if(aux==20)
				{
					frame.setLayout(new GridLayout(4,5,25,25));
					frame.setBackground(Color.yellow);
					qntbotao = 20;		
					vet = new int[qntbotao];		
					aux = MontaTabela(aux,qntbotao);
				}	

				if(aux==30)
				{
					frame.setLayout(new GridLayout(5,6,25,25));
					frame.setBackground(Color.red);
					qntbotao = 30;	
					vet = new int[qntbotao];			
					aux = MontaTabela(aux,qntbotao); 
				}		
			}   
                });

	
	frame = new JPanel();
        frame.setBackground(Color.green);
	frame.setLayout(new GridLayout(3,4,25,25)); // 12 blocos

	acerto = new JLabel("Acertos: "+ nacerto);
	erro = new JLabel("Erros: "+ nerro);

	qntbotao = 12;
	vet = new int[qntbotao];				
	aux = MontaTabela(aux,qntbotao);

	pmenu = new JPanel();
	pmenu.add(menu);

	pbarra = new JPanel();
	pbarra.add(acerto);
	pbarra.add(erro);        

	Container c = getContentPane();
        c.add(menu,BorderLayout.NORTH);
        c.add(frame,BorderLayout.CENTER);
	c.add(pbarra,BorderLayout.SOUTH);
			
        setSize(800, 600);
        setVisible(true);
    }

    public short MontaTabela(short aux, short qntbotao)
    {	
	GeraVetor(vet);

	nacerto=0;
	nerro=0;
	acerto.setText("Acerto: "+nacerto);
	erro.setText("Erro: "+nerro);

	for(int i=0; i< aux ;i++)
	{
		frame.remove(botoes[i]);
 	}

	botoes = new JButton[qntbotao];

    	for(int i=0;i< qntbotao ;i++)
	{	
		botoes[i] = new JButton("");
		botoes[i].addActionListener(this);
		botoes[i].setIcon(bola);
        }

	for(int i=0;i< qntbotao ;i++)
	{	
		frame.add(botoes[vet[i]]);
        }

	aux = qntbotao;
	frame.validate();

	return aux;
    }

    public static void GeraVetor(int[] a)
    {
	for (int i = 0; i < a.length ; i++) 
	{
		a[i]=i;
	}

    	Random ran = new Random();
    
    	for(int i = 0; i < a.length; i++)
	{
     		int pos = ran.nextInt(a.length);
      		int temp = a[i];
      		a[i] = a[pos];
      		a[pos] = temp;
	}
    }
    
    public void actionPerformed(ActionEvent e) 
    {
	for(int i=0; i<botoes.length; i++)
	{
		if(e.getSource() == botoes[i])
		{
			contador++;
			botoes[i].setEnabled(false);
			botoes[i].setIcon(icones[vet[i]]);
			if (contador==2)
			{
				if (nomes[vet[click]]==nomes[vet[i]])
				{
					botoes[click].setEnabled(false);
					botoes[i].setEnabled(false);
					botoes[click].setIcon(icones[vet[i]]);
					contador=0;
					nacerto++;
					acerto.setText("Acertos: "+nacerto);
					if(nacerto==6)
						JOptionPane.showMessageDialog(null, "Fim de Jogo");
					
				}
				else
				{
					//JOptionPane.showMessageDialog(null, "Antes do delay");
					try
					{
						Thread.sleep(750);
					}
					catch(InterruptedException ex)
					{
						JOptionPane.showMessageDialog(null, "Erro no delay");
					}
					
					botoes[i].setEnabled(true);
					botoes[click].setEnabled(true);
					botoes[i].setIcon(bola);
					botoes[click].setIcon(bola);
					contador=0;
					nerro++;
					erro.setText("Erros: "+nerro);
				}
			}
			click=i;
		}
	}			
    }

    public static void main(String args[])
    {
       Memoria app = new Memoria(); 
       app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

TimeUnit.SECONDS.sleep(1000);

Mesmo problema, o programa realmente fica no delay, porem, eu não consigo desvirar as peças durante esse delay, dai quando o delay acaba elas desviram muito rápido para a pessoa ver qual era a peça.

To precisando de alguma outra solução >.<

Acredito que o que você está precisando é um Timer
utilize o javax.swing.Timer assim:

int delay = 1000; //milisegundos
  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          // a ação
      }
  };
Timer timer = new Timer(delay, taskPerformer);
timer.setRepeats(false);
timer.start();

Acredito que isso não pare a execução da thread principal
[]s

Resolvou perfeitamente o meu problema, muito obrigado heitor!

dentro do else eu coloquei a chamada pra um método e passei os indices como parametro

 public void DesviraPeca(final int i, final int click)
   {
	int delay = 750;
  	ActionListener taskPerformer = new ActionListener() 
	{
       		public void actionPerformed(ActionEvent evt) 
		{
	           	botoes[i].setEnabled(true);
			botoes[click].setEnabled(true);
			botoes[i].setIcon(bola);
			botoes[click].setIcon(bola);
       		}
   	};

	Timer timer = new Timer(delay, taskPerformer);
	timer.setRepeats(false);
 	timer.start();			
   }

vlw ai galera :slight_smile: