Memory

Status
Nicht offen für weitere Antworten.
J

J-Mee

Gast
Hi!

Ich hab Memory jetzt fast fertig(dank der Hilfe von L-ectron-X)
Hab nur noch ein Problem: Wenn man die zweite Karte aufdeckt, wird die farbe nicht gezeigt
Hoffe dass ihr mir wieder helfen könnt!

hier der Code:

Code:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.*;

public class Memory extends JFrame implements ActionListener{

	private static final long serialVersionUID = 1L;
	
	JButton[][] buttons;
	JTextField tries;
	Color[] colors={Color.RED, Color.YELLOW, Color.BLUE, Color.GREEN, Color.BLACK, Color.WHITE, Color.CYAN, Color.GRAY, new Color(160,40,40), Color.MAGENTA, Color.ORANGE, Color.PINK};
	Color[][] covColors=new Color[4][6];
	Color buttonDesign;
	int versuche=0;
	int l;
	int r;

	public Memory() {
		setTitle("Memory");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(600,400);
		Dimension screen=getToolkit().getScreenSize();
		setLocation((screen.width-600)/2,(screen.height-400)/2);
		tries=new JTextField("Versuche :"+versuche,20);
		tries.setEditable(false);
		JPanel textarea=new JPanel();
		textarea.add(tries);
		buttons=new JButton[4][6];
		JPanel buttonArea=new JPanel(new GridLayout(buttons.length,buttons.length));
		for(int i=0;i<buttons.length;i++) {
			for(int j=0;j<buttons[i].length;j++){
				buttons[i][j]=new JButton("");
				buttonArea.add(buttons[i][j]);	
			}
		} 
		add(textarea,BorderLayout.NORTH);
		add(buttonArea,BorderLayout.CENTER);
		setVisible(true);
		buttonDesign=buttons[0][0].getBackground();
		for(JButton[] b:buttons){
			for(JButton n:b){
				n.addActionListener(this);
			}
		}
		getSpielfeld();
	}
	
	public void getSpielfeld(){
		for(Color c:colors){
			int counter=0;
			while(true){
				int line=new Random().nextInt(4);
				int row=new Random().nextInt(6);
				if(covColors[line][row]!=null)continue;
				covColors[line][row]=c;
				counter++;
				if(counter==2)break;
			}
		}
	}

	public static void main(String[] args){
		new Memory();
	}
	
	public static void pause(int  millis){
		try{Thread.sleep(millis);}
		catch(Exception ignore){}
	}

	public void actionPerformed(ActionEvent e) {
		for(int i=0;i<buttons.length;i++){
			for(int n=0;n<buttons[i].length;n++){
				if(e.getSource()==buttons[i][n]){
				if(buttons[i][n].getBackground()!=buttonDesign)return;
				versuche++;
				buttons[i][n].setBackground(covColors[i][n]);
				if(versuche%2!=0){l=i;r=n;}
				else{tries.setText("Versuche: "+versuche/2);
				boolean b=true;
				for(JButton[] x:buttons){
					for(JButton y:x){
						if(y.getBackground()==buttonDesign)b=false;
					}
				}
				if(b==true)tries.setText("Memory gelöst!!    Versuche: "+versuche/2);
				pause(500);
				if(buttons[l][r].getBackground()!=buttons[i][n].getBackground()){buttons[l][r].setBackground(buttonDesign);buttons[i][n].setBackground(buttonDesign);}
				}
				return;
				}
			}
		}
	}
}
 

Marco13

Top Contributor
Die actionPerformed Methode wird vom Event-Dispatch-Thread aufgerufen. Das ist der Thread, der dafür zuständig ist, alles zu regeln und abzuarbeiten, was mit der Oberfläche zu tun hat. Der ist aber AUCH dafür zuständig, dass neu gezeichnet wird. In deiner "pause"-Methode legtst du also den Thread schlafen, der eigentlich neu zeichnen sollte.

Abhilfe: Das Warten und sollte von einem eigenen Thread gemacht werden. Das Zurücksetzen des Hintergrundes sollte aber wieder vom Event-Dispatch-Thread gemacht werden. Dummerweise kann es dann passieren, dass der Benutzer noch irgendwelche Buttons klickt, während gerade darauf gewartet wird, die Hintergrundfarbe der vorigen Buttons zurücksetzen zu können. Das kann man z.B. vermeiden, indem man die Buttons während der Wartezeit disabled. Ungefähr so...

Code:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.*;

public class Memory extends JFrame implements ActionListener{

   private static final long serialVersionUID = 1L;

   JButton[][] buttons;
   JTextField tries;
   Color[] colors={Color.RED, Color.YELLOW, Color.BLUE, Color.GREEN, Color.BLACK, Color.WHITE, Color.CYAN, Color.GRAY, new Color(160,40,40), Color.MAGENTA, Color.ORANGE, Color.PINK};
   Color[][] covColors=new Color[4][6];
   Color buttonDesign;
   int versuche=0;
   int l;
   int r;

   public Memory() {
      setTitle("Memory");
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      setSize(600,400);
      Dimension screen=getToolkit().getScreenSize();
      setLocation((screen.width-600)/2,(screen.height-400)/2);
      tries=new JTextField("Versuche :"+versuche,20);
      tries.setEditable(false);
      JPanel textarea=new JPanel();
      textarea.add(tries);
      buttons=new JButton[4][6];
      JPanel buttonArea=new JPanel(new GridLayout(buttons.length,buttons.length));
      for(int i=0;i<buttons.length;i++) {
         for(int j=0;j<buttons[i].length;j++){
            buttons[i][j]=new JButton("");
            buttonArea.add(buttons[i][j]);
         }
      }
      add(textarea,BorderLayout.NORTH);
      add(buttonArea,BorderLayout.CENTER);
      setVisible(true);
      buttonDesign=buttons[0][0].getBackground();
      for(JButton[] b:buttons){
         for(JButton n:b){
            n.addActionListener(this);
         }
      }
      getSpielfeld();
   }

