# Puzzle - Listen erstellen, array & liste vergleichen



## HansK (14. Jun 2011)

Hallo,

Ich habe ein Puzzle programmiert, jedoch fehlt mir noch eine letzte Sache, nämlich der Vergleich, ob das Puzzle gelöst wurde.

Ich habe mir jetzt überlegt, dass ich die erzeugten Buttons( welchen ein Image zugewiesen wird), auch in eine Liste schreiben könnte, und dann irgendwie pro Tausch vergleichen können müsste. ( inhalt array und liste)
Je nachdem ob alle Arrays und Listeneinträge den selben Inhalt aufweisen, könnte ich doch sagen das das Spiel vorbei ist oder?

Jetzt fehlt mir das richtige Coding um das umzusetzen.
Wie kann ich denn eine Liste erstellen, welche den Inhalt der Arrays hat/übernimmt ( In diesem Fall sind das ja Images, was mich ein bisschen überfordert), und diese dann bei jedem "Klicktausch" nach der Übereinstimmigkeit abfragen?


```
for (int i=1; i<button.length; i++) {  
            button[i] = new JButton();
            button[i].addActionListener(this);
            button[i].setIcon(new ImageIcon(getClass().getResource(comment+i+".jpg")));

        }


        for(int i = 1; i < button.length; i++){   
                JButton tmp = button[i];
                int zelle = (int) (Math.random()*(button.length - i) + i);
                button[i] = button[zelle];
                button[zelle] = tmp;
                }

        for(int i = 1; i < button.length; i++){   
                panel.add(button[i]);
                button[i].setVisible(false);
                }

        this.getContentPane().add(panel, BorderLayout.CENTER); 
        for (int i = 1; i < button.length; i++) {            
              button[i].setVisible(true);
              }
```

In diesem Codingstück erzeuge ich die Buttons, setze die Images drauf, shuffle sie, und füge sie in das Frame ein.


```
private void swapIcons(int index1, int index2) {               
        Icon icon = button[index1].getIcon();
        button[index1].setIcon(button[index2].getIcon());
        button[index2].setIcon(icon);
    }
```

Hier tausche ich die buttons.

Freue mich auf tips und Codingbeispiele.
Gruß Hans


----------



## ChrisKu (15. Jun 2011)

Moin,



> Ich habe mir jetzt überlegt, dass ich die erzeugten Buttons( welchen ein Image zugewiesen wird), auch in eine Liste schreiben könnte, und dann irgendwie pro Tausch vergleichen können müsste



Kann man so machen. Allerdings ist Deine Erläuterung zum Code m.E. nicht ganz korrekt. Du schriebst, dass Du mit swapIcons() die Buttons tauscht, Du tauscht aber die Icons auf den Buttons.

Nehmen wir einmal an, Du willst wirklich die ganzen Buttons tauschen und diese dann vergleichen. Dann erzeuge doch einfach ein zweites JButton[] Array und fülle dieses in Deiner ersten for - Schleife


```
for (int i=1; i<button.length; i++) {  
            button[i] = new JButton();
            button[i].addActionListener(this);
            button[i].setIcon(new ImageIcon(getClass().getResource(comment+i+".jpg")));
            loesung[i] = button[i];
 
}
```

In Deiner Methode swapIcons müssen dann natürlich auch die Buttons getauscht werden:


```
private void swapIcons(int index1, int index2) {               
        JButton btn = button[index1];
        button[index1] = button[index2];
        button[index2] = btn;    
}
```

Die neue Button - Reihenfolge muss natürlich neu gezeichnet werden. Die Prüfung kannst Du dann ganz einfach eine Schleife durchführen


```
private boolean isSolved(){
    for (int i = 0; i < button.length; i++){
           if (!button[i].equals(loesung[i])){
                return false;
           }
    }
}
```
Wenn Du allerdings anhand der Bilder vergleichen willst, dann musst Du die Lösung in einem ImageIcon[] Array speichern. Also, in der ersten for Schleife


```
loesung[i] = button[i].getIcon();
```
Deine swapIcon Methode kann in diesem Fall so bleiben. Die Prüfung bei isSolved() wäre dann


```
if (!button[i].getIcon().equals(loesung[i]))
```

Habe das ganze jetzt aus dem Kopf gepostet, müsste aber eigentlich so gehen.


----------



## Marco13 (15. Jun 2011)

Nur weil man die Buttons in irgendeinem Array tauscht, tausch sich da im GUI (dem, was angezeigt wird) aber nichts. Unahbängig von der Frage, ob man da nicht eher ein geeignetes Datenmodell dahinterstellen sollte.


----------



## ChrisKu (15. Jun 2011)

> Nur weil man die Buttons in irgendeinem Array tauscht, tausch sich da im GUI (dem, was angezeigt wird) aber nichts.



