Algumas Duvidas em um jogo da memoria

Eu estou fazendo um jogo da memoria para um trabalho da faculdade e estou com alguns problemas que não consigo resolver… Ja pesquisei bastante mas não achei uma solução ainda…
Primeiro eu to tentando colocar imagens nos botoes(nas cartas e em outros botoes) e não to conseguindo. Eu to fazendo assim:

public class TelaPrincipal extends JFrame implements ActionListener, ItemListener { ... ImageIcon imgnovo = new ImageIcon("new.gif"); JButton bnovo = new JButton(new ImageIcon("imgnovo")); ... public TelaPrincipal(){ ... bnovo.setBounds(bnovo.getX(), bnovo.getY(), 300,300); ...

o problema é que a imagem não aparece, fica como se o botão estivesse vazio :frowning: eu jah tentei mudar o local da imagem e fazer mts outras coisas mas naum sei o que estah errado

outro problema é quando se está jogando e clica na segunda peça para mostrar a imagem, ela vira antes de mostra a segunda imagem e sempre que se clica em um par diferente ele zera todas as imagens anteriores… Eu sei que esse problema eh com o metodo que eu criei para zerar as imagens, mas não sei como fazer pra ele esperar um pouco antes de desvirar as cartas erradas e como fazer pra ele reconhecer somente on dois ultimos clikes e desvirar soh eles. Vo postar o meu código inteiro aqui:

[code]import java.awt.;
import java.awt.event.
;
import java.util.Random;
import javax.swing.*;

public class TelaPrincipal extends JFrame implements ActionListener, ItemListener {
JPanel panel = new JPanel();
JPanel jogo = new JPanel();

ImageIcon imgnovo = new ImageIcon("new.gif");
//ImageIcon im1 = new ImageIcon(getClass().getResource("imagem1.gif"));

int temp1 = 0;
int temp2 = 0;
int acertos = 0;

JMenuBar mb = new JMenuBar();
JMenu novo = new JMenu("Novo");
JMenu otrs = new JMenu("Outros");
JMenuItem mi1 = new JMenuItem("Ver Ranking");
JMenuItem mi2 = new JMenuItem("Sobre");
JMenuItem mi3 = new JMenuItem("Instruções");
JToolBar tool = new JToolBar(JToolBar.VERTICAL);
JButton bnovo = new JButton(new ImageIcon("imgnovo"));//new ImageIcon(""));
JButton bsair = new JButton("sair");//new ImageIcon(""));
JButton botao3 = new JButton();

//contador de tentativas

int tentativas = 0;
JLabel tent = new JLabel("número de tentativas: " + tentativas);

//botoes para o jogo

JButton [] b = new JButton[16];
int [] posicoes = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

//contador de clicks
int contclk = 0;



public TelaPrincipal(){
	super("Jogo da Memoria");
	
	for(int i=0 ; i<16 ; i++){
		b[i] = new JButton();
		b[i].addActionListener(this);
	}
	
	add(panel);
	panel.setLayout(new BorderLayout());
	panel.setBackground(Color.white);
	panel.setPreferredSize(new Dimension(670,470));
	
	panel.add(mb, BorderLayout.NORTH);
	mb.add(novo);
	mb.add(otrs);
	otrs.add(mi1);
	otrs.add(mi2);
	otrs.add(mi3);
	
	panel.add(tent, BorderLayout.AFTER_LAST_LINE);
	
	panel.add(tool, BorderLayout.WEST);
	tool.add(bnovo);
	tool.add(bsair);

	tool.setBounds(tool.getX(), tool.getY(), 500,500);
	bnovo.setBounds(bnovo.getX(), bnovo.getY(), 300,300);
	
	panel.add(jogo, BorderLayout.CENTER);
	jogo.setLayout(new GridLayout(4,4));
	adicionar(posicoes, b);
	
	
	
	
	bsair.addActionListener(this);
	bnovo.addActionListener(this);
	
	mi1.addItemListener(this);
	mi2.addItemListener(this);
	mi3.addItemListener(this);
	novo.addItemListener(this);
	
	setLayout(new FlowLayout());
	this.setSize(700,520);
	this.setVisible(true);
	
	
}

public static void main(String[] args){
	TelaPrincipal janela = new TelaPrincipal();
    
    janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    janela.setLocationRelativeTo(null);

}

@Override
public void actionPerformed(ActionEvent e) {
	
	if(e.getSource()==b[0]){
	b[0].setBackground(Color.GREEN);
	contclk++;
	temp1 = 1;
	}
	else if(e.getSource()==b[1]){
	b[1].setBackground(Color.GREEN);
	contclk++;
	temp2 = 1;
	}
	else if(e.getSource()==b[2]){
	b[2].setBackground(Color.BLUE);
	contclk++;
	temp1 = 2;
	}
	else if(e.getSource()==b[3]){
	b[3].setBackground(Color.BLUE);
	contclk++;
	temp2 = 2;
	}
	else if(e.getSource()==b[4]){
	b[4].setBackground(Color.RED);
	contclk++;
	temp1 = 3;
	}
	else if(e.getSource()==b[5]){
	b[5].setBackground(Color.RED);
	contclk++;
	temp2 = 3;
	}
	else if(e.getSource()==b[6]){
	b[6].setBackground(Color.CYAN);
	contclk++;
	temp1 = 4;
	}
	else if(e.getSource()==b[7]){
	b[7].setBackground(Color.CYAN);
	contclk++;
	temp2 = 4;
	}
	else if(e.getSource()==b[8]){
	b[8].setBackground(Color.YELLOW);
	contclk++;
	temp1 = 5;
	}
	else if(e.getSource()==b[9]){
	b[9].setBackground(Color.YELLOW);
	contclk++;
	temp2 = 5;
	}
	else if(e.getSource()==b[10]){
	b[10].setBackground(Color.MAGENTA);
	contclk++;
	temp1 = 6;
	}
	else if(e.getSource()==b[11]){
	b[11].setBackground(Color.MAGENTA);
	contclk++;
	temp2 = 6;
	}
	else if(e.getSource()==b[12]){
	b[12].setBackground(Color.PINK);
	contclk++;
	temp1 = 7;
	}
	else if(e.getSource()==b[13]){
	b[13].setBackground(Color.PINK);
	contclk++;
	temp2 = 7;
	}
	else if(e.getSource()==b[14]){
	b[14].setBackground(Color.BLACK);
	contclk++;
	temp1 = 8;
	}
	else if(e.getSource()==b[15]){
	b[15].setBackground(Color.BLACK);
	contclk++;
	temp2 = 8;
	}
	else if(e.getSource()==bsair){
		System.exit(0);
	}
	else if(e.getSource()==bnovo){
		zerarImagens();
		tentativas=0;
		contclk=0;
		acertos=0;
		embaralhar(posicoes);
		adicionar(posicoes, b);
		tent.setText("número de tentativas: " + tentativas);
		/*for(int i = 0; i<16; i++){
			System.out.println(posicoes[i]);
		}
		*/
	}
	
	if(contclk == 2){
		//ThreadA a = new ThreadA();
		//a.start();
		tentativas++;
		tent.setText("número de tentativas: " + tentativas);
		System.out.println("contador em 2");
		System.out.println("tentativas: " + tentativas);
		contclk = 0;
		comparar(temp1, temp2);
	}

}

public void zerarImagens(){
	for(int i=0 ; i<16 ; i++){
		b[i].setBackground(null);
	}
	
}

@Override
public void itemStateChanged(ItemEvent e) {
	if(e.getSource()==mi1){
		//abrir janela de ranking
		System.out.println("ranking clicado");
	}
	else if(e.getSource()==mi2){
		System.out.println("dificuldade clicada");
	}
	else if(e.getSource()==mi3){
		//abrir jalena com instruções
		System.out.println("instruções clicada");
	}
	else if(e.getSource()==novo){
		zerarImagens();
		tentativas = 0;
		contclk = 0;
		acertos = 0;
		embaralhar(posicoes);
		tent.setText("número de tentativas: " + tentativas);
		adicionar(posicoes, b);
	}
	
}

public void embaralhar(int array[]) {
		Random ran = new Random();
		for(int i = 0; i < array.length; i++) {
		   int from = ran.nextInt(array.length);
		   int to = ran.nextInt(array.length);
		   int tmp = array[from];
		   array[from] = array[to];
		   array[to] = tmp;
		}
	
}
public void adicionar(int arraya[], JButton arrayb[]){
	for(int i=0; i<arraya.length; i++){
		int x = arraya[i];
		jogo.add(arrayb[x]);
	}
}
public void comparar(int a,int b){
	if(a != b){
		zerarImagens();
	}else{
		acertos++;
		if(acertos == 8){
			JOptionPane.showMessageDialog(null, "Parabén, Voce Ganhou! \n Aperte 'novo' para começar novamente ou 'sair' para fechar o jogo");
		}
		}
}

}
class ThreadA extends Thread {
public void run(){
try{
sleep(2000);
}catch(InterruptedException ie){
}
}
}[/code]

Essa Thread no final foi uma tentativa minha de pausar… mas naum consegui fazer funcionar e ele ainda tah com corres nas peças e naum figuras… mas tah ai
agradeço toda e qualquer ajuda!!
Muito Obrigada! ^^

Perceba sua primeira dúvida:

ImageIcon imgnovo = new ImageIcon("new.gif"); JButton bnovo = new JButton(new ImageIcon("imgnovo"));

Você cria uma instância de ImageIcon corretamente na primeira linha. Porém você não está usando ela na segunda, e sim criando uma nova instância que aponta para um arquivo chamado imgnovo. O que você teria que fazer era:

ImageIcon imgnovo = new ImageIcon("new.gif"); JButton bnovo = new JButton(imgnovo);

Dessa forma seu JButton recebe a referência que possui a imagem que você quer.

Olhe o que seu método faz:

[code]public void zerarImagens(){
for(int i=0 ; i<16 ; i++){
b[i].setBackground(null);
}

}[/code]

Ele percorre todos os botões e atribui a cada um o valor null de background. Porém seu objetivo é limpar apenas dois. Para isso você pode utilizar dois parâmetros facilitando seu trabalho:

public void zerarImagens(int b1, int b2) b[b1].setBackground(null); b[b2].setBackground(null); }

E sua Thread ao final do programa não faz nada, a não ser ficar suspensa por 2 segundos.

Ahh… sim… intendi…
eu mudei isso aqui sim agora, mas a aimagem continua não aparecendo…

uma dúvida meio besta, mas que pode resolver… onde exatamente tem que estar a imagem que eu quero usar?

[quote=cbarros]Ahh… sim… intendi…
eu mudei isso aqui sim agora, mas a aimagem continua não aparecendo…

uma dúvida meio besta, mas que pode resolver… onde exatamente tem que estar a imagem que eu quero usar?[/quote]

Do jeito que você declarou ele estará na pasta principal do projeto. É aquela pasta que contém a pasta src.

Funcionooo!

Obrigada pela ajuda!! mas no final eu descobri um erro bem bobo msm…
eu achava que a imagem era .gif mas era .jpg!!

que vergonha… :oops:

tenho q tentar arrumar o resto agora…

mas uma coisa…
será que alguem pode me ajudar a resolver o problema dos botoes tb??
como eu reconheço onde foram os dois últimos clicks e zero soh eles?

Um jeito de simples de fazer:

crie uma variável qualquer(vou chamar de botao1) do tipo int e atribua -1 à ela.
quando o jogador clicar em um botão você verifica se a variável botao1 possui o valor -1.
se for, você armazena o indice do botão nela.
se não for -1 você chama seu método zerarImagens, passando como parâmetro o indíce do botão atual e o indíce guardado na variável. Após fazer isso atribuia novamente -1 à variável botao1

eu tentei fazer como vc falou, criando mais uma variavel, mas acho q tem alguma coisa errada ainda…
eu olhei e acho q a lógica tah certa, mas não tah funcionando como eu esperava…

[code]public void actionPerformed(ActionEvent e) {

	if(e.getSource()==b[0]){
	b[0].setIcon(imgb1);
	contclk++;
	temp1 = 1;
		if(controle == -1){
			controle = 0;
		}else{
			int b = 0;
			comparar(temp1, temp2, b);
		}
	}
	else if(e.getSource()==b[1]){
	b[1].setIcon(imgb1);
	contclk++;
	temp2 = 1;
	if(controle == -1){
		controle = 0;
	}else{
		int b = 1;
		comparar(temp1, temp2, b);
	}
	}
	else if(e.getSource()==b[2]){
	b[2].setIcon(imgb2);
	contclk++;
	temp1 = 2;
	if(controle == -1){
		controle = 0;
	}else{
		int b = 2;
		comparar(temp1, temp2, b);
	}
	}
	else if(e.getSource()==b[3]){
	b[3].setIcon(imgb2);
	contclk++;
	temp2 = 2;
	if(controle == -1){
		controle = 0;
	}else{
		int b = 3;
		comparar(temp1, temp2, b);
	}
	}

public void zerarImagens(int a1 ,int a2){
	b[a1].setIcon(null);
	b[a2].setIcon(null);
	
}
public void zerarTudo(){
	for(int i=0 ; i<16 ; i++){
		b[i].setIcon(null);
	}
}


public void comparar(int a,int b, int c){
if(a != b){
zerarImagens(controle, c);

	}else{
		acertos++;
		if(acertos == 8){
			JOptionPane.showMessageDialog(null, "Parabén, Voce Ganhou! \n Aperte 'novo' para começar novamente ou 'sair' para fechar o jogo");
		}
		}
	controle = -1;
}
[/code]