# Move Operation mit Zufallszahl ausführen



## NewMember (9. Dez 2021)

Hallo,
Ich habe ein problem bei dem nicht weiterkomme.
Die Aufgabe ist die folgende:

Aufgrund der vielen Lockdowns in letzter Zeit ist Paule faul geworden, vermutlich
weil er zu wenig Sport gemacht hat. In einer neuen Operation tryToMove soll sich Paule nun
nur noch mit einer Wahrscheinlichkeit von 80 Prozent nach vorne bewegen, ansonsten bleibt er
sitzen und es soll eine TooLazyException geworfen werden.
Hinweis: Um Paules Gemutslage zu modellieren, dürfte Math.random() hilfreich sein.
Und noch eine Anmerkung: Diese recht unnaturliche Verwendung von Exceptions dient dazu,
in ubersichtlichem Rahmen das Arbeiten damit zu uben { Sie durfen sich gerne auch eine
Ubermittlung der Anweisungen uber eine instabile Netzwerkverbindung oder  Ahnliches vorstellen;
ein fauler Hamster ist aber schneller programmiert. . .

Die Exception ist im package als Klasse schon vorhanden. Leider funktioniert der Code nicht und weiß nicht wieso.



```
public class LazyHamsterGame extends InternalLazyHamsterGame {

    /**
     * Put the hamster code for running the game into this method.
     */

    
    
    public class GenerateNumber {
        public double random = Math.random();
     
    }
    
    
    public void tryToMove(double m){

        GenerateNumber generatenumber = new GenerateNumber();
        
        generatenumber.random= m;
        try {

            System.out.println("Random Number:" + m);

            if(m <= 0.8) {
            paule.move();

            }
        } catch (TooLazyException exc) {
            throw exc;
        }
    }
```


----------



## LimDul (9. Dez 2021)

Da stimmt kaum was am code.

Was soll folgende Zeile machen:

```
generatenumber.random= m;
```
Du weißt dem Felder random des Objekts generatenumber den m zu? m ist ein Double.
Das ergibt nun mal gar keinen Sinn.


```
public void tryToMove(double m)
```
Warum wird da ein m übergeben als Paramter? 


```
} catch (TooLazyException exc) {
```
Warum wird da die Exception gefangen? Wie soll die gefangen werden, wenn die nie geworfen wird vorher?

Überleg dir noch mal ganz ruhe, was überhaupt passieren soll - nicht als Java Code sondern Schritt für Schritt auf einem Blatt Papier.


----------



## NewMember (9. Dez 2021)

Also was ich eigentlich machen wollte war folgendes:

Eine Zufallsgenerierte Zahl mit Math.random();  immer neu generieren  lasssen und als Parameter an die tryToMove Methode weitergeben. Mit der Zahl sollte dann abgeglichen werden, ob diese kleiner/gleich 0.8 ist und wenn das der Fall ist, soll ein Schritt nach vorne gemacht werden. Falls die Zahl nicht dem entsprechen sollte, soll eine Exception geworfen werden und kein Schritt gemacht werden (es wird ein String angezeigt). Jetzt weiß ich nicht genau wie ich das coden soll.


----------



## LimDul (9. Dez 2021)

NewMember hat gesagt.:


> Also was ich eigentlich machen wollte war folgendes:
> 
> Eine Zufallsgenerierte Zahl mit Math.random();  immer neu generieren  lasssen und als Parameter an die tryToMove Methode weitergeben. Mit der Zahl sollte dann abgeglichen werden, ob diese kleiner/gleich 0.8 ist und wenn das der Fall ist, soll ein Schritt nach vorne gemacht werden. Falls die Zahl nicht dem entsprechen sollte, soll eine Exception geworfen werden und kein Schritt gemacht werden (es wird ein String angezeigt). Jetzt weiß ich nicht genau wie ich das coden soll.


Wer ruft den tryToMove auf? Wer generiert wo immer neu? 

Die Aufgabenstellung sieht mehr danach aus, als solle alles in der tryToMove Methode gemacht werden.

Wenn du alles in der tryToMove Methode machst, was soll da genau passieren? Einen Teil hast du schon korrekt beschrieben mit der Prüfung kleiner/gleich 0.8. Wenn du mal in Code übersetzt, kommt nicht das raus, was du oben hast, sondern was anderes - du hast ein entweder / oder - wie setzt du das in Java um? (Entweder bewegen ODER Exception werfen)


----------



## NewMember (9. Dez 2021)

okay ich hab das jetzt mal so verändert:


```
public void tryToMove() {

        double random = Math.random();

        System.out.println("Random Number:" + random);

        if (random <= 0.8) {
            paule.move();

        } else if (random >= 0.8) {
            throw new TooLazyException();
        }
    }
```

Bin jetzt nicht ganz sicher, ob das passt.


----------



## Flown (9. Dez 2021)

Bitte in Zukunft Code-Tags verwenden [code=java]//java-code[/code]


----------



## LimDul (9. Dez 2021)

NewMember hat gesagt.:


> okay ich hab das jetzt mal so verändert:
> 
> Bin jetzt nicht ganz sicher, ob das passt.


Das sieht gut aus. Gibt noch kleinere Schönheitsfehler, aber das ist meines Erachtens genau der richtige weg.

Einzige Anmerkung die ich habe:


```
} else if (random >= 0.8) {
```
Das "=" kann nie zutreffen, da er dann ja bereits in den ersten Block (mit move) gegangen ist. Das heißt, besser wäre

```
} else if (random > 0.8) {
```

Da es ja aber hier um 2 Fälle geht (Entweder oder) lässt sich die Zeile noch einfacher schreiben:

```
} else  {
```


----------



## NewMember (9. Dez 2021)

Klasse, vielen Dank für die Hilfe !!!

Zu der nächsten Aufgabe hätte ich auch noch eine Frage

Schreiben Sie eine neue Operation moveNSteps mit einer positiven ganzen Zahl n
als Parameter, die Paule n Schritte laufen lasst. Verwenden Sie zum Laufen Ihre in Aufgabenteil
(c) programmierte Operation tryToMove.Wenn das Feld vor Paule nicht frei ist, soll er sich nach
links drehen. Wenn er nicht vorankommt, weil er zu faul ist, soll er angefeuert werden (Hamster
feuert man an, indem man mittels ihrer write-Operation einen motivierenden Text ausgibt).
So oder so soll er nach Ausfuhrung dieser Operation tatsachlich genau n Schritte gemacht
haben (Drehungen und Anfeuerungen zahlen nicht als Schritte). Rufen Sie moveNSteps in der
vorhandenen Operation hamsterRun mit n = 5 Schritten auf.
Ein Beispiel fur moveNSteps: Fur n = 5 wurde Paule ganz nach rechts laufen, sich nach
links drehen, nach oben laufen, wenden und noch ein Feld nach unten laufen, sae also zum Schluss beim
Korn, egal wie oft er sich auf dem Weg dorthin beim tryToMove gestraubt hat.





Ich hab das geschrieben und es funktioniert auch, bloß hab ich jetzt das problem, wenn die Exception geworfen wird, das Programm nicht weiter läuft. Es sollen aber immer n=5 Schritte gemacht werden, egal ob eine Exception auftritt. Wie kann ich das realisieren?



```
public class LazyHamsterGame extends InternalLazyHamsterGame {


    /**

     * Put the hamster code for running the game into this method.

     */


    public void tryToMove() {


        double random = Math.random();


        System.out.println("Random Number:" + random);


        if (random <= 0.8) {

            paule.move();


        } else if (random > 0.8) {

            throw new TooLazyException();

        }

    }


    private Integer stepCounter = 0;


    public void moveNSteps() {


        while (stepCounter >= 0) {

            {


                if (paule.frontIsClear())


                {

                    tryToMove();

                    stepCounter++;


                }

                if (!paule.frontIsClear()) {

                    paule.turnLeft();


                } else {

                    paule.write("Don´t be a lazy fool and stand up!");

                }

            }

            if (stepCounter == 5) {

                break;

            }

        }

    }


    @Override

    protected void hamsterRun() {


        /**

         * Put your new methods below here.

         */


        moveNSteps();


    }

}
```


----------



## 2Fast4Me (10. Dez 2021)

Ich würde Zeile 50 bis 52 durch folgendes ersetzen:

```
try {
            tryToMove();
        }
        catch (TooLazyException e)
        {
            paule.write("Don´t be a lazy fool and stand up!");
        }
        
        StepCounter++;
```


----------