Ach nee, please read:



> Die neue Button - Reihenfolge muss natürlich neu gezeichnet werden.





> Unahbängig von der Frage, ob man da nicht eher ein geeignetes Datenmodell dahinterstellen sollte.



Das war aber nicht die Frage. Unabhängig von der Frage, was eine solcher "ich weiß es aber besser" Post soll, sorry..


----------



## Marco13 (15. Jun 2011)

Das habe ich schon gelesen (und wenn nicht, könnte das auch mal passieren :noe: ). Der Hauptgrund, weswegen ich das erwähnt habe, ist, dass das Umsortieren der Buttons im Array und das dazu passende (!) Umsortieren der Buttons in einem Panel schon arg kompliziert sein kann - sofern man nicht einfach alle Buttons aus dem Panel entfernt und mit der neuen Reihenfolge neu einfügt. Sicher wäre das "einfach", zumindest viel einfacher als die Definition, Implementierung und Einbettung eines Datenmodells, aber ... es ist ja nicht auszuschließen, dass jemand lernen will, wie man grundsätzlich auch Aufgaben lösen kann, die über ein 100-Zeilen-Mini-Schiebepuzzle hinausgehen. Mir ist das aber eigentlich ziemlich egal.


----------



## HansK (16. Jun 2011)

Hey,
also ich habe es jetzt probiert aber es klappt einfach nicht.
könnt ihr mir sagen was ich im coding falsch mache?


```
for (int i=1; i<button.length; i++) {   
            button[i] = new JButton();
            button[i].addActionListener(this);
            button[i].setIcon(new ImageIcon(getClass().getResource(comment+i+".jpg")));

        }

        buttonclone = new ImageIcon[17];
        for (int i=1; i<button.length; i++) {
            buttonclone[i] = new ImageIcon();
            buttonclone[i].addActionListener(this);
            buttonclone[i].setIcon(new ImageIcon(getClass().getResource(comment+i+".jpg")));
            loesung[i] = buttonclone[i].getIcon();

            }


        for(int i = 1; i < button.length; i++){   
                JButton tmp = button[i];
                int zelle = (int) (Math.random()*(button.length - i) + i);
                button[i] = button[zelle];
                button[zelle] = tmp;
                }

        for(int i = 1; i < button.length; i++){   
                panel.add(button[i]);
                button[i].setVisible(false);
                }

        this.getContentPane().add(panel, BorderLayout.CENTER); 
        for (int i = 1; i < button.length; i++) {             
              button[i].setVisible(true);
              }
        ini = 1;
        
        
        private boolean isSolved(){
    for (int i = 0; i < buttonclone.length; i++){
           if (!button[i].getIcon().equals(loesung[i])){
                return false;
              }
                }
           }

    }
```

bin ein bisschen verwirrt sorry


----------



## Michael... (16. Jun 2011)

HansK hat gesagt.:


> ```
> buttonclone = new ImageIcon[17];
> for (int i=1; i<button.length; i++) {
> buttonclone[i] = new ImageIcon();
> ...


----------



## ChrisKu (16. Jun 2011)

Du erzeugst zwei ImageIcons, zwar mit dem gleichen Bild, aber trotzdem zwei Objekte. Dann liefert Dir die Prüfung object1.equals(object2) falsch als Antwort. Du musst eine Referenz auf das ursprüngliche Objekt setzen. Also in der ersten "for" Schleife


```
loesung[i] = button[i].getIcon();
```

Die zweite for Schleife kannst Du streichen.

PS: Was 2 slow, Michael... hatte schon geantwortet. Sorry.


----------



## HansK (16. Jun 2011)

Dann müsste es doch eigentlich so funktionieren oder?


```
public class Spiel extends JFrame implements ActionListener {

    private int index;                        
    private JButton[] button;
    private JButton[] loesung;
    private JLabel label;
    private JLabel label2;
    private JPanel panel;

    public static String comment; 
    private static int ini = 0;
    private void setGame(){
        if(ini != 0){
            System.out.println("Panel schließen");
            this.getContentPane().remove(panel);
        }
        
    int which = (int)(Math.random() * 5);  //  Result ist 0, 1, 2 or 3.

        switch (which) {                    
             case 0:  comment = "berg";
             break;
             case 1:  comment = "clk";
             break;
             case 2:  comment = "villa";
             break;
             case 3: comment = "boxing_girl";
             break;
             case 4: comment = "boxenluders";
             break;


        }
     panel = new JPanel(new GridLayout(4,4));    
     index = -1;
     System.out.println(comment);
     button = new JButton[17];                  
     
        for (int i=1; i<button.length; i++) {   
            button[i] = new JButton();
            button[i].addActionListener(this);
            button[i].setIcon(new ImageIcon(getClass().getResource(comment+i+".jpg")));
            loesung[i] = button[i].getIcon();

        }


        for(int i = 1; i < button.length; i++){   // Shufflen der Buttons
                JButton tmp = button[i];
                int zelle = (int) (Math.random()*(button.length - i) + i);
                button[i] = button[zelle];
                button[zelle] = tmp;
                }

        for(int i = 1; i < button.length; i++){   
                panel.add(button[i]);
                button[i].setVisible(false);
                }
                
                            private boolean isSolved(){
    for (int i = 0; i < button.length; i++){
           if (!button[i].getIcon().equals(loesung[i])){
                return false;
                }
                }
           }

        this.getContentPane().add(panel, BorderLayout.CENTER); 
        for (int i = 1; i < button.length; i++) {              
              button[i].setVisible(true);
              }
        ini = 1;
        
        


    }
```

(tut es aber nicht weil ich bestimmt wieder irgendwas vergessen habe )


----------



## Michael... (16. Jun 2011)

HansK hat gesagt.:


> Dann müsste es doch eigentlich so funktionieren oder?


Was müsste funktionieren? Kann es sein, dass sich der Code nicht kompilieren lässt?


HansK hat gesagt.:


> (tut es aber nicht weil ich bestimmt wieder irgendwas vergessen habe )


Eventuell Klammern an der richtigen Stelle?


----------



## HansK (16. Jun 2011)

illegal start of expression
private boolean isSolved(){
^

';' expected
 private boolean isSolved(){
                                   ^


----------



## ChrisKu (16. Jun 2011)

```
(tut es aber nicht weil ich bestimmt wieder irgendwas vergessen habe )
```

Hmm, ein kleiner Tip, was nicht funktioniert wäre super. Du hast ja auch nur ein Teil Deines Codes gepostet, der so nicht zu testen ist. Hänge doch mal Dein ganzes Projekt an.


----------



## ChrisKu (16. Jun 2011)

Ich kann jetzt nicht die ganzen Klammern auszählen. Aber kann es sein, dass Deine methode isSolved() innerhalb der Methode setGame() deklariert ist? Dann fehlt über isSolved noch eine geschweifte Klammer.


----------



## Michael... (16. Jun 2011)

Nochmal der Hinweis:


Michael... hat gesagt.:


> Eventuell Klammern an der richtigen Stelle?


Man kann innerhalb einer Methode nicht eine weitere definieren.

Solltest versuchen den Code sauber zu formatieren, dann fällt sowas eher auf.


----------



## ChrisKu (16. Jun 2011)

Ohha, da sind noch ein paar Fehler drin.

1. Der Typ von loesung[] ist falsch, du willst dort ja Icon speichern, also

ImageIcon[] loesung;

Die Methode isSolved() ist tatsächlich in die Methode setGame() eingebettet. Das geht natürlich nicht.

In der Methode isSolved() fehlt noch ein return true:

private boolean isSolved() {
        for (int i = 0; i < button.length; i++) {
            if (!button_.getIcon().equals(loesung)) {
                return false;
            }
        }
        return true;
    }

In Deiner Klasse Spiel fehlt noch eine ActionPerformed(ActionEvent e) Methode. (Vielleicht steht Sie auch weiter unten, ich sehe sie aber in Deinem Post nicht. Hier mal kurz Deine Klasse mit den richtigen Klammern - soweit Du ihn gepostet hast.



		Code:In die Zwischenablage kopieren


public class Spiel extends javax.swing.JFrame implements ActionListener {

    private int index;
    private JButton[] button;
    private ImageIcon[] loesung;
    private JLabel label;
    private JLabel label2;
    private JPanel panel;
    public static String comment;
    private static int ini = 0;

    private void setGame() {
        if (ini != 0) {
            System.out.println("Panel schließen");
            //this.getContentPane().remove(panel);
        }

        int which = (int) (Math.random() * 5);  //  Result ist 0, 1, 2 or 3.

        switch (which) {
            case 0:
                comment = "berg";
                break;
            case 1:
                comment = "clk";
                break;
            case 2:
                comment = "villa";
                break;
            case 3:
                comment = "boxing_girl";
                break;
            case 4:
                comment = "boxenluders";
                break;


        }
        panel = new JPanel(new GridLayout(4, 4));
        index = -1;
        System.out.println(comment);
        button = new JButton[17];

        for (int i = 1; i < button.length; i++) {
            button[i] = new JButton();
            button[i].addActionListener(this);
            button[i].setIcon(new ImageIcon(getClass().getResource(comment + i + ".jpg")));
            loesung[i] = (ImageIcon) button[i].getIcon();

        }


        for (int i = 1; i < button.length; i++) {   // Shufflen der Buttons
            JButton tmp = button[i];
            int zelle = (int) (Math.random() * (button.length - i) + i);
            button[i] = button[zelle];
            button[zelle] = tmp;
        }

        for (int i = 1; i < button.length; i++) {
            panel.add(button[i]);
            button[i].setVisible(false);
        }

        this.getContentPane().add(panel, BorderLayout.CENTER);

        for (int i = 1;
                i < button.length;
                i++) {
            button[i].setVisible(true);
        }
        ini = 1;
    }

    private boolean isSolved() {
        for (int i = 0; i < button.length; i++) {
            if (!button[i].getIcon().equals(loesung[i])) {
                return false;
            }
        }
        return true;
    }

    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

_


----------



## HansK (16. Jun 2011)

Ja ich hatte es innerhalb von setGame() geschrieben.
Jetzt ist nurnoch 1 Fehler da.

incompatible types
found: javax.swing.Icon
required: javax.swin.JButton
    loesung_ = button.getIcon();
                                               ^



		Java:In die Zwischenablage kopieren


import java.awt.BorderLayout;
import java.awt.GridLayout;                      // Bibliothek
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.lang.String;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Container;
import java.io.*;


public class PuzzlePro extends JFrame implements ActionListener {

    private int index;                        // Deklaration der Variablen
    private JButton[] button;
    private JButton[] loesung;
    private JLabel label;
    private JLabel label2;
    private JPanel panel;

    public static String comment; //statische Variable comment, um in der switch case
                                  //Kontrollstruktur ein Zufallsbild auszuwählen
    private static int ini = 0;
    private void setGame(){
        if(ini != 0){
            System.out.println("Panel schließen");
            this.getContentPane().remove(panel);
        }
        
    int which = (int)(Math.random() * 5);  //  Result ist 0, 1, 2 or 3.

        switch (which) {                    // Switch-Case-Methode um Bild mit random auszuwählen
             case 0:  comment = "berg";
             break;
             case 1:  comment = "clk";
             break;
             case 2:  comment = "villa";
             break;
             case 3: comment = "boxing_girl";
             break;
             case 4: comment = "boxenluders";
             break;


        }
     panel = new JPanel(new GridLayout(4,4));     // Erzeugung von neuem GridLayout mit 4x4
     index = -1;
     System.out.println(comment);
     button = new JButton[17];                  // Erzeugung von 17 Buttons
     
        for (int i=1; i<button.length; i++) {   // Schleife um Array zu erzeugen, welches Buttons, ActionListener und Icons aufnimmt
            button[i] = new JButton();
            button[i].addActionListener(this);
            button[i].setIcon(new ImageIcon(getClass().getResource(comment+i+".jpg")));
            loesung[i] = button[i].getIcon();

        }


        for(int i = 1; i < button.length; i++){   // Shufflen der Buttons
                JButton tmp = button[i];
                int zelle = (int) (Math.random()*(button.length - i) + i);
                button[i] = button[zelle];
                button[zelle] = tmp;
                }

        for(int i = 1; i < button.length; i++){   //  Hinzufügen der Buttons und diese unsichtbar machen
                panel.add(button[i]);
                button[i].setVisible(false);
                }
                


        this.getContentPane().add(panel, BorderLayout.CENTER); // Layout wird mittig gesetzt
        for (int i = 1; i < button.length; i++) {              // Buttons werden wieder sichtbar gemacht
              button[i].setVisible(true);
              }
        ini = 1;
        
        


    }
    
            private boolean isSolved(){
    for (int i = 0; i < button.length; i++){
           if (!button[i].getIcon().equals(loesung[i])){
                return false;
                }
                }
           }
    public PuzzlePro() {

        super("Puzzle Pro");      //Spielname im Titel

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   // Fenster kann geschlossen werden
        setSize( 800, 600);                               // Größe festgelegt
        //setSize( 1040, 820);
        setResizable ( false );                           // Fenstergröße nicht veränderbar
        setLocationRelativeTo(null);                      // Fenster mittig setzen
        index = -1;

        this.getContentPane().add(label = new JLabel("Wanna play a game?"), BorderLayout.SOUTH);  // Label einfügen

    JMenu menu, submenu;                   // Variablen deklarieren
    JMenuItem menuItem;
    JMenuBar menuBar = new JMenuBar();

    menu = new JMenu( "GAME");          // Erzeugen eines Hauptmenüpunktes
    menuBar.add( menu);                       // Hinzufügen des Hauptmenüpunktes
    menuItem = new JMenuItem( "New Game"); // Erzeugen eines Untermenüs von Puzzle Pro
    menu.add(menuItem);                    // Menüitem dem Menü hinzufügen


    menuItem.addActionListener( new ActionListener() {  // ActionListener
      public void actionPerformed( ActionEvent e) {

           setGame();                                  // Methode setGame() ausführen
           
      }
    });

    JMenuItem solution = new JMenuItem ("Solution");  // Neuer Menüpunkt "Solution"
    menu.add(solution);                               // dem Menü hinzufügen
    solution.addActionListener( new ActionListener() {   // ActionListener hinzufügen
      public void actionPerformed( ActionEvent e) {
        new Solution().setVisible(true);                  // Sichtbar machen
      }
    });


    menuItem = new JMenuItem( "Exit");                    // Neuer Menüpunkt "Exit"
    menu.add(menuItem);                                   // Zum Menü hinzufügen
    menuItem.addActionListener( new ActionListener() {    // ActionListener
      public void actionPerformed( ActionEvent e) {
        System.exit(0);                                      // Programm wird verlassen
      }
    });

    menu = new JMenu( "Optionen");           // Erzeugen eines Menüpunktes
    menuBar.add( menu);                        // Hinzufügen des Menüpunktes

    menuItem = new JMenuItem( "Hilfe");        // Neuer Menüpunkt "Hilfe"
    menu.add(menuItem);                        // Hinzufügen des Menüpunktes
    menuItem.addActionListener( new ActionListener() {    // ActionListener
      public void actionPerformed( ActionEvent e) {
        try                                                // Falls "Hilfe.txt" nicht geöffnet werden
                                                           // kann wird eine Fehlermeldung ausgegeben
        {
        Desktop.getDesktop().open(new File("Hilfe.txt"));
        }
        catch(Exception eref)
        {
        }
      }
    });
    
    menuItem = new JMenuItem( "Handbuch"); // Erzeugen eines Menüpunktes
    menu.add(menuItem);                    // Hinzufügen des Menüpunktes
    menuItem.addActionListener( new ActionListener() {  // ActionListener
      public void actionPerformed( ActionEvent e) {
        try                                                    // Falls "Handbuch.pdf" nicht geöffnet werden
                                                               // kann wird eine Fehlermedlung ausgegeben
        {
        Desktop.getDesktop().open(new File("Handbuch.pdf"));
        }
        catch(Exception eref)
        {
        }
      }
    });

    menuItem = new JMenuItem( "About"); // Erzeugen eines Untermenüs von Puzzle Pro
    menu.add(menuItem);
    menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
             JOptionPane.showMessageDialog(null, "                                         ", "About", JOptionPane.CLOSED_OPTION);
      }
    });



    setJMenuBar( menuBar);                  // Erzeugen der kompletten Menüleiste
    }

    public void actionPerformed(ActionEvent e) {              // ActionListener
        int curIndex = -1;
        for (int i=0; i<button.length; i++) {
            if (e.getSource().equals(button[i])) {
                curIndex = i;
                break;
            }
        }
        if(index==-1) {
            index = curIndex;
            label.setText(" Zweites Bild wählen");
        }
        else {
            swapIcons(index, curIndex);
            index = -1;
            label.setText(" Erstes Bild wählen");
        }
    }

    private void swapIcons(int index1, int index2) {                // Icons tauschen
        Icon icon = button[index1].getIcon();
        button[index1].setIcon(button[index2].getIcon());
        button[index2].setIcon(icon);
    }
    
    public static void main(String[] args) {                       // Main-Methode
        JFrame frame = new PuzzlePro();                            // Frame erstellen
        frame.setVisible(true);                                    // Frame sichtbar machen
    }
    

}




		Java:In die Zwischenablage kopieren


import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Solution extends JFrame {
       public Solution() {
       super( "Solution");
                setLocation( 10, 10);
                setSize( 384,288);
                //setResizeable (false);
                ImageIcon icon = new ImageIcon(getClass().getResource(PuzzlePro.comment + "Solution.jpg"));
                JLabel l1 = new JLabel (icon);
                add(l1); // Label hinzufügen



}


public static void main( String[] args) {
new Solution().setVisible(true);
}
}

_


----------



## ChrisKu (16. Jun 2011)

Siehe meinen vorherigen Post



> 1. Der Typ von loesung[] ist falsch, du willst dort ja Icon speichern, also
> 
> ImageIcon[] loesung;


----------



## HansK (16. Jun 2011)

hm jetzt lässt sich das zwar kompilieren und ausführen aber wenn ich dann "new game" klicke, wo eigentlich die bilder erschienen sind, passiert gar nichts mehr.

das hier wird ausgegeben.


Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at PuzzlePro.setGame(PuzzlePro.java:62)
	at PuzzlePro.access$000(PuzzlePro.java:19)
	at PuzzlePro$1.actionPerformed(PuzzlePro.java:127)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:809)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:850)
	at java.awt.Component.processMouseEvent(Component.java:6289)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6054)
	at java.awt.Container.processEvent(Container.java:2041)
	at java.awt.Component.dispatchEventImpl(Component.java:4652)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Component.dispatchEvent(Component.java:4482)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
	at java.awt.Container.dispatchEventImpl(Container.java:2085)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4482)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)
	at java.awt.EventQueue.access$000(EventQueue.java:85)
	at java.awt.EventQueue$1.run(EventQueue.java:603)
	at java.awt.EventQueue$1.run(EventQueue.java:601)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$2.run(EventQueue.java:617)
	at java.awt.EventQueue$2.run(EventQueue.java:615)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:614)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


----------



## ChrisKu (16. Jun 2011)

Dazu wäre es natürlich gut zu wissen, was bei Dir in Zeil 62 steht. Steht da das:


```
loesung[i] = button[i].getIcon();
```

Hast Du loesung[] irgendwo initalisiert? Also gibt es bei Dir eine Zeile


```
loesung[] = new ImageIcon[17];
```


----------



## HansK (16. Jun 2011)

Zeile 62:             loesung_ = (ImageIcon) button.getIcon();

nein ich habe loesung[] nicht initalisiert .. _


----------



## HansK (16. Jun 2011)

So,
habe jetzt loesung[] initialisiert,


```
for (int i=1; i<button.length; i++) {   // Schleife um Array zu erzeugen, welches Buttons, ActionListener und Icons aufnimmt
            button[i] = new JButton();
            button[i].addActionListener(this);
            button[i].setIcon(new ImageIcon(getClass().getResource(comment+i+".jpg")));
            loesung[i] = (ImageIcon) button[i].getIcon();

        }
```

und so habe ich nun meine for schleife!
kompilieren klappt, new game klappt auch, game läuft wie vorher.
Aber irgendwie fehlt die ausgabe von true oder false wenn richtig sortiert wurde!
gruß


----------



## HansK (16. Jun 2011)

fehlt jetzt noch irgendwas oder warum wird nichts ausgegeben wenn das puzzle sortiert wurde?


----------



## ChrisKu (16. Jun 2011)

> fehlt jetzt noch irgendwas oder warum wird nichts ausgegeben wenn das puzzle sortiert wurde?



Du bist aber auch knauserig mit Deinem Code, es ist wirklich schwer Fehler anhand von Code Fragmenten zu finden. Keine Angst, es wird schon keiner Deinen Code klauen

So, nun zu Deinem Problem: Zeig doch mal bitte, wo Du die methode isSolved() aufrufst. In dem längeren Code in einem Deiner früheren Post habe ich diesen Aufruf nämlich nicht gefunden. Also ich würde mal vermuten, dass die Prüfung auf die richtige Lösung nach jedem Tausch erfolgen soll, also z.B. so


```
private void swapIcons(int index1, int index2) {                // Icons tauschen
        Icon icon = button[index1].getIcon();
        button[index1].setIcon(button[index2].getIcon());
        button[index2].setIcon(icon);
        
       if (isSolved()){
           System.out.println("Gelöst");
           // Dein Code, was bei richtiger Lösung passieren soll
       }
}
```


----------



## HansK (16. Jun 2011)

hehe sorry chrisku na klar poste ich hier mal das ganze coding


```
import java.awt.BorderLayout;
import java.awt.GridLayout;                      // Bibliothek
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.lang.String;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Container;
import java.io.*;


public class PuzzlePro extends JFrame implements ActionListener {

