# Memory Spiel



## mahrty (13. Jan 2012)

Hi, 
ich bin zurzeit im Grundkurs Informatik an unserer Schule und ich habe nen Memory programmiert, allerdings hab ich keine Ahnung wie ich es hinkriegen soll dass die Karten zufällig angeordnet sind. Bei all meinen Versuchen waren nicht alle Karten dargestellt. Deswegen wärs cool wenn ihr mir Ideen geben könntet wie man es lösen kann bzw. es mir erklären könnt  .


```
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

import java.util.*;



public class Memory  extends JFrame implements ActionListener
{
	
	/*
	 * Panels
	 */
	
	JPanel root = new JPanel();
	JPanel versuchpanel = new JPanel();
	JPanel karten = new JPanel();
	
	/*
	 * Bilder
	 */
	
	ImageIcon null0 = new ImageIcon("0.jpg");
	ImageIcon eins = new ImageIcon("1.jpg");
	ImageIcon zwei = new ImageIcon("2.jpg");
	ImageIcon drei = new ImageIcon("3.jpg");
	ImageIcon vier = new ImageIcon("4.jpg");
	ImageIcon fuenf = new ImageIcon("5.jpg");
	ImageIcon sechs = new ImageIcon("6.jpg");
	ImageIcon sieben = new ImageIcon("7.jpg");
	ImageIcon back = new ImageIcon("back.jpg");
	
	
	ImageIcon [] aIcons = {null0, eins, zwei, drei, vier, fuenf, sechs, sieben, null0, eins, zwei, drei, vier, fuenf, sechs, sieben};
	
	
	/*
	 * Buttons
	 */
	
	JButton button1 = new JButton(back);
	JButton button2 = new JButton(back);
	JButton button3 = new JButton(back);
	JButton button4 = new JButton(back);
	JButton button5 = new JButton(back);
	JButton button6 = new JButton(back);
	JButton button7 = new JButton(back);
	JButton button8 = new JButton(back);
	JButton button1_2 = new JButton(back);
	JButton button2_2 = new JButton(back);
	JButton button3_2 = new JButton(back);
	JButton button4_2 = new JButton(back);
	JButton button5_2 = new JButton(back);
	JButton button6_2 = new JButton(back);
	JButton button7_2 = new JButton(back);
	JButton button8_2 = new JButton(back);
	
	JButton [] aButtons = {button1, button2, button3, button4, button5, button6, button7, button8, button1_2, button2_2, button3_2, button4_2, button5_2, button6_2, button7_2, button8_2}; 

	
	/*
	 * Labels
	 */
	
	JLabel versuche = new JLabel("Klicks: 0");
	
	/*
	 * Menu
	 */
	
	JMenuItem starten = new JMenuItem("Spiel starten");
	JMenuItem beenden = new JMenuItem("Beenden");
	JMenu menu = new JMenu("Menu");
	JMenuBar menubar = new JMenuBar();
	
	/*
	 * Variablen
	 */
	
	private int a;
	private int b;
	private boolean pressed;
	private ImageIcon current;
	private ImageIcon previous;
	private int klicks;
	

	
		public Memory()
		{
			super("Memory");
			setDefaultCloseOperation(Memory.EXIT_ON_CLOSE);
			
			
			root.setLayout(new BorderLayout());
			karten.setLayout(new GridLayout(4, 4, 10, 10));
			
			
			
			
			for(int i=0; i < aButtons.length; i++)
			{
				
				karten.add(aButtons[i]);
				aButtons[i].addActionListener(this);
			}
			
			menu.add(starten);
			menu.add(beenden);
			menubar.add(menu);
			setJMenuBar(menubar);
			starten.addActionListener(this);
			beenden.addActionListener(this);
			
			versuchpanel.add(versuche);
			
			root.add(karten, "Center");
			root.add(versuchpanel, "North");
			
			getContentPane().add(root);
			
			
			
		}
	
		
		public void actionPerformed(ActionEvent e)
		{
			for(int j=0; j < aButtons.length; j++)
			{
			
			if(e.getSource()==aButtons[j])
			{
				if(pressed==true)
				{
					b=j;
					previous=current;
					current=aIcons[b];
					aButtons[b].setIcon(current);
					pressed=false;
					
				}
				else
				{
					if (current != null && previous !=null)
					{
						if(current.getImage()==previous.getImage())
						{
							current=null;
							previous=null;
						}
						else
						{
							aButtons[a].setIcon(back);
							aButtons[b].setIcon(back);
						
						}
					}
					a=j;
					current=aIcons[a];
					aButtons[a].setIcon(current);
					pressed=true;
				}
				klicks += 1;
				versuche.setText("Klicks: "+klicks);
			}	
		}
			
			if(e.getSource()==beenden)
			{
				System.exit(0);
			}
			
			if(e.getSource()==starten)
			{
				for(int k=0; k < aButtons.length; k++)
				{
					aButtons[k].setIcon(back);
					a=0;
					b=0;
					current=null;
					previous=null;
					pressed=false;
					klicks=0;
					versuche.setText("Klicks: "+klicks);
					
				}
			}
			
		}
}
```

Danke schon mal im Vorraus  .


----------



## Fab1 (13. Jan 2012)

Hi,

also mithilfe von Collections (Java Platform SE 6) kann man eine Liste mischen. Diese erwartet allerdings eine Liste, was ja kein Problem sein sollte.

