Skip to content
Advertisement

How I can make my program generate a new random number?

So I tried closing the window and reopening it afterwards so the whole program would start from the beginning. That didn’t work. Neither does Revalidating the frame (f.revalidate(), f.repaint()).. I’ve tried looping the if-functions with a while loop, setting the boolean to false when the number has been guessed. But that just resulted in an endless loop of testing if the number is correct, because the loop is activated as the button is clicked.

import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.ActionEvent;
import java.util.Random;
    
    public class Zahlenraten{
        static int i = 0;
        //static boolean w = true;
        //static boolean s = true;
        static int wert;
       // static int Zahl1;
        public static void main(String[] args) {
            
            JFrame f = new JFrame("Zahlenraten");
            f.setSize(500,500);
            //f.setLayout(null);
            
            JTextField t = new JTextField("");
            t.setBounds(95,10,150,30);
            f.addWindowFocusListener(new WindowAdapter() {
             
                public void windowGainedFocus(WindowEvent e) {
                    t.requestFocusInWindow();
                }
            });
            
            
            JButton e = new JButton("Exit");
            e.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                System.exit(0);
                }
            });
            e.setBounds(300, 100, 100, 30);
            
            JLabel txt = new JLabel("Zahl eingeben:");
            txt.setBounds(10,10,150,30);
            
            Random r = new Random();
            int Zahl = r.nextInt(100-0+1);
            
            JButton b = new JButton("Prüfen");
            f.getRootPane().setDefaultButton(b);//Enter Key = button b
            b.addActionListener(evt -> {//statt evt könnte man natürlich auch actionPerformed... nehmen. 

                i++;
                
               /* while(w) {*/
                    
                
               /* while(s) {*///Problem: wert wird endlos getestet, Möglichkeit: Fehler bei Eingabe von String trien und catchen aber wie ??
                    String str = t.getText();
                    wert = Integer.parseInt(str);
                    t.setText("");
                
                if(wert > Zahl) {
                    System.out.println("Der gesuchte Wert ist kleiner.");
                }
                if(wert < Zahl) {
                    System.out.println("Der gesuchte Wert ist größer.");
                }
                if(wert == Zahl) {
                    System.out.println("Der gesuchte Wert wurde gefunden! Du hast "+i+" Versuche gebraucht.");
                    int dialogResult = JOptionPane.showConfirmDialog(null, "Wollen Sie eine neue Runde starten?", "Frage", JOptionPane.YES_NO_OPTION);
                    if (dialogResult == 0) {
                        
                    }else {
                        //w = false;
                        System.exit(0);
                    }
                    //s = false;
                }
                
               // }
                  
                 
          //  }
           });
            
            
            
            
            b.setBounds(10,100,100,30);
            
            JPanel p = new JPanel();
            p.setLayout(null);
            p.add(b);
            p.add(e);
            p.add(t);
            p.add(txt);
            f.add(p);
            f.setVisible(true);
            
        }
    }

Thanks in advance!

Advertisement

Answer

Once the user finds the right number, all you need to do is to set a new value to your random number (Zahl) if the user wishes to continue:

if (dialogResult == 0) {
   Zahl.set(r.nextInt(100 - 0 + 1));
}

Note that it’s inside a lambda function, so an option is to switch the int variable to an AtomicInteger. This way you can update it.

import java.util.concurrent.atomic.AtomicInteger;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.ActionEvent;
import java.util.Random;
    
    public class Zahlenraten{
        static int i = 0;
        //static boolean w = true;
        //static boolean s = true;
        static int wert;
       // static int Zahl1;
        public static void main(String[] args) {
            
            JFrame f = new JFrame("Zahlenraten");
            f.setSize(500,500);
            //f.setLayout(null);
            
            JTextField t = new JTextField("");
            t.setBounds(95,10,150,30);
            f.addWindowFocusListener(new WindowAdapter() {
             
                public void windowGainedFocus(WindowEvent e) {
                    t.requestFocusInWindow();
                }
            });
            
            
            JButton e = new JButton("Exit");
            e.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                System.exit(0);
                }
            });
            e.setBounds(300, 100, 100, 30);
            
            JLabel txt = new JLabel("Zahl eingeben:");
            txt.setBounds(10,10,150,30);
            
            Random r = new Random();
            AtomicInteger Zahl = new AtomicInteger(r.nextInt(100 - 0 + 1));
            
            JButton b = new JButton("Prüfen");
            f.getRootPane().setDefaultButton(b);//Enter Key = button b
            b.addActionListener(evt -> {//statt evt könnte man natürlich auch actionPerformed... nehmen. 

                i++;
                
               /* while(w) {*/
                    
                
               /* while(s) {*///Problem: wert wird endlos getestet, Möglichkeit: Fehler bei Eingabe von String trien und catchen aber wie ??
                    String str = t.getText();
                    wert = Integer.parseInt(str);
                    t.setText("");
                
                if(wert > Zahl.get()) {
                    System.out.println("Der gesuchte Wert ist kleiner.");
                }
                if(wert < Zahl.get()) {
                    System.out.println("Der gesuchte Wert ist größer.");
                }
                if(wert == Zahl.get()) {
                    System.out.println("Der gesuchte Wert wurde gefunden! Du hast "+i+" Versuche gebraucht.");
                    int dialogResult = JOptionPane.showConfirmDialog(null, "Wollen Sie eine neue Runde starten?", "Frage", JOptionPane.YES_NO_OPTION);
                    if (dialogResult == 0) {
                      Zahl.set(r.nextInt(100 - 0 + 1));
                    }else {
                        //w = false;
                        System.exit(0);
                    }
                    //s = false;
                }
                
               // }
                  
                 
          //  }
           });
            
            
            
            
            b.setBounds(10,100,100,30);
            
            JPanel p = new JPanel();
            p.setLayout(null);
            p.add(b);
            p.add(e);
            p.add(t);
            p.add(txt);
            f.add(p);
            f.setVisible(true);
            
        }
    }
8 People found this is helpful
Advertisement