    private int index;                        // Deklaration der Variablen
    private JButton[] button;
    private ImageIcon[] loesung;
    private JLabel label;
    private JLabel label2;
    private JPanel panel;

    public static String comment; //statische Variable comment, um in der switch case
                                  //Kontrollstruktur ein Zufallsbild auszuwählen
    private static int ini = 0;
    private void setGame(){
        if(ini != 0){
            System.out.println("Panel schließen");
            this.getContentPane().remove(panel);
        }
        
    int which = (int)(Math.random() * 5);  //  Result ist 0, 1, 2 or 3.

        switch (which) {                    // Switch-Case-Methode um Bild mit random auszuwählen
             case 0:  comment = "berg";
             break;
             case 1:  comment = "clk";
             break;
             case 2:  comment = "villa";
             break;
             case 3: comment = "boxing_girl";
             break;
             case 4: comment = "boxenluders";
             break;


        }
     panel = new JPanel(new GridLayout(4,4));     // Erzeugung von neuem GridLayout mit 4x4
     index = -1;
     System.out.println(comment);
     button = new JButton[17];                  // Erzeugung von 17 Buttons
     loesung = new ImageIcon[17];
     
        for (int i=1; i<button.length; i++) {   // Schleife um Array zu erzeugen, welches Buttons, ActionListener und Icons aufnimmt
            button[i] = new JButton();
            button[i].addActionListener(this);
            button[i].setIcon(new ImageIcon(getClass().getResource(comment+i+".jpg")));
            loesung[i] = (ImageIcon) button[i].getIcon();
//              loesung[i] = button[i].getIcon();

        }


        for(int i = 1; i < button.length; i++){   // Shufflen der Buttons
                JButton tmp = button[i];
                int zelle = (int) (Math.random()*(button.length - i) + i);
                button[i] = button[zelle];
                button[zelle] = tmp;
                }

        for(int i = 1; i < button.length; i++){   //  Hinzufügen der Buttons und diese unsichtbar machen
                panel.add(button[i]);
                button[i].setVisible(false);
                }
                


        this.getContentPane().add(panel, BorderLayout.CENTER); // Layout wird mittig gesetzt
        for (int i = 1; i < button.length; i++) {              // Buttons werden wieder sichtbar gemacht
              button[i].setVisible(true);
              }
        ini = 1;
        
        


    }
    