   public void getSpielfeld(){
      for(Color c:colors){
         int counter=0;
         while(true){
            int line=new Random().nextInt(4);
            int row=new Random().nextInt(6);
            if(covColors[line][row]!=null)continue;
            covColors[line][row]=c;
            counter++;
            if(counter==2)break;
         }
      }
   }

   public static void main(String[] args){
      new Memory();
   }

   public static void pause(int  millis){
      try{Thread.sleep(millis);}
      catch(Exception ignore){}
   }

   private void pauseAndClose(final JButton b0, final JButton b1, final int millis)
   {
       setAllButtonsEnabled(false);

       // Erstelle einen Thread ...
       Thread t = new Thread(new Runnable()
       {
           public void run()
           {
               // ... der erstmal NUR wartet
              try{Thread.sleep(millis);}
              catch(Exception ignore){}

               // Und wenn er mit dem warten fertig ist,
               // veranlasst er, dass die Buttons zurückgesetzt
               // werden, und alle buttons enabled werden
               // (Das sollte vom EventDispatchThread
               // aus gemacht werden, darum mit Hilfe
               // von "SwingUtilities.invokeLater")
               SwingUtilities.invokeLater(new Runnable()
               {
                   public void run()
                   {
                        b0.setBackground(buttonDesign);
                        b1.setBackground(buttonDesign);
                       setAllButtonsEnabled(true);
                   }
               });
           }
       });
       t.start();
   }


    // Alle buttons enablen/disablen
    private void setAllButtonsEnabled(boolean enabled)
    {
      for(int i=0;i<buttons.length;i++)
      {
         for(int n=0;n<buttons[i].length;n++)
         {
             buttons[i][n].setEnabled(enabled);
         }
      }
    }



   public void actionPerformed(ActionEvent e) {
      for(int i=0;i<buttons.length;i++){
         for(int n=0;n<buttons[i].length;n++){
            if(e.getSource()==buttons[i][n]){
            if(buttons[i][n].getBackground()!=buttonDesign)return;
            versuche++;
            buttons[i][n].setBackground(covColors[i][n]);
            if(versuche%2!=0){l=i;r=n;}
            else{tries.setText("Versuche: "+versuche/2);
            boolean b=true;
            for(JButton[] x:buttons){
               for(JButton y:x){
                  if(y.getBackground()==buttonDesign)b=false;
               }
            }
            if(b==true)tries.setText("Memory gelöst!!    Versuche: "+versuche/2);

            //pause(500);
            if(buttons[l][r].getBackground()!=buttons[i][n].getBackground())
            {
                pauseAndClose(buttons[l][r], buttons[i][n], 1500);
                //buttons[l][r].setBackground(buttonDesign);
                //buttons[i][n].setBackground(buttonDesign);
            }

            }
            return;
            }
         }
      }
   }
}
 
J

J-Mee

Gast
Danke für die schnelle Hilfe! :toll:
kenn mich noch nich so gut aus mit threads... :wink:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Image Matching in Memory Minigame Java Basics - Anfänger-Themen 7
B Memory Spiel Java Basics - Anfänger-Themen 29
J Memory-Spiel Aktivierung der Methode mit Timer Java Basics - Anfänger-Themen 44
Olis Erste Schritte Simples Memory Spiel möglich? Java Basics - Anfänger-Themen 1
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
T Art 4 Felder Matrix Memory Java Basics - Anfänger-Themen 2
V Memory Logik Problem/Denkblockade, bitte helft Java Basics - Anfänger-Themen 1
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
pinar memory spiel Java Basics - Anfänger-Themen 10
P NullPointerException in Memory-Spiel Java Basics - Anfänger-Themen 5
P Layout Manager - Welches Layout für Memory? Java Basics - Anfänger-Themen 7
A Java memory leakage Java Basics - Anfänger-Themen 9
T Out of Memory (Java Heap Space) Java Basics - Anfänger-Themen 9
S Datentypen Memory Problem Java Basics - Anfänger-Themen 12
I Memory-Spiel Feld nur einmal mischen Java Basics - Anfänger-Themen 2
O Memory Thread.sleep() Java Basics - Anfänger-Themen 5
K Memory-Spiel stecke Fest Java Basics - Anfänger-Themen 2
K Ein Memory Spiel ! Java Basics - Anfänger-Themen 6
K Memory-Spiel alle verdeckte karten aufdecken. Java Basics - Anfänger-Themen 26
T Memory Leak und der Garbage Collector Java Basics - Anfänger-Themen 21
A Memory Probleme beim Laden von thumbnails Java Basics - Anfänger-Themen 3
S memory heap problem Java Basics - Anfänger-Themen 9
J Memory Footprint von Objekten Java Basics - Anfänger-Themen 2
I Memory-Spiel Java Basics - Anfänger-Themen 2
W Servlet - out of memory Java Basics - Anfänger-Themen 7
G Memory-Spiel Java Basics - Anfänger-Themen 8
B Memory - Zufällige Anordnung von Buchstabenpaaren Java Basics - Anfänger-Themen 8
G Memory Projekt, Fragen über Fragen Java Basics - Anfänger-Themen 6
B Memory in Java Java Basics - Anfänger-Themen 16
T Out of Memory Error Java Basics - Anfänger-Themen 7
E Heapspace out of Memory Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben