# Benutzer muss Zahl des Computers erraten



## Tacofan (30. Nov 2015)

Servus,

ich habe von der Schule auf bekommen, das der Computer eine Zahl sozusagen sich ausdenkt und der Benutzer muss die Zahl erraten.
Das heißt der Benutzer legt als erstes die Schrittweite aus in welchen Zahlenbereich der Computer sich eine Zahl ausdenken darf.
Danach sollte man auf Los klicken und beginnen.
Man sollte bei "deine Zahl" die zahl rein schreiben wo man sich denkt.
Der Computer sollte je nachdem sagen ob die gedachte Zahl kleiner,größer oder richtig ist (new label1).

(Also Zusatzaufgabe haben wir bekommen das man Versuche hat sprich bei Leicht unendlich,bei Mittel 15 z.B. und bei Schwer nur 3. Das heißt wenn man jedes mal eine Falsche Zahl hat einen Versuch weniger abgezogen bekommt und man am Ende sozusagen "GAME OVER" ist...)

Leider hatten wir das noch nicht in keiner weiße in Unterricht.
Und wüsste auch nicht wie ich die Fachklasse schreiben sollte :/


Im Internet habe ich was dazu gefunden aber wüsste nicht wie ich in die Fachklasse das hier rein schreiben sollte
	
	
	
	





```
int mZufallszahl=(int)((Math.random()*6)+1);
```

vielleicht ist ja jemand so nett und hilft mit auf die sprünge :/

Habe schon etwas Code:

Hautklasse

```
package paket_Zufallszahlen;

import java.awt.BorderLayout;

public class Hauptfenster extends JFrame
{
    Zufallszahlen zufall1;
    private JPanel contentPane;
    private JTextField tfVon;
    private JTextField tfBis;
    private JTextField tfZahl;
    private JButton btLos;
    private JButton btHilfe;
    private JButton btAufgeben;
    private JButton btSchwer;
    private JButton btLeicht;
    private JButton btMittel;
    private JLabel lbSchrittweite;
    private JLabel lbAnzahl;

    /**
     * Launch the application.
     */
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    Hauptfenster frame = new Hauptfenster();
                    frame.setVisible(true);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Hauptfenster()
    {
        zufall1 = new Zufallszahlen();
        setTitle("Zufallszahlen");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBackground(new Color(255, 240, 245));
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
      
        tfVon = new JTextField();
        tfVon.setBounds(98, 21, 86, 20);
        contentPane.add(tfVon);
        tfVon.setColumns(10);
      
        tfBis = new JTextField();
        tfBis.setBounds(268, 21, 86, 20);
        contentPane.add(tfBis);
        tfBis.setColumns(10);
      
        JLabel lbErgebnis = new JLabel("New label2");
        lbErgebnis.setBounds(187, 115, 75, 20);
        contentPane.add(lbErgebnis);
      
        btLeicht = new JButton("Leicht");
        btLeicht.setBounds(335, 95, 89, 23);
        contentPane.add(btLeicht);
      
        btMittel = new JButton("Mittel");
        btMittel.setBounds(335, 146, 89, 23);
        contentPane.add(btMittel);
      
        btSchwer = new JButton("Schwer");
        btSchwer.setBounds(335, 180, 89, 23);
        contentPane.add(btSchwer);
      
        btAufgeben = new JButton("Aufgeben");
        btAufgeben.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                //btAufgeben
                tfVon.setText("");
                tfBis.setText("");
                //lbErgebnis.setText("");
                System.exit(0);
              
            }
        });
        btAufgeben.setBounds(335, 229, 89, 23);
        contentPane.add(btAufgeben);
      
        btLos = new JButton("Los");
        btLos.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                //btLos
                int mZufallszahl;
                mZufallszahl=0;
                try
                {
                    mZufallszahl=Integer.parseInt(tfVon.getText());
                }
                catch(Exception error)
                {
                    JOptionPane.showMessageDialog(null, "Bitte geben Sie Zahlen ein!");
                    tfVon.setText("");
                    tfBis.setText("");
                    tfVon.requestFocus();
                }
            }
        });
        btLos.setBounds(33, 229, 89, 23);
        contentPane.add(btLos);
      
        JLabel lbVon = new JLabel("Von");
        lbVon.setBounds(10, 24, 46, 14);
        contentPane.add(lbVon);
      
        JLabel lbBis = new JLabel("bis");
        lbBis.setBounds(206, 24, 46, 14);
        contentPane.add(lbBis);
      
        btHilfe = new JButton("Hilfe");
        btHilfe.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                //btHilfe
                JOptionPane.showMessageDialog(null, "Hier könnte eine Erklärung stehen ;) xD");
            }
        });
        btHilfe.setBounds(233, 229, 89, 23);
        contentPane.add(btHilfe);
      
        tfZahl = new JTextField();
        tfZahl.setBounds(176, 166, 86, 20);
        contentPane.add(tfZahl);
        tfZahl.setColumns(10);
      
        JLabel lbZahl = new JLabel("Deine Zahl:");
        lbZahl.setBounds(76, 169, 75, 14);
        contentPane.add(lbZahl);
      
        lbSchrittweite = new JLabel("Schrittweite");
        lbSchrittweite.setBounds(10, -1, 57, 14);
        contentPane.add(lbSchrittweite);
      
        lbAnzahl = new JLabel("Anzahl der Versuche");
        lbAnzahl.setBounds(21, 95, 130, 14);
        contentPane.add(lbAnzahl);
      
        JLabel lbVersuche = new JLabel("New label1");
        lbVersuche.setBounds(173, 99, 57, 14);
        contentPane.add(lbVersuche);
    }
}
```

Fachklasse

```
package paket_Zufallszahlen;
import java.lang.Math;


public class Zufallszahlen
{
    private int zahl;

public Zufallszahlen()
{
}
        public void setZufall(int pZahl)
        {
            int mZufallszahl=(int)((Math.random()*6)+1);
        }
}
```


----------



## Joose (30. Nov 2015)

In der Klasse "Zufallszahlen" hast du ja ein Attribut "zahl", ich nehme an diese willst du mit einer Zufallszahl belegen?


```
zahl = .....;
```
(So bekommst du aber nur eine zufällige Zahl raus, und die Klasse heißt Zufallszahl*en* etwas irreführend)


----------



## Tacofan (30. Nov 2015)

Ja, ich möchte ja eine Zufälligezahl heraus bekommen.

Aber wie mache ich das diese Zufälligezahl in nur einen bestimmen Bereich liegt also von bis.
Das heißt das ich von 1 bis 3 eingebe das die Zahl nur 1,2 oder 3 sein kann als Beispiel!! :/

Natürlich weiß man die Schrittweite nie


----------



## Saheeda (1. Dez 2015)

https://www.google.de/search?client...&ie=UTF-8&oe=UTF-8#q=java+math.random+bereich


----------



## Tacofan (1. Dez 2015)

```
package paket_Zufallszahlen;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Hauptfenster extends JFrame
{
    Zufallszahlen zufall1;
    private JPanel contentPane;
    private JTextField tfVon;
    private JTextField tfBis;
    private JTextField tfZahl;
    private JButton btLos;
    private JButton btHilfe;
    private JButton btAufgeben;
    private JButton btSchwer;
    private JButton btLeicht;
    private JButton btMittel;
    private JLabel lbSchrittweite;
    private JLabel lbAnzahl;

    /**
     * Launch the application.
     */
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    Hauptfenster frame = new Hauptfenster();
                    frame.setVisible(true);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Hauptfenster()
    {
        zufall1 = new Zufallszahlen();
        setTitle("Zufallszahlen");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBackground(new Color(255, 240, 245));
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
    
        tfVon = new JTextField();
        tfVon.setBounds(98, 21, 86, 20);
        contentPane.add(tfVon);
        tfVon.setColumns(10);
    
        tfBis = new JTextField();
        tfBis.setBounds(268, 21, 86, 20);
        contentPane.add(tfBis);
        tfBis.setColumns(10);
    
        JLabel lbErgebnis = new JLabel("New label2");
        lbErgebnis.setBounds(176, 120, 75, 20);
        contentPane.add(lbErgebnis);
    
        btLeicht = new JButton("Leicht");
        btLeicht.setBounds(335, 95, 89, 23);
        contentPane.add(btLeicht);
    
        btMittel = new JButton("Mittel");
        btMittel.setBounds(335, 146, 89, 23);
        contentPane.add(btMittel);
    
        btSchwer = new JButton("Schwer");
        btSchwer.setBounds(335, 180, 89, 23);
        contentPane.add(btSchwer);
    
        btAufgeben = new JButton("Aufgeben");
        btAufgeben.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                //btAufgeben
                tfVon.setText("");
                tfBis.setText("");
                //lbErgebnis.setText("");
                System.exit(0);
            
            }
        });
        btAufgeben.setBounds(335, 229, 89, 23);
        contentPane.add(btAufgeben);
    
        btLos = new JButton("Los");
        btLos.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            }
        });
        btLos.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                //btLos
                int mZufallszahl;
                mZufallszahl=0;
                try
                {
                    //Zufallszahl generieren
                            //speichern
                            zufall1.setVon(Integer.parseInt(tfVon.getText()));
                            zufall1.setBis(Integer.parseInt(tfBis.getText()));
                            zufall1.setbZahl(Integer.parseInt(tfZahl.getText()));
                     
                    /*        int mVon = Integer.parseInt(tfVon.getText());
                            int mBis = Integer.parseInt(tfBis.getText());
                            */
                            int mfZufallszahl= (int)((Math.random()*4)+1);
                            //int mbZahl=0;
                            zufall1.setbZahl(Integer.parseInt(tfZahl.getText()));
                            zufall1.getbZahl();
                
                    //überprüfen ob die Zufallszahl richtig ist
                    if(mfZufallszahl==zufall1.getbZahl())
                    {
                        JOptionPane.showMessageDialog(null, "Du bisch der besche yoo!");
                        //lbErgebnis.setText("Richtig");
                        tfVon.setText("");
                        tfBis.setText("");
                    }
                    else
                    {        //Überprüfen ob die Zufallszahl kleiner ist
                            if(mfZufallszahl<zufall1.getbZahl())
                            {
                                //lbErgebnis.setText("Kleiner");
                                JOptionPane.showMessageDialog(null, "kleiner!");
                            }
                            else
                            {
                                //lbErgebnis.setText("Größer");
                                JOptionPane.showMessageDialog(null, "größer!");
                            }
                    }
                }
                catch(Exception error)
                {
                    JOptionPane.showMessageDialog(null, "Bitte geben Sie Zahlen ein!");
                    tfVon.setText("");
                    tfBis.setText("");
                    tfVon.requestFocus();
                }
            }
        });
        btLos.setBounds(33, 229, 89, 23);
        contentPane.add(btLos);
    
        JLabel lbVon = new JLabel("Von");
        lbVon.setBounds(10, 24, 46, 14);
        contentPane.add(lbVon);
    
        JLabel lbBis = new JLabel("bis");
        lbBis.setBounds(206, 24, 46, 14);
        contentPane.add(lbBis);
    
        btHilfe = new JButton("Hilfe");
        btHilfe.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                //btHilfe
                JOptionPane.showMessageDialog(null, "Hier könnte eine Erklärung stehen ;) xD");
            }
        });
        btHilfe.setBounds(233, 229, 89, 23);
        contentPane.add(btHilfe);
    
        tfZahl = new JTextField();
        tfZahl.setBounds(176, 166, 86, 20);
        contentPane.add(tfZahl);
        tfZahl.setColumns(10);
    
        JLabel lbZahl = new JLabel("Deine Zahl:");
        lbZahl.setBounds(76, 169, 75, 14);
        contentPane.add(lbZahl);
    
        lbSchrittweite = new JLabel("Schrittweite");
        lbSchrittweite.setBounds(10, -1, 57, 14);
        contentPane.add(lbSchrittweite);
    
        lbAnzahl = new JLabel("Anzahl der Versuche");
        lbAnzahl.setBounds(21, 95, 130, 14);
        contentPane.add(lbAnzahl);
    
        JLabel lbVersuche = new JLabel("New label1");
        lbVersuche.setBounds(173, 99, 57, 14);
        contentPane.add(lbVersuche);
    }
}
```


```
package paket_Zufallszahlen;
import java.lang.Math;

public class Zufallszahlen
{
    private int bis;
    private int von;
    private int bZahl;
    private int zufallszahl;

public Zufallszahlen()
{
        //generieren Zufallszahl
            Math.random();
            //int mZufallszahl=(int)((Math.random()*bis)+von);
            //int mZufallszahl=(int)((Math.random()*4)+1);
}

        public void setVon(int pVon)
        {
            von = pVon;
        }
      
        public int getVon()
        {
            return von;
        }
      
        public void setBis(int pBis)
        {
            pBis= bis;
          
        }
      
        public int getBis()
        {
            return bis;
        }
      
        public void setbZahl(int pZahl)
        {
            bZahl=pZahl;
        }
      
        public int getbZahl()
        {
            return bZahl;
        }
    /*    public int getZufallszahl()
        {
            zufallszahl=mZufallszahl;
            return mZufallszahl;
          
        }*/
}
```

Habe mal die Schrittweite die der Benutzer selber festlegen darf ausgelassen.

Jetzt zu meiner Frage. Wenn ich die GUI starte. Das Programm denkt sich eine Zahl von 1-4 aus.

Aber wenn ich z.B. die 2 eingebe kommt kleiner nehme ich jetzt die 1 kommt größer,aber 1 müsste ja das Ergebnis sein.

Kann mir jemand sagen was ich falsch habe? ._.

Das auch wirklich das Programm sagt in welche Richtung ich gehen muss


----------



## Joose (1. Dez 2015)

Jedesmal wenn du den Button "Los" drückst wird der Code vom ActionListener ausgeführt.
In diesem steht auch folgendes drinnen:

```
int mfZufallszahl= (int)((Math.random()*4)+1);
```

Dadurch erzeugst du dir jedesmal eine neue Zufallszahl.


----------



## Tacofan (1. Dez 2015)

Joose hat gesagt.:


> Jedesmal wenn du den Button "Los" drückst wird der Code vom ActionListener ausgeführt.
> In diesem steht auch folgendes drinnen:
> 
> ```
> ...


Oh man,daran habe ich nicht gedacht.

Hättest du eine Idee?
Muss ich einen neuen Button machen mit "Neues Spiel" und "Los"

Wenn ja,wie muss ich das dann jeweils machen mit Neues Spiel das er mir dort die Zufallszahl generiert und bei Los das er jeweils das überprüft


----------



## Joose (1. Dez 2015)

Genau eine Möglichkeit wäre mit Hilfe von einem Button. Sobald dieser ausgelöst wird, wird die Zufallszahl generiert und mit Hilfe eines Instanzattributs oder ähnlichen gespeichert.


----------



## Tacofan (1. Dez 2015)

Joose hat gesagt.:


> Instanzattributs oder ähnlichen gespeichert.


Könntest du mir sagen wie das gemacht wird?

Habe den Button erstellt


```
public void mouseClicked(MouseEvent e)
            {
                //btNeuesSpiel
                int mfZufallszahl= (int)((Math.random()*4)+1);
              
              
            }
```

aber wieso wird jetzt beim Button "Los"

jetzt in der IF-Anweisung gesagt das mZufallszahl not used ._.


----------



## Joose (1. Dez 2015)

Instanzvariable: Grundlagen der OOP http://www3.edumoodle.at/htlms/mod/page/view.php?id=751


----------



## Tacofan (1. Dez 2015)

Joose hat gesagt.:


> Instanzvariable: Grundlagen der OOP http://www3.edumoodle.at/htlms/mod/page/view.php?id=751


Dankeschön,aber gibt es noch eine einfachere Sache?

Gibt es irgendwie was mit setText() oder so

____


Beim Los-button


```
mfZufallszahl= zufall1.getZufallszahl();
```
beim Neues Spiel- Button


```
//btNeuesSpiel
                int mfZufallszahl= (int)((Math.random()*4)+1);
                zufall1.setZufallszahl(mfZufallszahl);
```
in der Fachklasse



```
public void setZufallszahl(int pZufallszahl)
        {
            zufallszahl=pZufallszahl;
        }
        public int getZufallszahl()
        {
    
            return zufallszahl;
        
        }
```
kannst du mir sagen was falsch ist?


Es kommt ein Hinweis das beim btLos-Button

mfZufallszahl nicht zu einer Variabel zugeordnert werden kann :/

EDIT: habe nur das int vergessen xD

Geht jetzt alles


----------



## Joose (1. Dez 2015)

Was soll da noch einfacher gehen?
Du definierst eine Instanzvariable (Klassenattribut) und sobald du den Button "Neues Spiel" drückst wird eine Zahl generiert und dieser Instanzvariable zugewiesen.
Beim Vergleich kannst du diese Instanzvariable dann einfach mit der Usereingabe vergleichen!

Keine Ahnung was es doch einfacheres geben soll mit "setText".


----------



## Tacofan (1. Dez 2015)

Verzeih mir! Bin nicht der beste in JAVA.
Ich bin dir dankbar
Habe jetzt aber noch eine letzte Frage!


```
try {
   zufall1.setVon(Integer.parseInt(tfVon.getText()));
   zufall1.setBis(Integer.parseInt(tfBis.getText()));
   int mfZufallszahl= (int)((Math.random()*(zufall1.getBis()))+(zufall1.getVon()));
   zufall1.setZufallszahl(mfZufallszahl);
   System.out.println(zufall1.getBis());
} catch(Exception error) {
   JOptionPane.showMessageDialog(null, "Bitte gib eine Schrittweite ein die Zahlen beinhaltet!");
   tfVon.setText("");
   tfBis.setText("");
   tfVon.requestFocus();
}
```

ich würde ja ganz gerne die Schrittweite selber festlegen.
Leider ist die das Ergebnis (die radom-Zahl) immer 0!
Deswegen auch das Syso...
Gebe in Textfeld z.B. bei tfVon 10 ein und bei tfBis 20 ein.
Jetzt ist aber wieder die Random-Zahl 0!
Wieso? Was ist falsch

Die Fachklasse:

```
package paket_Zufallszahlen;

import java.lang.Math;

public class Zufallszahlen
{
   private int bis;
   private int von;
   private int bZahl;
   private int zufallszahl;
   private int versuch;

   public Zufallszahlen()
   {
     //generieren Zufallszahl
     Math.random();
     //int mZufallszahl=(int)((Math.random()*bis)+von);
     //int mZufallszahl=(int)((Math.random()*4)+1);
   }

   public void setVon(int pVon)
   {
     von = pVon;
   }

   public int getVon()
   {
     return von;
   }

   public void setBis(int pBis)
   {
     pBis= bis;
   }

   public int getBis()
   {
     return bis;
   }

   public void setbZahl(int pZahl)
   {
     bZahl=pZahl;
   }

   public int getbZahl()
   {
     return bZahl;
   }

   public void setZufallszahl(int pZufallszahl)
   {
     zufallszahl=pZufallszahl;
   }
   
   public int getZufallszahl()
   {
     return zufallszahl;
   }

   public void setVersuch(int pVersuch)
   {
     versuch=pVersuch;
   }

   public int getVersuch()
   {
     return versuch;
   }
}
```


----------



## Joose (2. Dez 2015)

Tacofan hat gesagt.:


> ```
> try {
> zufall1.setVon(Integer.parseInt(tfVon.getText()));
> zufall1.setBis(Integer.parseInt(tfBis.getText()));
> ...



Du verwendest einfach die falschen Methoden!
Du rufst "setVon" und "setBis" auf, was noch stimmt. Danach berechnest du dir richtig eine Zufallszahl.
Beim "System.out.println" verwendest du aber "getBis" anstatt "getZufallszahl".

Außerdem ist die "setBis" Methode in deiner Klasse Zufallszahlen falsch!

```
public void setBis(int pBis) {
   pBis= bis;
}
```
Du weist hier dem Parameter den Wert der Instanzvariable zu. Es müsste aber umgekehrt sein.

Da du eben "bis" nie einen Wert zuweist, bleibt dieser 0 und diesen gibst du dann auch auf. Hier wurde einfach nicht gut kontrolliert 

Hilfestellung für die Zukunft:
Nenne den Parameter einer setter Methode immer so wie das Attribut das du setzen willst und verwende dann das Keyword "this" um den Wert zu setzen.
Beispiel:

```
public void setBis(int bis) {
   this.bis = bis;
}
```
Ein Vorteil davon ist das du einerseits nicht so komische Präfixe wie "p" brauchst und außerdem kann man damit die Seiten nicht verwechseln. "this" sollte hier immer links stehen.


Was mir sonst noch aufgefallen ist bei deinem Code:
Du hast extra eine Klasse Zufallszahlen geschrieben (welche aber nur eine Zufallszahl berechent, daher wie schon mal erwähnt wäre eine Umbenennung in Zufallszahl sinnvoll).
Die Berechnung dieser Zufallszahl findet aber gar nicht in dieser Klasse statt 
Hier eine optimierte Version:


```
package paket_Zufallszahlen; // vermeide präfixe wie "p" bei Parametern oder "paket_" bei Packagenamen! Nenne es einfach nur "zufallszahlen". Packagenamen beginnen mit einem Kleinbuchstaben -> lowerCamelCase

import java.lang.Math;

public class Zufallszahl {
   private int bis;
   private int von;
   private int zufallszahl; // für Zufallszahl gibt es nur einen "getter" da diese Zahl nicht von außen gesetzt werden soll, sondern die Klasse sich selber diese Zahl generiert -> random()

   public Zufallszahlen() { }

   public void random() {
     this.zufallszahl =  (int)((Math.random()*(getBis()))+(getVon()));
   }

   public void setVon(int von) {
     this.von = von;
   }

   public int getVon() {
     return von;
   }

   public void setBis(int bis) {
     this.bis = bis;
   }

   public int getBis() {
     return bis;
   }

   public int getZufallszahl() {
     return zufallszahl;
   }
}
```

Aufrufen kannst du dann die Zufallszahl wie folgt:

```
try {
  zufall.setVon(Integer.parseInt(tfVon.getText()));
  zufall.setBis(Integer.parseInt(tfBis.getText()));
  zufall.random();
  System.out.println(zufall1.getZufallszahl());
} catch(Exception error) {
  JOptionPane.showMessageDialog(null, "Bitte gib eine Schrittweite ein die Zahlen beinhaltet!");
  tfVon.setText("");
  tfBis.setText("");
  tfVon.requestFocus();
}
```


----------

