View Full Version : [Java] Jogo da Memoria


Sky_Boy_
16-05-2008, 12:43
Boas pessoal....o prof de java sugeriu que elaborassemos o jogo da memoria como trabalho para a disciplina...mediante o codigo apresentado alguem me pode dar umas dicas pa melhorar isto?

Friso que ainda n esta a funcionar :o


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.Arrays;
import java.util.Collections;
import javax.swing.Timer;



public class teste extends JFrame implements ActionListener {

JButton restart;
JButton quit;
JLabel score, blank;
JTextField userScore;
MyButton button[] = new MyButton [16] ;
int s = 0;
int index,a,b,current;
int counter = 0;
ImageIcon img;
ImageIcon cardBack = new ImageIcon("cardback.jpg");
Timer t;


public static void main(String[] args) {
teste memoryGame = new teste();
}

public teste() {
super();

button[0] = new MyButton (new ImageIcon("car1.gif"), 0);
button[1] = new MyButton (new ImageIcon("car2.gif"), 1);
button[2] = new MyButton (new ImageIcon("car3.gif"), 2);
button[3] = new MyButton (new ImageIcon("car4.gif"), 3);
button[4] = new MyButton (new ImageIcon("car5.jpg"), 4);
button[5] = new MyButton (new ImageIcon("car6.bmp"), 5);
button[6] = new MyButton (new ImageIcon("car7.bmp"), 6);
button[7] = new MyButton (new ImageIcon("car8.jpg"), 7);
button[8] = new MyButton (new ImageIcon("car1.gif"), 0);
button[9] = new MyButton (new ImageIcon("car2.gif"), 1);
button[10] = new MyButton (new ImageIcon("car3.gif"), 2);
button[11] = new MyButton (new ImageIcon("car4.gif"), 3);
button[12] = new MyButton (new ImageIcon("car5.jpg"), 4);
button[13] = new MyButton (new ImageIcon("car6.bmp"), 5);
button[14] = new MyButton (new ImageIcon("car7.bmp"), 6);
button[15] = new MyButton (new ImageIcon("car8.jpg"), 7);


setTitle("Memory Game");
setSize(600,600);
getContentPane().setLayout(new BorderLayout());
this.setBackground(Color.GRAY);

/*for(int s = 0; s < 25; s++){
button = shuffleResultImages(button);
s++;
}*/

JPanel mainGrid = new JPanel (new GridLayout (4,4));

for(int i =0; i<button.length;i++){

button[i].addActionListener(this);
mainGrid.add(button[i]);
}

add(mainGrid, BorderLayout.CENTER);

JPanel userOptions = new JPanel (new GridLayout (8,2));

userOptions.add(score = new JLabel("Your Score (Matches):"));

userOptions.add(userScore = new JTextField(""));
userScore.addActionListener(this);

userOptions.add(blank = new JLabel(" "));
userOptions.add(blank = new JLabel(" "));
userOptions.add(blank = new JLabel(" "));



userOptions.add(restart = new JButton("Restart Game"));
restart.addActionListener(this);

userOptions.add(quit = new JButton("Quit"));
quit.addActionListener(this);

add(userOptions, BorderLayout.EAST);


setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setVisible(true);

}


public void actionPerformed(ActionEvent e) {

for(int j = 0 ; j<button.length; j++){
if (e.getSource() == button[j] && counter == 0){
a = button[j].getIndex();
current = j;
button[j].setFaceUp(true);
repaint();
counter++;
break;

}
else if (e.getSource() == button[j] && counter == 1){
b = button[j].getIndex();
if (a == b){
button[j].setFaceUp(true);
repaint();
counter = 0;
break;
}
else{
button[j].setFaceUp(true);
repaint();
flipPause(1);
button[current].setFaceUp(false);
button[j].setFaceUp(false);
repaint();
counter = 0;
break;
}

}

}
if (e.getSource()==quit)
System.exit(0);
/* if(e.getSource() == restart){
for(int s = 0; s < 25; s++){
button = shuffleResultImages(button);
s++;
}

for(int i = 0; i<button.length;i++){
button[i].setFaceUp(false);
}


}*/



}

public MyButton[] shuffleResultImages(MyButton[] button){

List list = Arrays.asList(button);
Collections.shuffle(list);
button = (MyButton[]) list.toArray();
return button;

}
public void flipPause(int seconds) {
try {

Thread.sleep(1000*seconds);

} catch (Exception e) {

}

}




}



Botões


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

public class MyButton extends JButton{

int index;
ImageIcon img;
ImageIcon cardBack = new ImageIcon("cardback.jpg");

public MyButton (ImageIcon theImg, int theIndex){

img = theImg;
index = theIndex;
setIcon(cardBack);
setPreferredSize(new Dimension(150,150));

}
public int getIndex(){
return index;
}
public ImageIcon getCardImage(){
return img;
}
public void setFaceUp(boolean faceUp) {
if (faceUp) {
setIcon(img);
setPreferredSize(new Dimension(150,150));
}
else {
setIcon(cardBack);
setPreferredSize(new Dimension(150,150));
}
}
}




Cumps

andrepadez
16-05-2008, 12:50
Convem dizeres onde é que ele faz Bum

Sky_Boy_
16-05-2008, 13:00
Podes inserir o teu comentario no codigo?
Onde e suposto fazer bump?

Cumps

andrepadez
16-05-2008, 14:39
Quando tu dizes: "frizo que ainda não está a funcionar",

quer dizer que ele estoira em algum lado, dá erro, faz Bum...

Que erro é que dá para não compilar?

Sky_Boy_
16-05-2008, 15:06
nenhum.....ele compila tudo impecavel....o problema e k n csg associar as imagens aos botoes e n percebo pk..

andrepadez
16-05-2008, 15:21
Nenhuma imagem funciona??

Não tens de definir a path para onde estão as imagens????

AliFromCairo
17-05-2008, 01:01
Boas, verifica se a directoria das imagens está incluída na classpath.

Sky_Boy_
18-05-2008, 16:01
As imagens tao na pasta bin do workspace....que é exactamente onde deveriam estar :S:S:S

Sky_Boy_
21-05-2008, 16:10
O programa esta a trabalhar mas agora estou com um problema....se acertarmos no par, tudo optimo, sem problemas....caso nao seja par, ele faz a comparação mas nao mostra a segunda parte....o pedaço de codigo referente a essa instrução é o seguinte:


for(int j = 0 ; j<button.length; j++){
if (e.getSource() == button[j] && counter == 0){
a = button[j].getIndex();
current = j;
button[j].setFaceUp(true);
repaint();
counter++;
break;

}
else if (e.getSource() == button[j] && counter == 1){
b = button[j].getIndex();
if (a == b){
button[j].setFaceUp(true);
repaint();
counter = 0;
break;
}
else{
//button[j].setFaceUp(true); // WRONG
//repaint();
button[current].setFaceUp(false);
button[j].setFaceUp(false);
repaint();
counter = 0;
break;
}

}

}


Alguem sabe como resolver o meu problema

Cumps

andrepadez
21-05-2008, 18:59
Boas, tive a ver o código.
O que acontece é que as coisas acontecem demasiado rápidas, ou seja, o programa mostra a carta, mas sem parar esconde-a logo a seguir (isto se os comments das duas 1ªs linhas terem sido adicionados depois de testares).


//button[j].setFaceUp(true); // WRONG
//repaint();
button[current].setFaceUp(false);
button[j].setFaceUp(false);
repaint();
counter = 0;
break;
Deve haver um mecanismo de pausa como um pause(2000) ou delay(2000) para pausar dois segundos.

Lê também o meu próximo post...

...Outra coisa que deves fazer, mas é um pouco secundário, é quando ele testa que é o 2º click, a segunda carta, mostrar logo a carta em vez de pôres o método para mostrar a carta nas duas condições, caso seja igual ou caso seja diferente.

isto:

else if (e.getSource() == button[j] && counter == 1){
b = button[j].getIndex();
if (a == b){
button[j].setFaceUp(true);
repaint();
counter = 0;
break;
}
else{
//button[j].setFaceUp(true); // WRONG
//repaint();
button[current].setFaceUp(false);
button[j].setFaceUp(false);
repaint();
counter = 0;
break;
}

}

devia ficar qq coisa como isto:

else if (e.getSource() == button[j] && counter == 1){
b = button[j].getIndex();
button[j].setFaceUp(true);//estas duas linhas aqui, não dependem da condição a seguir
repaint();
if (a == b){
counter = 0;
break;
}
else{
pause(2000); //again, não sei se está correcto
button[current].setFaceUp(false);
button[j].setFaceUp(false);
repaint();
counter = 0;
break;
}

}