Algumas Duvidas em um jogo da memoria

8 respostas
cbarros
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 :( 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:
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){
		}
	}
}

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! ^^

8 Respostas

M

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.

M

Olhe o que seu método faz:

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

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.

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?

M

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?

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

cbarros

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…

cbarros

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?

M

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

cbarros
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..
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;
	}
Criado 17 de dezembro de 2009
Ultima resposta 17 de dez. de 2009
Respostas 8
Participantes 2