Aber ich fände es besser, wenn du davor mal versuchst deinen Code etwas übersichtlicher zu gestalten. Die ganzen Buttons könntest du mithilfe einer einfachen For-Schleife erstellen. Die ImageIcon lassen sich aufgrund des aufsteigenden Namens auch in eine Schleife packen.

Das mit dem Sortieren, mithilfe von shuffle kannst du eine Liste einfach mal mischen. Und diese Buttons musst du halt dann wieder entsprechend in deinem Panel hinzu fügen. Falls du dir das so gedacht hast.

Deine actionPerformed hab ich mir nicht angeschaut, wird schon stimmen hoff ich mal


----------



## mahrty (14. Jan 2012)

Alles klar danke für die unglaublich schnelle Hilfe! Dank dir kann ich jetzt beruhigt schlafen  !
Hier ist das Ergebnis :


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




public class Memory  extends JFrame implements ActionListener
{
	
	/*
	 * Panels
	 */
	
	JPanel root = new JPanel();
	JPanel versuchpanel = new JPanel();
	JPanel karten = new JPanel();

	/*
	 * ImageIcon und JButton Arrays erstellen
	 */
	
	ImageIcon [] aIcons = new ImageIcon[16];
	ImageIcon back = new ImageIcon("back.jpg");
	JButton aButtons[] = new JButton[16];
	
	/*
	 * Labels
	 */
	
	JLabel versuche = new JLabel("Klicks: 0");
	
	/*
	 * Menu
	 */
	
	JMenuItem starten = new JMenuItem("Spiel starten");
	JMenuItem beenden = new JMenuItem("Beenden");
	JMenu menu = new JMenu("Menu");
	JMenuBar menubar = new JMenuBar();
	
	/*
	 * Variablen
	 */
	
	private int a;
	private int b;
	private boolean pressed;
	private ImageIcon current;
	private ImageIcon previous;
	private int klicks;
	

	
		public Memory()
		{
			super("Memory");
			setDefaultCloseOperation(Memory.EXIT_ON_CLOSE);
			
			
			root.setLayout(new BorderLayout());
			karten.setLayout(new GridLayout(4, 4, 10, 10));
			
			/*
			 * Icons erstellen
			 */
			
			int l;
			
			
			for(l=0; l < aIcons.length/2; l++)
			{
				aIcons[l] = new ImageIcon(l+".jpg");
			}
			for(int n=0; n < aIcons.length/2; n++)
			{
				aIcons[l+n] = new ImageIcon(n+".jpg");
			}
			
			Collections.shuffle(Arrays.asList(aIcons));
			
			/*
			 * Buttons erstellen
			 */
			
			
			for(int n=0; n < aButtons.length; n++)
			{
				aButtons[n] = new JButton(back);
			}
			
			
			
			
			
			/*
			 * Buttons adden
			 */
			
			
			for(int i=0; i < aButtons.length; i++)
			{
				
				karten.add(aButtons[i]);
				aButtons[i].addActionListener(this);
			}
			
			menu.add(starten);
			menu.add(beenden);
			menubar.add(menu);
			setJMenuBar(menubar);
			starten.addActionListener(this);
			beenden.addActionListener(this);
			
			versuchpanel.add(versuche);
			
			root.add(karten, "Center");
			root.add(versuchpanel, "North");
			
			getContentPane().add(root);
			
			
			
		}
	
		
		public void actionPerformed(ActionEvent e)
		{
			
			/*
			 * actionPerformed für Buttons
			 */
			
			for(int j=0; j < aButtons.length; j++)
			{
			
			if(e.getSource()==aButtons[j]) //überprüft welcher Button gedrückt wurde
			{
				if(pressed==true)	//wenn zweites mal gedrückt
				{
					b=j;
					previous=current;
					current=aIcons[b];
					aButtons[b].setIcon(current);
					pressed=false;
					
				}
				else			
				{
					if (current != null && previous !=null)
					{
						if(current.getImage()==previous.getImage()) //wenn Bilder der Icons gleich
						{
							current=null;
							previous=null;
						}
						else
						{
							aButtons[a].setIcon(back);
							aButtons[b].setIcon(back);
						
						}
					}
					a=j;
					current=aIcons[a];
					aButtons[a].setIcon(current);
					pressed=true;
				}
				
				klicks += 1;
				versuche.setText("Klicks: "+klicks);
			}	
		}
			
			/*
			 * actionPerformed für Spiel beenden
			 */
			
			
			if(e.getSource()==beenden)
			{
				System.exit(0);
			}
			
			/*
			 * actionPerformed für Spiel starten
			 */
			
			
			if(e.getSource()==starten)
			{
				for(int k=0; k < aButtons.length; k++)
				{
					aButtons[k].setIcon(back);
					a=0;
					b=0;
					current=null;
					previous=null;
					pressed=false;
					klicks=0;
					versuche.setText("Klicks: "+klicks);
					
				}
			}
			
		}
}
```

Wenn noch jemand Tipps hat was ich an dem Memory oder an meinem Stil noch verbessern kann wäre ich ihm sehr dankbar!


----------



## homer65 (14. Jan 2012)

Auf MyOggRadio gibt es im Download Bereich ein fertiges Spiel nach der Idee von Memory.
Das Spiel ist Open Source und du kannst dir ja mal den Quellcode angucken, er ist im jar enthalten.


----------

