Buttons (auf denen bilder sind) random vertauschen

theoneand

Aktives Mitglied
hallo,
in unserem neuen uni-projekt ham wir uns entschieden ein puzzle-spiel zu machen.
wir hängen leider nun an einer stelle und zwar haben wir ein gridlayout erstellt (3x3)
und 9 buttons erzeugt, dann ein beliebiges bild in 9 teile aufgeteilt und den einzelnen buttons
zugewiesen.

jetzt meine frage: a) wie können wir machen, dass die 9 buttons sich nach starten des spieles
die vertauschen?
und b) wie kann man es einrichten dass man die bilder praktisch anklickt und auf
ein anderes klickt und beide die plätze tauschen?

hier mal unser bisheriges coding:

Java:
import java.lang.String;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.*;
import java.applet.Applet;
import javax.swing.JFrame;
import java.awt.Container;

public class MenuExample extends JFrame {

  // Anfang Attribute
  // Ende Attribute


  public MenuExample() {
    super("GAME");   // Fenstertitel an JFrame(String) übergeben
      setDefaultCloseOperation( EXIT_ON_CLOSE); // Fenster schließen = Ende

    
    
    Container contentPane = getContentPane();
    contentPane.setLayout( new GridLayout(3,3));  // Gridlayout 3x3 erzeugen
    setSize (300, 400);
    setResizable ( false ); // Fenster ist nicht veränderbar




       ImageIcon berg1 = new ImageIcon ("C:\\berg11.jpg");
       final JButton button1 = new JButton ( berg1);         // final deklariert wegen inner class aufruf bei action listener EXIT
       button1.setPreferredSize( new Dimension( 262, 196));
       add (button1);
       button1.setVisible(false);
       ImageIcon berg2 = new ImageIcon ("C:\\berg22.jpg");
       final JButton button2 = new JButton ( berg2);
       button2.setPreferredSize( new Dimension( 262, 196));
       add (button2);
       button2.setVisible(false);
       ImageIcon berg3 = new ImageIcon ("C:\\berg33.jpg");
       final JButton button3 = new JButton ( berg3);
       button3.setPreferredSize( new Dimension( 262, 196));
       add (button3);
       button3.setVisible(false);
       ImageIcon berg4 = new ImageIcon ("C:\\berg44.jpg");
       final JButton button4 = new JButton ( berg4);
       button4.setPreferredSize( new Dimension( 262, 196));
       add (button4);
       button4.setVisible(false);
       ImageIcon berg5 = new ImageIcon ("C:\\berg55.jpg");
       final JButton button5 = new JButton ( berg5);
       button5.setPreferredSize( new Dimension( 262, 196));
       add (button5);
       button5.setVisible(false);
       ImageIcon berg6 = new ImageIcon ("C:\\berg66.jpg");
       final JButton button6 = new JButton ( berg6);
       button6.setPreferredSize( new Dimension( 262, 196));
       add (button6);
       button6.setVisible(false);
       ImageIcon berg7 = new ImageIcon ("C:\\berg77.jpg");
       final JButton button7 = new JButton ( berg7);
       button7.setPreferredSize( new Dimension( 262, 196));
       add (button7);
       button7.setVisible(false);
       ImageIcon berg8 = new ImageIcon ("C:\\berg88.jpg");
       final JButton button8 = new JButton ( berg8);
       button8.setPreferredSize( new Dimension( 262, 196));
       add (button8);
       button8.setVisible(false);
       ImageIcon berg9 = new ImageIcon ("C:\\berg99.jpg");
       final JButton button9 = new JButton ( berg9);
       button9.setPreferredSize( new Dimension( 262, 196));
       add (button9);
       button9.setVisible(false);
       //JButton button9 = new JButton("9");
       //contentPane.add(new JButton("Button 9"));
       


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

    menu = new JMenu( "GAME");          // Erzeugen eines Hauptmenüpunktes
    menuBar.add( menu);                       // Hinzufügen des Hauptmenüpunktes
    submenu = new JMenu( "New Game");         // Erzeugen eines Sub-  bzw Untermenüs von Puzzle Pro
    menu.add( submenu);                       // Hinzufügen des Submenüpunktes
    menuItem = new JMenuItem( "Bild 1");      // Erzeugen eines Untermenüs von New Game
    submenu.add( menuItem);                   // Untermenü wird dem Submenü hinzugefügt
    menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
        button1.setVisible(true);
        button2.setVisible(true);
        button3.setVisible(true);
        button4.setVisible(true);
        button5.setVisible(true);
        button6.setVisible(true);
        button7.setVisible(true);
        button8.setVisible(true);
        button9.setVisible(true);
      }
    });
    menuItem = new JMenuItem( "Bild 2");      // Erzeugen eines Untermenüs von New Game
    submenu.add( menuItem);                   // Untermenü wird dem Submenü hinzugefügt
    menuItem = new JMenuItem( "Bild 3");      // Erzeugen eines Untermenüs von New Game
    submenu.add( menuItem);                   // Untermenü wird dem Submenü hinzugefügt
    
    menuItem = new JMenuItem( "Reset"); // Erzeugen eines Untermenüs von Puzzle Pro
    menu.add(menuItem);
        menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
        button1.setVisible(false);
        button2.setVisible(false);
        button3.setVisible(false);
        button4.setVisible(false);
        button5.setVisible(false);
        button6.setVisible(false);
        button7.setVisible(false);
        button8.setVisible(false);
        button9.setVisible(false);
      }
    });                       // Untermenü wird dem Hauptmenü hinzugefügt
    menuItem = new JMenuItem( "Bestenliste"); // Erzeugen eines Untermenüs von Puzzle Pro
    menu.add(menuItem);                       // Untermenü wird dem Hauptmenü hinzugefügt
    menuItem = new JMenuItem( "Exit");        // Erzeugen eines Untermenüs von Puzzle Pro
    menu.add(menuItem);                       // Untermenü wird dem Hauptmenü hinzugefügt
    menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
        System.exit(0);                       // Durch wählen des Menupunketes "Exit" wird das Fenster beendet
      }
    });

        
    //menu.add( new JSeparator());

    menu = new JMenu( "Optionen");           // Erzeugen eines Hauptmenüpunktes
    menuBar.add( menu);                      // Hinzufügen des Hauptmenüpunktes
    submenu = new JMenu( "Schwierigkeit");   // Erzeugen eines Sub-  bzw Untermenüs von Optionen
    menu.add( submenu);                      // Hinzufügen des Submenüpunktes
    menuItem = new JMenuItem( "Leicht");     // Erzeugen eines Untermenüs von Schwierigkeit
    submenu.add( menuItem);                  // Untermenü wird dem Submenü hinzugefügt
    menuItem = new JMenuItem( "Mittel");     // Erzeugen eines Untermenüs von Schwierigkeit
    submenu.add( menuItem);                  // Untermenü wird dem Submenü hinzugefügt
    menuItem = new JMenuItem( "Schwer");     // Erzeugen eines Untermenüs von Schwierigkeit
    submenu.add( menuItem);                  // Untermenü wird dem Submenü hinzugefügt
    menuItem = new JMenuItem( "Pause/Zeit stoppen"); // Erzeugen eines Untermenüs von Optionen
    menu.add(menuItem);                              // Untermenü wird dem Hauptmenü hinzugefügt
    menu = new JMenu("Hier soll die Zeit herunterlaufen"); // Erzeugen eines Hauptmenüpunktes
    menuBar.add(menu);                                     // Hinzufügen eines Hauptmenüpunktes
   // JLabel label = new JLabel("Timer");
   // label.add(menu);
    
    setJMenuBar( menuBar);                  // Erzeugen der kompletten Menüleiste
    setSize( 800, 600);                     // Größe der Menüleiste festlegen

    
    /* menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
        System.out.println( "Wird geöffnet!");
      }
    });
    */


    // Anfang Komponenten
    // Ende Komponenten
  }

  // Anfang Methoden


  public static void main( String[] args) {
    new MenuExample().setVisible( true);    // main() endet, Programm läuft weiter
  }
  // Ende Methoden
}
 
Du solltest unbedingt mit Arrays oder Listen arbeiten, anstatt 9 Buttons einzeln immer anzusteuern!
Wenn du all deine Bildteile in einer Liste, kannst du vor dem Setzen dieser einfach noch [c]Collections.shuffle(deineListe)[/c] aufrufen.
 
Ich würde mir das einfacher machen. Schribt in zwei drei oder von mir aus auch vier arrays ne belegung der buttons mit den bildern. So habt ihr mehrere startbelegungen. Randomisiert wird das schwer, weil ihr immer ein randomarray von 0-8 braucht. Das ist zwar möglich aber aufwendig.


Wenn ihr die belegung habt, lasst ihr euch nen Random-Integer zwischen 0 und der anzahl eurer arrays ausgeben. So habt ihr ne zufällige auswahl der belegung.

Danach setzt ihr die belegung einfach ein, Ihr habt nen array mit den strings eurer bilder (die zufällige belegung mit bild 0-8) das ihr durchlaufen könnt:



Java:
JButton[] arrayMitButtons = new JButton[9];

for(int i=0; i<bilder.lemght; i++){

arrayMitButtons[i]= new JButton(bilder[i])

}

Das tauschen würde ich mit zwischenspeichern machen. Könnt euch ja mal gedanken zu dem ansatz machen.

HTH

WhiTeY
 
...auch sonst ist es nicht ein solch grosser Aufwand, wie du es im vorherigen Post beschreibst 😉
Java:
public static <T> void shuffle(T[] array) {
    List<T> list = new ArrayList<T>(Arrays.asList(array));
    for (int i = 0; i < array.length; i++) {
        array[i] = list.remove((int) (Math.random() * list.size()));
    }
}
 
Zuletzt bearbeitet:
danke erst mal an alle für die schnellen antworten!!
werde das mit dem array und der schleife mal ausprobieren,
melde mich dann die tage noch mal

echt top hier, hätte nich mit so kompetenten und schnellen
antworten gerechnet!!!
weiter so ;D
 
Ich würde mir das einfacher machen. Schribt in zwei drei oder von mir aus auch vier arrays ne belegung der buttons mit den bildern. So habt ihr mehrere startbelegungen. Randomisiert wird das schwer, weil ihr immer ein randomarray von 0-8 braucht. Das ist zwar möglich aber aufwendig.


Wenn ihr die belegung habt, lasst ihr euch nen Random-Integer zwischen 0 und der anzahl eurer arrays ausgeben. So habt ihr ne zufällige auswahl der belegung.

Danach setzt ihr die belegung einfach ein, Ihr habt nen array mit den strings eurer bilder (die zufällige belegung mit bild 0-8) das ihr durchlaufen könnt:



Java:
JButton[] arrayMitButtons = new JButton[9];

for(int i=0; i<bilder.lemght; i++){

arrayMitButtons[i]= new JButton(bilder[i])

}

Das tauschen würde ich mit zwischenspeichern machen. Könnt euch ja mal gedanken zu dem ansatz machen.

HTH

WhiTeY

klingt eingentlich ganz logisch so, nur wie verknüpfe ich den pfad mit den einzelnen bildern in die schleifen rein?? wenn ich ihn einfach reinschreibe so wie ich es bei der einzelerzeugung gemacht habe kommt immer ne fehlermeldung.
hab ich was übersehen :d??
 
Java:
for (int i = 0; i < bilder.length; i++) {
    ...
    String index = String.valueOf(i);
    bilder[i] = new ImageIcon ("C:\\berg"+ index + index + ".jpg");
    ...
}
 
Java:
JButton[] arrayMitButtons = new JButton[9];
 
for(int i=0; i<bilder.lemght; i++){
 
arrayMitButtons[i]= new JButton(bilder[i])
 
}


Java:
for (int i = 0; i < bilder.length; i++) {
    ...
    String index = String.valueOf(i);
    bilder[i] = new ImageIcon ("C:\\berg"+ index + index + ".jpg");
    ...
}



Ich blick jetzt gar nix mehr, muss ich jetzt die 2 sachen von dir zusammenfügen oder wie soll das gehen?? ich möchte gerne diese 9 buttons erzeugen und diesen buttons die bilder zuweisen, sry wir ham mit GUI erst angefangen, is noch totales neuland für mich.

trotzdem schon mal danke

mfg
 
Ich bin auf Grund der vorherigen Posts davon ausgegangen, dass du die Bilder zuerst in einem [c]ImageIcon[] bilder[/c] speichern willst. Wenn dir das aber egal ist, kannst du natürlich auch gleich die Buttons erstellen:
Java:
JButton[] arrayMitButtons = new JButton[9];
for (int i = 0; i < arrayMitButtons.length; i++) {
    String index = String.valueOf(i);
    ImageIcon image = new ImageIcon("C:\\berg" + index + index + ".jpg");
    arrayMitButtons[i] = new JButton(image);
}
 
Ich bin auf Grund der vorherigen Posts davon ausgegangen, dass du die Bilder zuerst in einem [c]ImageIcon[] bilder[/c] speichern willst. Wenn dir das aber egal ist, kannst du natürlich auch gleich die Buttons erstellen:
Java:
JButton[] arrayMitButtons = new JButton[9];
for (int i = 0; i < arrayMitButtons.length; i++) {
    String index = String.valueOf(i);
    ImageIcon image = new ImageIcon("C:\\berg" + index + index + ".jpg");
    arrayMitButtons[i] = new JButton(image);
}

ok, wenn ichs jetzt ausführe kommt zumindest kein fehler, aber es wird auch nichts erzeugt, zumindest keine buttons/ bilder.
was bedeutet denn die 3. zeile bei dir:
String index = String.valueOf(i);
und was hat es mit dem index in der Zeile
C:\\berg" + index + index + ".jpg auf sich?

Sry, hab echt keinen plan davon^^ und danke für deine geduld

kann es sein dass ich sowas noch dazufügen muss damit die buttons angezeigt werden?
Java:
    menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
        button1.setVisible(true);
        button2.setVisible(true);
        button3.setVisible(true);
        button4.setVisible(true);
        button5.setVisible(true);
        button6.setVisible(true);
        button7.setVisible(true);
        button8.setVisible(true);
        button9.setVisible(true);
      }
    });

das hatten wir zumindest in dem coding, indem ich die buttons einzeln erzeugt hatte.
 
Zuletzt bearbeitet:
was bedeutet denn die 3. zeile bei dir:
String index = String.valueOf(i);
Kannst du in der API nachschlagen: String (Java Platform SE 6)

und was hat es mit dem index in der Zeile
C:\\berg" + index + index + ".jpg auf sich?
Ich hab am Schluss einfach einen String, welcher aus den oben genannten 4 "Komponenten" zusammengesetzt ist. Also z.B. "C:\berg22.jpg" -> so wie es du am Anfang hardcoded hast.

kann es sein dass ich sowas noch dazufügen muss damit die buttons angezeigt werden?
Du musst da natürlich auch wieder eine Schleife um all die Buttons machen? Kannst sogar eine foreach Schleife verwenden, da du den Index nicht benötigst. The For-Each Loop
 

Neue Themen


Zurück
Oben