    private boolean isSolved() {
            for (int i = 1; i < button.length; i++) {
                if (!button[i].getIcon().equals(loesung[i])) {
                return false;
                }
            }
            return true;
    }
    
    public PuzzlePro() {

        super("Puzzle Pro");      //Spielname im Titel

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   // Fenster kann geschlossen werden
        setSize( 800, 600);                               // Größe festgelegt
        //setSize( 1040, 820);
        setResizable ( false );                           // Fenstergröße nicht veränderbar
        setLocationRelativeTo(null);                      // Fenster mittig setzen
        index = -1;

        this.getContentPane().add(label = new JLabel("Wanna play a game?"), BorderLayout.SOUTH);  // Label einfügen

    JMenu menu, submenu;                   // Variablen deklarieren
    JMenuItem menuItem;
    JMenuBar menuBar = new JMenuBar();

    menu = new JMenu( "GAME");          // Erzeugen eines Hauptmenüpunktes
    menuBar.add( menu);                       // Hinzufügen des Hauptmenüpunktes
    menuItem = new JMenuItem( "New Game"); // Erzeugen eines Untermenüs von Puzzle Pro
    menu.add(menuItem);                    // Menüitem dem Menü hinzufügen


    menuItem.addActionListener( new ActionListener() {  // ActionListener
      public void actionPerformed( ActionEvent e) {

           setGame();                                  // Methode setGame() ausführen
           
      }
    });

    JMenuItem solution = new JMenuItem ("Solution");  // Neuer Menüpunkt "Solution"
    menu.add(solution);                               // dem Menü hinzufügen
    solution.addActionListener( new ActionListener() {   // ActionListener hinzufügen
      public void actionPerformed( ActionEvent e) {
        new Solution().setVisible(true);                  // Sichtbar machen
      }
    });


    menuItem = new JMenuItem( "Exit");                    // Neuer Menüpunkt "Exit"
    menu.add(menuItem);                                   // Zum Menü hinzufügen
    menuItem.addActionListener( new ActionListener() {    // ActionListener
      public void actionPerformed( ActionEvent e) {
        System.exit(0);                                      // Programm wird verlassen
      }
    });

    menu = new JMenu( "Optionen");           // Erzeugen eines Menüpunktes
    menuBar.add( menu);                        // Hinzufügen des Menüpunktes

    menuItem = new JMenuItem( "Hilfe");        // Neuer Menüpunkt "Hilfe"
    menu.add(menuItem);                        // Hinzufügen des Menüpunktes
    menuItem.addActionListener( new ActionListener() {    // ActionListener
      public void actionPerformed( ActionEvent e) {
        try                                                // Falls "Hilfe.txt" nicht geöffnet werden
                                                           // kann wird eine Fehlermeldung ausgegeben
        {
        Desktop.getDesktop().open(new File("Hilfe.txt"));
        }
        catch(Exception eref)
        {
        }
      }
    });
    
    menuItem = new JMenuItem( "Handbuch"); // Erzeugen eines Menüpunktes
    menu.add(menuItem);                    // Hinzufügen des Menüpunktes
    menuItem.addActionListener( new ActionListener() {  // ActionListener
      public void actionPerformed( ActionEvent e) {
        try                                                    // Falls "Handbuch.pdf" nicht geöffnet werden
                                                               // kann wird eine Fehlermedlung ausgegeben
        {
        Desktop.getDesktop().open(new File("Handbuch.pdf"));
        }
        catch(Exception eref)
        {
        }
      }
    });

    menuItem = new JMenuItem( "About"); // Erzeugen eines Untermenüs von Puzzle Pro
    menu.add(menuItem);
    menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
             JOptionPane.showMessageDialog(null, "                                        ", "About", JOptionPane.CLOSED_OPTION);
      }
    });



    setJMenuBar( menuBar);                  // Erzeugen der kompletten Menüleiste
    }

    public void actionPerformed(ActionEvent e) {              // ActionListener
        int curIndex = -1;
        for (int i=0; i<button.length; i++) {
            if (e.getSource().equals(button[i])) {
                curIndex = i;
                break;
            }
        }
        if(index==-1) {
            index = curIndex;
            label.setText(" Zweites Bild wählen");
        }
        else {
            swapIcons(index, curIndex);
            index = -1;
            label.setText(" Erstes Bild wählen");
        }
    }

    private void swapIcons(int index1, int index2) {                // Icons tauschen
        Icon icon = button[index1].getIcon();
        button[index1].setIcon(button[index2].getIcon());
        button[index2].setIcon(icon);
               if (isSolved()){
           System.out.println("Gelöst");
           System.exit(0);
       }
    }
    
    public static void main(String[] args) {                       // Main-Methode
        JFrame frame = new PuzzlePro();                            // Frame erstellen
        frame.setVisible(true);                                    // Frame sichtbar machen
    }
    

}
```


```
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Solution extends JFrame {
       public Solution() {
       super( "Solution");
                setLocation( 10, 10);
                setSize( 384,288);
                //setResizeable (false);
                ImageIcon icon = new ImageIcon(getClass().getResource(PuzzlePro.comment + "Solution.jpg"));
                JLabel l1 = new JLabel (icon);
                add(l1); // Label hinzufügen



}


public static void main( String[] args) {
new Solution().setVisible(true);
}
}
```

also das programm funktioniert, nur passiert immernoch nichts wenn das puzzle gelöst wird


----------



## ChrisKu (17. Jun 2011)

> also das programm funktioniert, nur passiert immernoch nichts wenn das puzzle gelöst wird



Frage: Was soll den passieren? Nach Deinem Code soll, wenn gelöst, das Wort "Gelöst" ausgegeben und das Programm beendet werden. Ich habe Deinen Code bei mir laufen lassen, und genau das passiert auch. Also, eigentlich funktioniert Dein Code, genauso wie er soll!

Nun die mögliche Einschränkung: Ich habe Deine Bildchen nicht, vielleicht sind da ja zwei schon beim Laden vertauscht, so dass der Spieler nur denkt, er hätte die richtige Lösung. Prüfe das doch mal oder poste Deine Bildchen mal als Zip Datei oder so. Dann kann ich das Spiel auch mit Bildern testen.


----------



## HansK (17. Jun 2011)

So ich habe die Bilder mal angehängt 
Freut mich das es bei dir ohne Bilder funktioniert hat,
dann müsste es mit Bildern ja auch funktionieren.
Vielleicht hat das was mit den Beschriftungen zu tun?
Ich hoffe du kannst mir beim finalen Schritt helfen.

Bitte beim ausprobieren die höhere Auflösung auswählen
        setSize( 1040, 820);
sonst passen die Bilder nicht.

Ich kann ja sowas ausgeben oder?

JOptionPane.showMessageDialog(null, "Congratulations!", " ", JOptionPane.CLOSED_OPTION);


Gruß,
Hans


----------



## ChrisKu (17. Jun 2011)

Ich habe jetzt nicht alle Bilder getestet, nur das Auto und die Villa. Funktioniert perfekt! Ich habe Deinen Vorschlag von oben mit eingbaut


```
private void swapIcons(int index1, int index2) {                // Icons tauschen
        Icon icon = button[index1].getIcon();
        button[index1].setIcon(button[index2].getIcon());
        button[index2].setIcon(icon);
        if (isSolved()) {
            System.out.println("Gelöst");
            JOptionPane.showMessageDialog(this, "Congratulations");
        } else {
            cheat();
        }
    }
```
Wahrscheinlich wunderst Du Dich über die Methode cheat() . Die hatte ich nur zu Testzwecken mit reingepackt - sie zeigt mir, welcher Stein an welche Stelle muss. Du kannst sie rauslöschen, aber falls sie dich interessiert:


```
private void cheat(){
        for (int i = 1; i < button.length; i++){
            for (int j = 1; j < loesung.length; j++){
                if (button[i].getIcon().equals(loesung[j])){
                    System.out.println("Button " + i + " muss an Stelle " + j);
                    break;
                }
            }
        }
    }
```
Also: Dein Code läuft, wie er soll. Glückwunsch:applaus:


----------



## HansK (17. Jun 2011)

Danke für deine kompetente Hilfe sowie Ausdauer, ChrisKu!

Gruß,
Hans


----------



## ChrisKu (17. Jun 2011)

Gern geschehen!


----------

