Puzzle - Listen erstellen, array & liste vergleichen

HansK

Mitglied
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?

Java:
        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.

Java:
    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

Bekanntes Mitglied
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

Code:
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:

Code:
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

Code:
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

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

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

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

Marco13

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

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

Java:
        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...

Top Contributor
Java:
        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();

            }[/QUOTE]
Wusst garnicht, dass man ImageIcon einen ActionListener hinzufügen kann ;-)
Mal abgesehen davon sind zwei ImageIcons mit dem selben Bild nicht unbedingt gleich.

Man muss einfach nur die Referenz der ImageIcons die man auf die Buttons setzt in einem zweiten Array halten. Die zweite Schleife ist - abgesehen davon, dass falsch und nicht ausführbar - völlig überflüssig.
 

ChrisKu

Bekanntes Mitglied
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

Code:
loesung[i] = button[i].getIcon();

Die zweite for Schleife kannst Du streichen.

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

HansK

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

Java:
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 ;))
 

ChrisKu

Bekanntes Mitglied
Code:
(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

Bekanntes Mitglied
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.
 

ChrisKu

Bekanntes Mitglied
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:
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

Mitglied
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:
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:
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);
}
}
 

HansK

Mitglied
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

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

Code:
loesung[i] = button[i].getIcon();

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

Code:
loesung[] = new ImageIcon[17];
 

HansK

Mitglied
So,
habe jetzt loesung[] initialisiert,

Java:
        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ß
 

ChrisKu

Bekanntes Mitglied
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

Code:
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

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

Java:
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
    }
    

}

Java:
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

Bekanntes Mitglied
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

Mitglied
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
 

Anhänge

  • berg.zip
    146,8 KB · Aufrufe: 2
  • bg.zip
    146 KB · Aufrufe: 2
  • bl.zip
    191,7 KB · Aufrufe: 2
  • clk_villa1.zip
    188,5 KB · Aufrufe: 2
  • villa2.zip
    145,3 KB · Aufrufe: 2
Zuletzt bearbeitet:

ChrisKu

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

Code:
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:

Code:
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:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Puzzle - Erkennen wenn gelöst (array vergleichen) AWT, Swing, JavaFX & SWT 10
H Bilder auf Buttons per Klick tauschen ( Puzzle ) AWT, Swing, JavaFX & SWT 8
T Puzzle Klick tausch AWT, Swing, JavaFX & SWT 3
D Sortierung in der einfach-verketteten Listen AWT, Swing, JavaFX & SWT 13
S SWT In Listen den Einträgen Daten zuordnen AWT, Swing, JavaFX & SWT 2
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
E Drag&Drop zwischen 2 Listen AWT, Swing, JavaFX & SWT 5
N Listen in JTable sortieren AWT, Swing, JavaFX & SWT 3
V AWT: zwei Listen nebeneinander ohne Rand dazwischen AWT, Swing, JavaFX & SWT 7
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
C Swing ImageIcon erstellen, skalieren und verwenden AWT, Swing, JavaFX & SWT 3
T src ordner erstellen AWT, Swing, JavaFX & SWT 6
M Javafx versuch Bibliothek zu erstellen AWT, Swing, JavaFX & SWT 0
melaniemueller Confirmation Dialog erstellen AWT, Swing, JavaFX & SWT 18
izoards Outlook Mail erstellen - Signatur wird nicht angezeigt. AWT, Swing, JavaFX & SWT 3
E Putzplan erstellen AWT, Swing, JavaFX & SWT 15
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
D runnable Jar mit Javafx erstellen(Eclipse) AWT, Swing, JavaFX & SWT 10
N Kontextmenü (Popup-Fenster) erstellen AWT, Swing, JavaFX & SWT 3
L JavaFX PropertyView mit dynamischer EditCell erstellen? AWT, Swing, JavaFX & SWT 8
C Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen AWT, Swing, JavaFX & SWT 15
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
Z Random Butten erstellen ohne Container AWT, Swing, JavaFX & SWT 15
F Verzeichnis über GUI erstellen AWT, Swing, JavaFX & SWT 2
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
B JavaFX RadioButtons erstellen AWT, Swing, JavaFX & SWT 7
N Ausführbare Datei aus JavaFX Projekt erstellen AWT, Swing, JavaFX & SWT 22
A Objekt von einem Window erstellen? AWT, Swing, JavaFX & SWT 8
K Buttons dynamisch erstellen (NetBeans) AWT, Swing, JavaFX & SWT 10
ralfb1105 JavaFX TreeView dynamisch aus Datenbank Tabelle erstellen AWT, Swing, JavaFX & SWT 22
ralfb1105 JavaFX Dynamisch TableView Spalten erstellen AWT, Swing, JavaFX & SWT 4
O Basics - Anwendung erstellen mit mehreren Szenen AWT, Swing, JavaFX & SWT 1
dereki2000 LookAndFeel Individuelles LAF erstellen AWT, Swing, JavaFX & SWT 9
C SWT Breadcrumb Zeile mit entsprechenden Hyperlinks erstellen AWT, Swing, JavaFX & SWT 0
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
L Chat erstellen AWT, Swing, JavaFX & SWT 13
N "Automatisches" erstellen von jButtons AWT, Swing, JavaFX & SWT 1
K Aus 2 Arrays xy - Graph erstellen AWT, Swing, JavaFX & SWT 9
K Swing outerPanel und innerPanel erstellen AWT, Swing, JavaFX & SWT 4
N Eclipse - GUI - MacBook - Buttonsichtbarkeit beim Anlegen/Erstellen AWT, Swing, JavaFX & SWT 14
Timo_neu_in_java Buttons Erstellen AWT, Swing, JavaFX & SWT 6
P JList erstellen AWT, Swing, JavaFX & SWT 4
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
J Statistik erstellen AWT, Swing, JavaFX & SWT 3
H GUI erstellen um JUnit Tests auszuführen AWT, Swing, JavaFX & SWT 29
H JavaFX via .fxml einen abgeleiteten Button erstellen... AWT, Swing, JavaFX & SWT 4
D Swing JComboBox (DefaultComboBoxModel) überschreibt Eintrag beim erstellen AWT, Swing, JavaFX & SWT 0
Prafy Sich ändernde Farbverläufe erstellen AWT, Swing, JavaFX & SWT 4
Thallius Swing Mehrere tausend "Panels" erstellen AWT, Swing, JavaFX & SWT 3
O Swing JList beim Klicken in der GUI erstellen AWT, Swing, JavaFX & SWT 6
M JavaFX GUI-Elemente erstellen, nachdem die GUI geladen hat AWT, Swing, JavaFX & SWT 4
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
A Mit dem Scene Builder eine Collage erstellen (Bilder beziehen aus Flickr) AWT, Swing, JavaFX & SWT 1
D JavaFX build.fxbuild error beim Erstellen einer exe AWT, Swing, JavaFX & SWT 2
T JavaFX Flexible Layouts dynamisch erstellen / Design-Inspirationen AWT, Swing, JavaFX & SWT 8
J JavaFX JavaFX exe erstellen AWT, Swing, JavaFX & SWT 5
E JavaFX JavaFX - MenuItem erstellen aus dem Inhalt einer HashMap AWT, Swing, JavaFX & SWT 1
G Programm GUI erstellen AWT, Swing, JavaFX & SWT 5
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
M "(Buch-)Seiten" erstellen AWT, Swing, JavaFX & SWT 2
R AWT AWT Textfeld durch Klick auf Button erstellen? AWT, Swing, JavaFX & SWT 3
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
Z Diagramm mit jfreechart quadratisch erstellen AWT, Swing, JavaFX & SWT 1
F JButtons erstellen lassen mit unterschiedlichen Funktionen AWT, Swing, JavaFX & SWT 3
T JPanel dynamisch erstellen AWT, Swing, JavaFX & SWT 4
J Logikfehler im erstellen eines GUI AWT, Swing, JavaFX & SWT 3
A Swing Frames richtig erstellen AWT, Swing, JavaFX & SWT 3
T Wizard mit NEXT Button erstellen AWT, Swing, JavaFX & SWT 11
D gerichteten Graph erstellen AWT, Swing, JavaFX & SWT 2
D Swing Ansichtstranformationsmatrix erstellen AWT, Swing, JavaFX & SWT 0
M JavaFX MSI oder EXE aus JavaFX Projekt erstellen? AWT, Swing, JavaFX & SWT 2
R Kästchen mit Zufallsfarben erstellen AWT, Swing, JavaFX & SWT 2
A Fehler bei erstellen eines JTextFields AWT, Swing, JavaFX & SWT 2
A Fenster erstellen AWT, Swing, JavaFX & SWT 2
G Label erstellen AWT, Swing, JavaFX & SWT 6
G Blöcke erstellen AWT, Swing, JavaFX & SWT 4
K Swing Terminplaner erstellen AWT, Swing, JavaFX & SWT 7
G JavaFX Neues Fenster erstellen AWT, Swing, JavaFX & SWT 3
M Wie kann ich eine an Apple Automator angelehnte GUI erstellen? AWT, Swing, JavaFX & SWT 1
T An/aus Button erstellen AWT, Swing, JavaFX & SWT 5
A Swing Transparenten JPanel erstellen AWT, Swing, JavaFX & SWT 5
D Jahreskalender erstellen AWT, Swing, JavaFX & SWT 2
R Int aus JSpinner auslesen und Tabelle erstellen AWT, Swing, JavaFX & SWT 3
W JTable erstellen und Spalten sortieren AWT, Swing, JavaFX & SWT 2
B Erstellen eigener Combobox ("CellFactory") AWT, Swing, JavaFX & SWT 4
K Swing SwingGUI - Erstellen für Anfänger AWT, Swing, JavaFX & SWT 15
B Eigenen Look&Feel erstellen?! AWT, Swing, JavaFX & SWT 2
S Swing Kopie eines JPanels inkl. aller objekte darin erstellen AWT, Swing, JavaFX & SWT 5
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
K JSpinner in passender Breite erstellen oder automatisch anpassen AWT, Swing, JavaFX & SWT 2
B 2D-Grafik Dynamisches Erstellen von Images und deren Animation AWT, Swing, JavaFX & SWT 4
C Border in JPanel erstellen AWT, Swing, JavaFX & SWT 4
P JTabbedPane per Menuitem erstellen AWT, Swing, JavaFX & SWT 20
B Swing invokeLater nötig beim GUI erstellen? AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben