# Spiele-Menü in Java



## Nerdsenso (8. Jun 2017)

Hallo,
mein Name ist Max und ich bin neu hier im Forum. Im Ramen eines Schulprojekts habe ich ein kleines Mathematikspiel im java Editor programmiert. Zu diesem Spiel möchte ich nun ein Menü hinzufügen, um die Verschiedenen Level zu öffnen. Ich habe bereits ein kleines Menü erstellt, allerdings weiss ich nicht wie ich zu den Menüpunkten Funktionen hinzufügen kann. (Wenn ich wüsste wie es geht würde ich natürlich mehr Unterpunkte erstellen). Kann mir das evtl. jemand erklären??
Vielen Dank
Max
PS: Hier ist mein Code


```
import javax.swing.JMenu;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class Superhirn2
{
  public static void main (String[] args)
  {   
      JFrame jf = new JFrame();
      jf.setTitle("Hauptmenü");
      jf.setSize(500, 500);
      jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      jf.setVisible(true);
      JMenuBar jmb = new JMenuBar();
      jf.setJMenuBar(jmb);
    
      JMenu datei = new JMenu("Datei");
      jmb.add(datei);
    
      JMenuItem öffnen = new JMenuItem("Öffnen");
      datei.add(öffnen);
    
      new Spiel();
  }
}

class Spiel
{                                 
    int zahl1 = zufallszahl(50);
    int zahl2 = zufallszahl(50);
    int ergebnis;
    int ergebnis2;
    int punkte1 = 0;
    int punkte2 = 0;
    int runden = 0;
  
  public Spiel()
  {
     System.out.println("Willkommen bei Superhirn!");
     System.out.println("Gleich geht das Spiel los!");
     spielSteuern();
     }
 
 
  void rateEinmal()
  {
    int zahl1 = zufallszahl(50);
    int zahl2 = zufallszahl(50);
    int zahl3 = zufallszahl(50);
    int zahl4 = zufallszahl(50);
    String operator = rechensymbol();

              switch(operator)
              {
              case "+":
                ergebnis = zahl1 + zahl2;
                break;
                case "-":
                ergebnis = zahl1 - zahl2;
                break;
                case "*":
                ergebnis = zahl1 * zahl2;
                break;
                case "/":
                ergebnis = zahl1 / zahl2;
                break;
                default:
                break;
                }
  
    System.out.println("\n3...");
    warten(500);
    System.out.println("2...");
    warten(500);
    System.out.println("1...");
    warten(500);
    System.out.println("Wie viel ist " + zahl1 + operator + zahl2 + "?");
    if (leseZahl() == ergebnis) {
      System.out.println("Richtig!" );
         punktzahl();
    }
    else {
       System.out.println("Falsch! Das Ergebnis war " + ergebnis );
       System.out.println("GAME OVER!");
    }
  }
 
  void spielSteuern()
  { do {
      runden++;
      System.out.println("Runde " + runden);
      eineRundeSpielen();
      } while (runden < 5);
    }
  
      void zufaelligSpielen() //Rundenanzahl durch Eingabe bestimmt
      {  System.out.println("Wie viele Runden sollen gespielt werden?");
      leseZahl();
      { do {
      runden++;
      System.out.println("Runde " + runden);
      eineRundeSpielen();
      } while (runden < leseZahl() );
  
     }
        }
      
      
      void eineRundeSpielen()
      {
       int zahl1 = zufallszahl(50);
       int zahl2 = zufallszahl(50);
       int zahl3 = zufallszahl(50);
       int zahl4 = zufallszahl(50);
       String operator = rechensymbol();

              switch(operator)
              {
              case "+":
                ergebnis = zahl1 + zahl2;
                break;
                case "-":
                ergebnis = zahl1 - zahl2;
                break;
                case "*":
                ergebnis = zahl1 * zahl2;
                break;
                case "/":
                ergebnis = zahl1 / zahl2;
                break;
                default:
                break;
                }
                System.out.println("\n3...");
                warten(500);
                System.out.println("2...");
                warten(500);
                System.out.println("1...");
                warten(500);
                System.out.println("Spieler 1 ist dran!");
                System.out.println("Wie viel ist " + zahl1 + operator + zahl2 + "?");
                if (leseZahl() == ergebnis) {
                System.out.println("Richtig!" );
                punktzahl();
      
        }
        switch(operator)
              {
              case "+":
                ergebnis2 = zahl3 + zahl4;
                break;
                case "-":
                ergebnis2 = zahl3 - zahl4;
                break;
                case "*":
                ergebnis2 = zahl3 * zahl4;
                break;
                case "/":
                ergebnis2 = zahl3 / zahl4;
                break;
                default:
                break;
                }
                System.out.println("\n3...");
                warten(500);
                System.out.println("2...");
                warten(500);
                System.out.println("1...");
                warten(500);
        System.out.println("Spieler 2 ist dran!");
        System.out.println("Wie viel ist " + zahl3 + operator + zahl4 + "?");
        if (leseZahl() == ergebnis2) {
        System.out.println("Richtig!" );
        punktzahl2();
        
         }
       if (punkte1 < runden) {
         System.out.println("Spieler 1 hat gewonnen! Spieler 2 hatte " + punkte2 + " Punkte!");
         }else{
          System.out.println("Spieler 2 hat gewonnen! Spieler 1 hatte " + punkte1 + " Punkte!");
        
         }}
    
         void punktzahl()
         { 
            punkte1++;
            System.out.println("Die Punktzahl von Spieler 1 ist " + punkte1 ); 
            }
          
          
            void punktzahl2()
            {
             punkte2++;
             System.out.println("Die Punktzahl von Spieler 2 ist " + punkte2 );
              }
            
  private String rechensymbol()
  {
    int zeichen = zufallszahl(3);
    if(zeichen == 0){
      return "+";
      }
    else if(zeichen == 1){
      return "-";
      }
    else if(zeichen == 2){
      return "*";
      }
    else {
      return "/";
      }
  } 
  int zufallszahl(int n)
  {
    return new java.util.Random().nextInt(n);
  }

  int leseZahl()
  {
    return new java.util.Scanner(System.in).nextInt();
  }
  void warten(int n)
  {
    long t0, t1;
    t0 = System.currentTimeMillis();
    do
    {
      t1 = System.currentTimeMillis();
    }
    while (t1 - t0 < n);
  }
  
}
```


----------



## Robat (8. Jun 2017)

Schau mal nach `JMenuItem` in Verbindung mit einem `ActionListener`


----------



## Nerdsenso (9. Jun 2017)

Danke dir..ich habe nun einen ActionListener hinzu gefügt, allerdings kommt bei mir noch ein Cannot find symbol Error wenn ich eine Aktion ausführen will. Woran kann das liegen??
Hier ist mein neuer Code
import javax.swing.JMenu;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Superhirn2 
{
  public static void spiel (String[] args)
  {
    new Spiel();
    }
  public static void menu (String[] args)
  {  

     JFrame jf = new JFrame();
      jf.setTitle("Hauptmenü");
      jf.setSize(500, 500);
      jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      jf.setVisible(true);
      JMenuBar jmb = new JMenuBar();
      jf.setJMenuBar(jmb);

      JMenu datei = new JMenu("Datei");
      jmb.add(datei);

      JMenuItem öffnen = new JMenuItem("Öffnen");
      datei.add(öffnen);
      öffnen.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ev){
          rateEinmal();
          }

  }); 

} }

 class Spiel
{                                  
    int zahl1 = zufallszahl(50);
    int zahl2 = zufallszahl(50);
    int ergebnis;
    int ergebnis2; 
    int punkte1 = 0;
    int punkte2 = 0;
    int runden = 0;

  public Spiel() 
  {

     System.out.println("Willkommen bei Superhirn!"); 
     System.out.println("Gleich geht das Spiel los!"); 
     zufaelligSpielen();
     }


  public void rateEinmal()
  {
    int zahl1 = zufallszahl(50);
    int zahl2 = zufallszahl(50);
    int zahl3 = zufallszahl(50);
    int zahl4 = zufallszahl(50);
    String operator = rechensymbol();

              switch(operator)
              {
              case "+":
                ergebnis = zahl1 + zahl2;
                break;
                case "-":
                ergebnis = zahl1 - zahl2;
                break;
                case "*":
                ergebnis = zahl1 * zahl2;
                break;
                case "/":
                ergebnis = zahl1 / zahl2;
                break;
                default:
                break;
                }

    System.out.println("\n3...");
    warten(500);
    System.out.println("2...");
    warten(500);
    System.out.println("1...");
    warten(500);
    System.out.println("Wie viel ist " + zahl1 + operator + zahl2 + "?");
    if (leseZahl() == ergebnis) {
      System.out.println("Richtig!" );
         punktzahl();
    } 
    else {
       System.out.println("Falsch! Das Ergebnis war " + ergebnis );
       System.out.println("GAME OVER!");
    } 
  }

  void spielSteuern()
  { do {
      runden++;
      System.out.println("Runde " + runden);
      eineRundeSpielen();
      } while (runden < 5); 
    }

      void zufaelligSpielen() //Rundenanzahl durch Eingabe bestimmt
      {  System.out.println("Wie viele Runden sollen gespielt werden?");
      leseZahl();
      { do {
      runden++;
      System.out.println("Runde " + runden);
      eineRundeSpielen();
      } while (runden < leseZahl() ); 

     } 
        }


      void eineRundeSpielen()
      {
       int zahl1 = zufallszahl(50);
       int zahl2 = zufallszahl(50);
       int zahl3 = zufallszahl(50);
       int zahl4 = zufallszahl(50);
       String operator = rechensymbol();

              switch(operator)
              {
              case "+":
                ergebnis = zahl1 + zahl2;
                break;
                case "-":
                ergebnis = zahl1 - zahl2;
                break;
                case "*":
                ergebnis = zahl1 * zahl2;
                break;
                case "/":
                ergebnis = zahl1 / zahl2;
                break;
                default:
                break;
                }
                System.out.println("\n3...");
                warten(500);
                System.out.println("2...");
                warten(500);
                System.out.println("1...");
                warten(500);
                System.out.println("Spieler 1 ist dran!");
                System.out.println("Wie viel ist " + zahl1 + operator + zahl2 + "?");
                if (leseZahl() == ergebnis) {
                System.out.println("Richtig!" );
                punktzahl();

        } 
        switch(operator)
              {
              case "+":
                ergebnis2 = zahl3 + zahl4;
                break;
                case "-":
                ergebnis2 = zahl3 - zahl4;
                break;
                case "*":
                ergebnis2 = zahl3 * zahl4;
                break;
                case "/":
                ergebnis2 = zahl3 / zahl4;
                break;
                default:
                break;
                }
                System.out.println("\n3...");
                warten(500);
                System.out.println("2...");
                warten(500);
                System.out.println("1...");
                warten(500);
        System.out.println("Spieler 2 ist dran!");
        System.out.println("Wie viel ist " + zahl3 + operator + zahl4 + "?");
        if (leseZahl() == ergebnis2) {
        System.out.println("Richtig!" );
        punktzahl2();

         }
       if (punkte1 < runden) {
         System.out.println("Spieler 1 hat gewonnen! Spieler 2 hatte " + punkte2 + " Punkte!"); 
         }else{
          System.out.println("Spieler 2 hat gewonnen! Spieler 1 hatte " + punkte1 + " Punkte!"); 

         }}

         void punktzahl()
         {  
            punkte1++;
            System.out.println("Die Punktzahl von Spieler 1 ist " + punkte1 );  
            }


            void punktzahl2()
            {
             punkte2++;
             System.out.println("Die Punktzahl von Spieler 2 ist " + punkte2 );
              }

  private String rechensymbol()
  {
    int zeichen = zufallszahl(3);
    if(zeichen == 0){
      return "+";
      }
    else if(zeichen == 1){
      return "-";
      }
    else if(zeichen == 2){
      return "*";
      }
    else {
      return "/";
      }
  }  
  int zufallszahl(int n)
  {
    return new java.util.Random().nextInt(n);
  }

  int leseZahl()
  {
    return new java.util.Scanner(System.in).nextInt();
  } 
  void warten(int n)
  {
    long t0, t1;
    t0 = System.currentTimeMillis();
    do
    {
      t1 = System.currentTimeMillis();
    }
    while (t1 - t0 < n);
  }

}


----------



## Robat (9. Jun 2017)

An welcher Stelle kommt der Fehler denn?
Setze deinen Code bitte immer in [code=Java]Mein code[/code] Tags und formatieren ihn entsprechend. So kann man Fehler schneller / besser finden 

Gruß Robert


----------



## Nerdsenso (11. Jun 2017)

Also das Programm an sich funktioniert...das Menü läuft auch, aber wenn ich dem ActionListener sage er soll z.B. die Funktion rateEinmal(); ausführen, gibt er aus "cannot ohl ich es ja deklariert habe.
find symbol",obwohl ich es ja deklariert habe.


```
import javax.swing.JMenu;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Superhirn2
{
public static void spiel (String[] args)
{
new Spiel();
}
public static void menu (String[] args)
{

JFrame jf = new JFrame();
jf.setTitle("Hauptmenü");
jf.setSize(500, 500);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
JMenuBar jmb = new JMenuBar();
jf.setJMenuBar(jmb);

JMenu datei = new JMenu("Datei");
jmb.add(datei);

JMenuItem öffnen = new JMenuItem("Öffnen");
datei.add(öffnen);
öffnen.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ev){
rateEinmal();
}

});

} }

class Spiel
{
int zahl1 = zufallszahl(50);
int zahl2 = zufallszahl(50);
int ergebnis;
int ergebnis2;
int punkte1 = 0;
int punkte2 = 0;
int runden = 0;

public Spiel()
{

System.out.println("Willkommen bei Superhirn!");
System.out.println("Gleich geht das Spiel los!");
zufaelligSpielen();
}


public void rateEinmal()
{
int zahl1 = zufallszahl(50);
int zahl2 = zufallszahl(50);
int zahl3 = zufallszahl(50);
int zahl4 = zufallszahl(50);
String operator = rechensymbol();

switch(operator)
{
case "+":
ergebnis = zahl1 + zahl2;
break;
case "-":
ergebnis = zahl1 - zahl2;
break;
case "*":
ergebnis = zahl1 * zahl2;
break;
case "/":
ergebnis = zahl1 / zahl2;
break;
default:
break;
}

System.out.println("\n3...");
warten(500);
System.out.println("2...");
warten(500);
System.out.println("1...");
warten(500);
System.out.println("Wie viel ist " + zahl1 + operator + zahl2 + "?");
if (leseZahl() == ergebnis) {
System.out.println("Richtig!" );
punktzahl();
}
else {
System.out.println("Falsch! Das Ergebnis war " + ergebnis );
System.out.println("GAME OVER!");
}
}

void spielSteuern()
{ do {
runden++;
System.out.println("Runde " + runden);
eineRundeSpielen();
} while (runden < 5);
}

void zufaelligSpielen() //Rundenanzahl durch Eingabe bestimmt
{ System.out.println("Wie viele Runden sollen gespielt werden?");
leseZahl();
{ do {
runden++;
System.out.println("Runde " + runden);
eineRundeSpielen();
} while (runden < leseZahl() );

}
}


void eineRundeSpielen()
{
int zahl1 = zufallszahl(50);
int zahl2 = zufallszahl(50);
int zahl3 = zufallszahl(50);
int zahl4 = zufallszahl(50);
String operator = rechensymbol();

switch(operator)
{
case "+":
ergebnis = zahl1 + zahl2;
break;
case "-":
ergebnis = zahl1 - zahl2;
break;
case "*":
ergebnis = zahl1 * zahl2;
break;
case "/":
ergebnis = zahl1 / zahl2;
break;
default:
break;
}
System.out.println("\n3...");
warten(500);
System.out.println("2...");
warten(500);
System.out.println("1...");
warten(500);
System.out.println("Spieler 1 ist dran!");
System.out.println("Wie viel ist " + zahl1 + operator + zahl2 + "?");
if (leseZahl() == ergebnis) {
System.out.println("Richtig!" );
punktzahl();

}
switch(operator)
{
case "+":
ergebnis2 = zahl3 + zahl4;
break;
case "-":
ergebnis2 = zahl3 - zahl4;
break;
case "*":
ergebnis2 = zahl3 * zahl4;
break;
case "/":
ergebnis2 = zahl3 / zahl4;
break;
default:
break;
}
System.out.println("\n3...");
warten(500);
System.out.println("2...");
warten(500);
System.out.println("1...");
warten(500);
System.out.println("Spieler 2 ist dran!");
System.out.println("Wie viel ist " + zahl3 + operator + zahl4 + "?");
if (leseZahl() == ergebnis2) {
System.out.println("Richtig!" );
punktzahl2();

}
if (punkte1 < runden) {
System.out.println("Spieler 1 hat gewonnen! Spieler 2 hatte " + punkte2 + " Punkte!");
}else{
System.out.println("Spieler 2 hat gewonnen! Spieler 1 hatte " + punkte1 + " Punkte!");

}}

void punktzahl()
{
punkte1++;
System.out.println("Die Punktzahl von Spieler 1 ist " + punkte1 );
}


void punktzahl2()
{
punkte2++;
System.out.println("Die Punktzahl von Spieler 2 ist " + punkte2 );
}

private String rechensymbol()
{
int zeichen = zufallszahl(3);
if(zeichen == 0){
return "+";
}
else if(zeichen == 1){
return "-";
}
else if(zeichen == 2){
return "*";
}
else {
return "/";
}
}
int zufallszahl(int n)
{
return new java.util.Random().nextInt(n);
}

int leseZahl()
{
return new java.util.Scanner(System.in).nextInt();
}
void warten(int n)
{
long t0, t1;
t0 = System.currentTimeMillis();
do
{
t1 = System.currentTimeMillis();
}
while (t1 - t0 < n);
}

}
```


----------



## Robat (11. Jun 2017)

Nerdsenso hat gesagt.:


> obwohl ich es ja deklariert habe.


Ja aber in einer anderen (inneren) Klasse. Du kannst die Methode nur über eine Instanz der `Spiel` Klasse aufrufen


----------



## Nerdsenso (11. Jun 2017)

Danke dir
Würde das gerne mal ausprobieren, aber es ist ein neues Problem aufgetreten, ohne dass ich bewusst etwas verändert habe. Und zwar öffnet sich nichtmehr das CMD Fenster wenn ich das Programm starte...woran kann das liegen??
Kannst du mir ansonsten eine Beispiellösung geben wie ich das machen kann??  Ich weiss leider nicht genau was ich machen muss, bin noch neu in Java
Vielen Dank
Max


----------



## Robat (11. Jun 2017)

Nerdsenso hat gesagt.:


> Und zwar öffnet sich nichtmehr das CMD Fenster wenn ich das Programm starte...woran kann das liegen??


Gibts verschiedene Gründe aber ohne weiter Informationen lässt sich das schwer herausfinden. Gibt es denn eine Exception? Compiliert / startet er überhaupt?
Hast du eventuell die `public static void main(String[] args)` Methode aus deinem Programm heraus genommen? (Dann müsste es zmd einen Fehler geben)

Was genau verstehst du denn an den oben genannten nicht?
Kurzes Minimalbeispiel. Sei `foo()` eine Methode in der inneren Klasse `Foo`. `Foo` liegt in der Klasse `Starter` (mit einer gleichnamigen Methode) und wir wollen die Methode aus der inneren Klasse `Foo` in der `Starter` Klasse aufrufen. Dann müssen wir eine neue Instanz von `Foo` erzeugen und darüber die Methode `foo()` aufrufen:


```
public class Starter
{
      public static void main(String[] args)
      {
           Starter starter = new Starter();
           starter.starter();
      }

      public void starter()
      {
            Foo foo = new Foo(); 
            foo.foo();
      }

  
     class Foo
     {
            public void foo() 
            {
                  System.out.println("foo() aus der inneren Klasse [Foo]");
            }
     }
}
```


----------



## Nerdsenso (11. Jun 2017)

Hmmm...
aber ich habe ja die `public class Superhirn` und die `class Spiel`. Soll ich jetzt die `class Spiel` in die `public class Superhirn` reinpacken?? Sorry wenn ich dir was doof vorkomme, aber bin noch komplett neu in Java und konnte mich über das Thema wegen mangelnder Informationen wenig belesen


----------



## JuKu (14. Jun 2017)

Trat eine Exception auf?
Wenn ja, musst du uns diese geben, sonst können wir dir nur schwer helfen.
Was genau passiert, wenn du auf das Menü klickst?


----------

