# java erstes projekt



## Heyoka955 (11. Apr 2019)

hallo wir haben ein fast gefertigtes Programm bekommen und das Programm hat einen kleinen bug auf den ich später eingehen möchte.
Unsere aufgabe ist es sauberen Code zu schreiben bzw. Die regeln der calistenics anzuwenden.
und ich hätte eine frage zum auszug eines codes?
Was macht genau die Methode init?
Das ist nur eine Methode vom Programm, ich wollte schritt für schritt das Programm durchgehen.
Ich weiß nicht ob ich ehe rmit der aufgabe 1 anfangen soll oder zwei?

die aufgabe lautet:
Sie bekommen ein Programm, das einen Roboter über den Mars steuert. Das Programm wird mit ./gradlew run --args="<INSTRUKTIONEN>" aufgerufen.

Auf der Oberfläche werden zufällig Hindernisse platziert. Die Instruktionen sind eine Sequenz von Buchstaben, die den Roboter steuern.  Gültige Buchstaben sind:


l - Dreht den Rover gegen den Uhrzeigersinn (left)
r - Dreht den Rover mit dem Uhrzeigersinn (right)
f - Bewegt den Rover einen Schritt vorwärts (forward)
b - Bewegt den Rover einen Schritt rückwärts (backward)

Ein Beispiel für eine Kontrollsequenz, bei der der Rover zwei Schritte vorwärts macht, sich im Uhrzeiger dreht und dann zwei Schritte rückwärts moonwalkt wäre ffrbb.

Der Aufruf wäre entsprechend: ./gradlew run --args="ffrbb"

Das Programm gibt eine Karte des Planeten nach jedem Schritt aus. Hindernisse sind mit # markiert und der Rover durch einen Pfeil.






```
static Random r = new Random();
    static LinkedHashMap<int[], String> mars;
    static int x = 80;
    static int y = 20;
    static int rx = x / 2;
    static int ry = y / 2;

    public static void init() {
        mars = new LinkedHashMap<>();
        
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                int[] p = new int[] { i, j };
                if (r.nextDouble() < 0.25 && !(rx == i && ry == j))
                    mars.put(p, "#");
            }
        }
        mars.put(new int[] { rx, ry }, "n");
    }
```


----------



## mihe7 (11. Apr 2019)

Heyoka955 hat gesagt.:


> Die regeln der calistenics anzuwenden.


Was ist das für eine Sekte?


----------



## mrBrown (11. Apr 2019)

Heyoka955 hat gesagt.:


> regeln der calistenics anzuwenden


Der was?

Edit: @mihe7 war schneller...


----------



## Heyoka955 (11. Apr 2019)

mihe7 hat gesagt.:


> Was ist das für eine Sekte?


ahahahaha ich sterbe
es geht um sauber Code zu schreiben und es geht um 10 regeln. und bevor ich damit anfangen möchte brauche ich hilfe für den Code.
Das Problem ist ich verstehe nicht ganz was der auschnitt macht. Mein verdacht ist dass die linked list das Feld bildet vom Mars und jeweilige Stellen von den Hindernisse ausrechnet. und die variablen ry und rx dienen für die Position des roboters









						Object Calisthenics
					

Object Calisthenics are 9 steps to better software design today.




					williamdurand.fr


----------



## mrBrown (11. Apr 2019)

Was unheimlich hilft, um sauberen Code zu schreiben, ist generell lesbar zu schreiben (und auf das erfinden merkwürdiger Wörter zu verzichten.)




Heyoka955 hat gesagt.:


> Mein verdacht ist dass die linked list das Feld bildet vom Mars


In dem Code kommt keine LinkedList vor.



Heyoka955 hat gesagt.:


> und jeweilige Stellen von den Hindernisse ausrechnet. und die variablen ry und rx dienen für die Position des roboters


Das ist vermutlich richtig (zumindest, wenn '#' ein Hindernis sein soll und 'n' der Roboter.)


----------



## Heyoka955 (11. Apr 2019)

Heyoka955 hat gesagt.:


> ahahahaha ich sterbe
> es geht um sauber Code zu schreiben und es geht um 10 regeln. und bevor ich damit anfangen möchte brauche ich hilfe für den Code.
> Das Problem ist ich verstehe nicht ganz was der auschnitt macht. Mein verdacht ist dass die linked list das Feld bildet vom Mars und jeweilige Stellen von den Hindernisse ausrechnet. und die variablen ry und rx dienen für die Position des roboters


ich schicke dir den ganzen code, ich soll die namen so umändern dass man direkt versteht worum es geht bei den variablen und methoden. Also sorry meinte hashmap. 
Es geht mur um die erste Methode. also verstehe ich die richtig?


```
import java.util.Random;
import java.util.Set;

public class Start {

    static Random r = new Random();
    static LinkedHashMap<int[], String> mars;
    static int x = 80;
    static int y = 20;
    static int rx = x / 2;
    static int ry = y / 2;

    public static void erzeugHindernisse() {
        mars = new LinkedHashMap<>();
        
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                int[] positionVomHindernis = new int[] { i, j };
                if (r.nextDouble() < 0.25 && !(rx == i && ry == j))
                    mars.put(positionVomHindernis, "#"); //Füge zur HashMap die position auf der Sich ein Hindernis befindet.
            }
        }
        mars.put(new int[] { rx, ry }, "n");
    }

    public static int[] maximum(Set<int[]> set) {
        int[] x = new int[2];
        for (int[] e : set) {
            if (e[0] > x[0])
                x[0] = e[0];
            if (e[1] > x[1])
                x[1] = e[1];
        }
        return x;
    }

    public static String get(Map<int[], String> kloetze, int[] positionVomHindernis) {
        Set<Entry<int[], String>> entrySet = kloetze.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getKey()[0] == positionVomHindernis[0] && entry.getKey()[1] == positionVomHindernis[1])
                return entry.getValue();
        }
        return null;
    }

    public static void out() {
        // Set<int[]> keySet = mars.keySet();
        // for (int[] e : keySet) {
        // if (e[0] == 39 && e[1] == 10)
        // System.err.println(mars.get(e) + " " + e.hashCode());
        // }

        int[] max = maximum(mars.keySet());
        for (int j = 0; j < max[1]; j++) {
            for (int i = 0; i < max[0]; i++) {
                // System.out.println(i + "," + j + ": " + get(mars, new int[] { i, j }));

                if (get(mars, new int[] { i, j }) == null) {
                    System.out.print(" ");
                    continue;
                }
                if (get(mars, new int[] { i, j }).equals("#"))
                    System.out.print("#");
                else if (get(mars, new int[] { i, j }).equals("n"))
                    System.out.print("^");
                else if (get(mars, new int[] { i, j }).equals("s"))
                    System.out.print("V");
                else if (get(mars, new int[] { i, j }).equals("e"))
                    System.out.print(">");
                if (get(mars, new int[] { i, j }).equals("w"))
                    System.out.print("<");

            }
            System.out.println();
        }
        for (int i = 0; i < max[0]; i++) {
            System.out.print("=");
        }
        System.out.println();
    }

    public static void main(String[] args) {

        if (args.length > 1) {
            long seed = Long.parseLong(args[1]);
            r.setSeed(seed);
             //System.out.println("Seed: " + seed);
        }
        erzeugHindernisse();
        String pg = args[0];
        out();
        for (int i = 0; i < pg.length(); i++) {
            make(pg.charAt(i));
            out();
        }
    }

    public static void make(char c) {
        if (c == 'f') {
            int[] p = findeRover();
            if (get(mars, p).equals("n"))
                p[1]--;
            else if (get(mars, p).equals("s"))
                p[1]++;
            else if (get(mars, p).equals("e"))
                p[0]++;
            else if (get(mars, p).equals("w"))
                p[0]--;
        } else if (c == 'b') {
            int[] p = findeRover();
            if (get(mars, p).equals("s"))
                p[1]--;
            else if (get(mars, p).equals("n"))
                p[1]++;
            else if (get(mars, p).equals("w"))
                p[0]++;
            else if (get(mars, p).equals("e"))
                p[0]--;
        } else if (c == 'l') {
            int[] p = findeRover();
            if (get(mars, p).equals("n"))
                mars.put(p, "w");
            else if (get(mars, p).equals("s"))
                mars.put(p, "e");
            else if (get(mars, p).equals("e"))
                mars.put(p, "n");
            else if (get(mars, p).equals("w"))
                mars.put(p, "s");
        } else if (c == 'r') {
            int[] p = findeRover();
            if (get(mars, p).equals("w"))
                mars.put(p, "n");
            else if (get(mars, p).equals("e"))
                mars.put(p, "s");
            else if (get(mars, p).equals("n"))
                mars.put(p, "e");
            else if (get(mars, p).equals("s"))
                mars.put(p, "w");
        }

    }

    private static int[] findeRover() {
        Set<Entry<int[], String>> entrySet = mars.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getValue() != null && !entry.getValue().equals("#"))
                return entry.getKey();
        }
        throw new IllegalStateException("Rover missing in action");
    }

}
```


----------



## mrBrown (11. Apr 2019)

Heyoka955 hat gesagt.:


> Heyoka955 hat gesagt.:
> 
> 
> > ahahahaha ich sterbe
> ...


Dich selbst zu zitieren und darauf mit "dir" zu antworten entbehrt nicht einer gewissen Ironie....



Heyoka955 hat gesagt.:


> Also sorry meinte hashmap.


Es ist eine *Linked*HashMap, nicht "nur" eine HashMap.



Heyoka955 hat gesagt.:


> ich soll die namen so umändern dass man direkt versteht worum es geht bei den variablen und methoden. [...]
> Es geht mur um die erste Methode. also verstehe ich die richtig?


Die Methode erzeugt nicht nur Hindernisse, sondern fügt auch den Roboter hinzu.


----------



## Heyoka955 (11. Apr 2019)

mrBrown hat gesagt.:


> Dich selbst zu zitieren und darauf mit "dir" zu antworten entbehrt nicht einer gewissen Ironie....
> 
> 
> Es ist eine *Linked*HashMap, nicht "nur" eine HashMap.
> ...


was ist den x und y ?


----------



## mrBrown (11. Apr 2019)

Heyoka955 hat gesagt.:


> was ist den x und y ?


Zwei ints.
Auf den Rest solltest du selber kommen (sonst werden nicht nur die angepeilten 100k schwierig, sondern auch schon die 50k  )


----------



## Xyz1 (11. Apr 2019)

Heyoka955 hat gesagt.:


> was ist den x und y


Dem x sein y... Achte doch etwas darauf, so zu schreiben, dass viele dich noch verstehen können...

a ist ein Array, das immer zwei ints, namentlich x und y, beherbergt...


----------



## Heyoka955 (11. Apr 2019)

mrBrown hat gesagt.:


> Zwei ints.
> Auf den Rest solltest du selber kommen (sonst werden nicht nur die angepeilten 100k schwierig, sondern auch schon die 50k  )


es geht um die größe des Arrays, das Array soll die breite x haben und die länge y.


----------



## Xyz1 (11. Apr 2019)

Heyoka955 hat gesagt.:


> das Array soll die *breite* x haben


Breite??? Arrays haben immer nur *eine* Länge... und mehrdimensionale können mehrere Längen haben.


----------



## mihe7 (11. Apr 2019)

Heyoka955 hat gesagt.:


> und es geht um 10 regeln.


Die 10 Gebote, sauberen Code zu schreiben - also doch eine Sekte.

Du sollst keine anderen Einrückungen neben mir haben
Du sollst nicht begehren Else's Schlüsselwort
Du sollst Objekte heiligen.
Du sollst Collections ehren, auf dass sie ein Zuhause haben.
Du sollst nicht das Gesetz von Demeter brechen
Du sollst nicht falsch Abkürzungen verwenden wider besserer Namen
Du sollst keine großen Entities haben
Du sollst nicht begehren Objekte mit mehr als zwei Feldern
Du sollst nicht stehlen Deines Objekts Zuständigkeit.
Du sollst mir keinen Link zusenden, der nur 9 Gebote nennt.


----------



## Heyoka955 (11. Apr 2019)

Tobias-nrw hat gesagt.:


> Breite??? Arrays haben immer nur *eine* Länge... und mehrdimensionale können mehrere Längen haben.


ne ich meinte also höhe von y und lange hahah, tippe zu schnell. Also ich würde dir dann meinen sauberen Code mit Kommentar dazu schreiben.Ich überlege ob ich die zeile die den Roboter erstellt in eine neue Methode umänder? aber macht wenig Sinn, weil die beiden zum Feld gehören.

```
static Random r = new Random();
    static LinkedHashMap<int[], String> mars;
    static int X_LAENGE = 80;              //Die Länge des Arrays.           
    static int Y_HOEHE = 20;            // die Höhe des Arrays
    static int ROBOT_XPOSITION = X_LAENGE / 2;   //Variablen statisch außerhalb der Klasseb gemacht, falls man später darauf zugreifen möchte.
    static int ROBOT_YPOSITION = Y_HOEHE / 2;

    public static void erzeugeDasFeld() {
        mars = new LinkedHashMap<>();
        
        for (int i = 0; i < X_LAENGE; i++) {
            for (int j = 0; j < Y_HOEHE; j++) {
                int[] positionVomHindernis = new int[] { i, j };
                if (r.nextDouble() < 0.25 && !(ROBOT_XPOSITION == i && ROBOT_YPOSITION == j))
                    mars.put(positionVomHindernis, "#"); //Füge zur HashMap die Position auf der Sich ein Hindernis befindet.
            }
        }
        mars.put(new int[] {ROBOT_XPOSITION , ROBOT_YPOSITION }, "n"); //Erzeuge den Roboter auf den jeweiligen Positionen
    }
```


----------



## mrBrown (11. Apr 2019)

Heyoka955 hat gesagt.:


> ne ich meinte also höhe von y und lange hahah, tippe zu schnell


Dieser Satz ergibt einfach keinen Sinn.

In dem Code gibt es nur Eindimensionale Arrays mit Länge 2. Keine Mehrdimensionalen oder mit Länge x oder y.


----------



## Heyoka955 (11. Apr 2019)

mrBrown hat gesagt.:


> Dieser Satz ergibt einfach keinen Sinn.
> 
> In dem Code gibt es nur Eindimensionale Arrays mit Länge 2. Keine Mehrdimensionalen oder mit Länge x oder y.


wozu steht dann x y variablen? bei dem einen weiß ich ja zur position des Roboters?
bei x und y dachte ich an die fläche des feldes


----------



## mrBrown (11. Apr 2019)

Heyoka955 hat gesagt.:


> bei x und y dachte ich an die fläche des feldes


Das ist auch Korrekt, aber das Feld ist in diesem Fall kein Array.


----------



## Heyoka955 (11. Apr 2019)

mrBrown hat gesagt.:


> Das ist auch Korrekt, aber das Feld ist in diesem Fall kein Array.


ja klar sondern eine linkedhashmap aber wie soll ich die variable den umnennen? also wie findest du den Code? denkst du man kann das noch schöner schreiben?


----------



## mrBrown (11. Apr 2019)

Keine Ahnung, ehrlich gesagt fällt mir nicht ein, wie man die Breite und die Höhe nennen könnte...


----------



## mihe7 (11. Apr 2019)

Heyoka955 hat gesagt.:


> ja klar sondern eine linkedhashmap aber wie soll ich die variable den umnennen?


Wozu ist denn _diese_ LinkedHashMap da? Was wird gespeichert?



Heyoka955 hat gesagt.:


> also wie findest du den Code?


Indem ich mir Kommentar #14 auf den Schirm hole.



Heyoka955 hat gesagt.:


> denkst du man kann das noch schöner schreiben?


Die Frage ist: denkst Du, dass Du das noch schöner schreiben kannst?


----------



## Heyoka955 (11. Apr 2019)

mihe7 hat gesagt.:


> Wozu ist denn _diese_ LinkedHashMap da? Was wird gespeichert?
> 
> 
> Indem ich mir Kommentar #14 auf den Schirm hole.
> ...


also ich finde schon aber ich überlege ob ich für die Zeile von dem wo der Roboter herstell wird doch eine eigene Methode schreibe?
aber macht kein Sinn. Das wichtige ist dass die Namen verständlich sind und dass man vielleicht getrennte Methoden schreiben kann falls das möglich ist.

eine hashmap ist eine Datenstruktur wie eine arraylist das jeodoch keinen index hat, sondern objekte auch keys genannt. in dem falle wäre dann i und j dann der schlüssel an dem das Objekt "stern" gespeichert wird. Das heißt es entsteht eine Liste.


----------



## mihe7 (11. Apr 2019)

Ob Du neue Methoden einführen darfst, kann Dir nur das Aufgabenblatt oder Dein Betreuer beantworten. Findest Du den Variablennamen für die LinkedHashMap gut?


----------



## kneitzel (11. Apr 2019)

Du weisst, was eine LinkedHashMap ist bzw. was für Zugriffe es hier gibt. (Speziell das put solltest Du verstehen, denn das wird ja verwendet!)

Hast Du mal auf einem Zettel durchgespielt, was denn da somit in der Funktion passiert?

Bezüglich Namen: Du solltest da immer überlegen:
- Variablen: Was ist da eigentlich drin? "mars" ist da aus meiner Sicht wenig optimal. Wenn man die LinkedHashMap als eine Art Karte sehen will, dann würde das z.B. eher passen.
- Funktionen: Was passiert da genau? erstelleKarteUndSetzeRoverInDieMitte wäre da dann ein Funktionsname. Oder eben Deine Idee, das aufzuteilen: erstelleKarte und setzeRoverInMitte wäre aussagekräftig, oder?

Also ganz wichtig: Beschreibe exakt, was da in einer Variable ist oder was eine Funktion macht. Und ein "antworteImForum" Funktion darf dann nicht plötzlich auch Emails beantworten.


----------



## mrBrown (11. Apr 2019)

mihe7 hat gesagt.:


> Ob Du neue Methoden einführen darfst, kann Dir nur das Aufgabenblatt oder Dein Betreuer beantworten. Findest Du den Variablennamen für die LinkedHashMap gut?


Wie soll man MegacooleArenaFürRoboter-Speicher denn anders als mars abkürzen?


----------



## kneitzel (11. Apr 2019)

mrBrown hat gesagt.:


> Wie soll man MegacooleArenaFürRoboter-Speicher denn anders als mars abkürzen?


Ja, wo Du Recht hast, hast Du einfach Recht


----------



## mihe7 (11. Apr 2019)

Verstoß gegen Gebot 6  Gehet hin und tut Buße.


----------



## kneitzel (11. Apr 2019)

Jetzt habe ich mal angefangen, die Regeln für euren "Clean Code" anzusehen. Die erste Regel besagt, dass pro Funktion nur eine Einrückung erlaubt ist.
Damit musst Du die verschachtelten for Schleifen in Methoden überführen. Bei dem Link wird das ja auch genau beschrieben, wie dies auszusehen hat...


----------



## Heyoka955 (11. Apr 2019)

kneitzel hat gesagt.:


> Jetzt habe ich mal angefangen, die Regeln für euren "Clean Code" anzusehen. Die erste Regel besagt, dass pro Funktion nur eine Einrückung erlaubt ist.
> Damit musst Du die verschachtelten for Schleifen in Methoden überführen. Bei dem Link wird das ja auch genau beschrieben, wie dies auszusehen hat...


wir haben noch nich damit angefnagen wir sollen erstmal darauf achten, Methoden aufzuteilen nach aufgabe also falls eine Methode mehrere aufgaben macht solle man evt eine weitere Methode schreibe, man soll auch gute methodennamen verwenden und variablenamen.
also habe den namen auf marskatze geändert

```
public class Start {

    static Random r = new Random();
    static LinkedHashMap<int[], String> marskarte;
    static int X_LAENGE = 80;                         
    static int Y_HOEHE = 20;           
    static int ROBOT_XPOSITION = X_LAENGE / 2;   //Variablen statisch außerhalb der Klasseb gemacht, falls man später darauf zugreifen möchte.
    static int ROBOT_YPOSITION = Y_HOEHE / 2;

    public static void erstelleKarteUndSetzeRoverInDieMitte() {
        marskarte = new LinkedHashMap<>();
        
        for (int i = 0; i < X_LAENGE; i++) {
            for (int j = 0; j < Y_HOEHE; j++) {
                int[] positionVomHindernis = new int[] { i, j };
                if (r.nextDouble() < 0.25 && !(ROBOT_XPOSITION == i && ROBOT_YPOSITION == j))
                    marskarte.put(positionVomHindernis, "#"); //Füge zur LinkedHashMap die Position auf der sich ein Hindernis befindet.
            }
        }
        marskarte.put(new int[] {ROBOT_XPOSITION , ROBOT_YPOSITION }, "n"); //Erzeuge den Roboter auf den jeweiligen Positionen
    }
```


----------



## mrBrown (11. Apr 2019)

Heyoka955 hat gesagt.:


> marskatze




Und was soll denn X_LAENGE sein? die Länge von X?
Und das gleiche mit Y...


----------



## Heyoka955 (11. Apr 2019)

mrBrown hat gesagt.:


> Und was soll denn X_LAENGE sein? die Länge von X?
> Und das gleiche mit Y...


marskarte sorry haha, also die länge des feldes


----------



## kneitzel (11. Apr 2019)

Also bei Namen in Java ist es üblich, entweder camelCase (variablen, Funktionen) oder PascalCase (Klassen) zu verwenden.
Die marskarte wäre dann also marsKarte.

Ausnahme sind tatsächlich Konstanten, bei denen UPPER_CASE verwendet wird (soweit also richtig). Und wenn es nicht X und Y sondern marsKarte ist, dann heissen die Konstanten natürlich auch eher  MARS_KARTE_LAENGE.


----------



## mrBrown (11. Apr 2019)

Die Länge des Feldes X oder was soll X da zu suchen haben?


----------



## mrBrown (11. Apr 2019)

kneitzel hat gesagt.:


> Ausnahme sind tatsächlich Konstanten, bei denen UPPER_CASE verwendet wird (soweit also richtig).


Der heißt SCREAMING_SNAKE_CASE (musst du lesen wie "THIS IS SPARTA!")


----------



## Heyoka955 (11. Apr 2019)

mrBrown hat gesagt.:


> Und was soll denn X_LAENGE sein? die Länge von X?
> Und das gleiche mit Y...


wie soll ich das umändern.


----------



## mrBrown (11. Apr 2019)

naja, *was* ist es denn?


----------



## Heyoka955 (11. Apr 2019)

mrBrown hat gesagt.:


> naja, *was* ist es denn?


die länge des marses und höhe


----------



## mrBrown (11. Apr 2019)

und das ganze jetzt noch als Variablen-Name...


----------



## Heyoka955 (11. Apr 2019)

mrBrown hat gesagt.:


> und das ganze jetzt noch als Variablen-Name...


hier

```
static Random r = new Random();
    static LinkedHashMap<int[], String> marsKarte;
    static int X_LAENGE_MARSES = 80;                         
    static int Y_HOEHE_MARSES = 20;           
    static int ROVER_XPOSITION = X_LAENGE_MARSES / 2;   //Variablen statisch außerhalb der Klasseb gemacht, falls man später darauf zugreifen möchte.
    static int ROVER_YPOSITION = Y_HOEHE_MARSES / 2;

    public static void erstelleKarteUndSetzeRoverInDieMitte() {
        marsKarte = new LinkedHashMap<>();
        
        for (int i = 0; i < X_LAENGE_MARSES; i++) {
            for (int j = 0; j < Y_HOEHE_MARSES; j++) {
                int[] positionVomHindernis = new int[] { i, j };
                if (r.nextDouble() < 0.25 && !(ROVER_XPOSITION == i && ROVER_YPOSITION == j))
                    marsKarte.put(positionVomHindernis, "#"); //Füge zur LinkedHashMap die Position auf der sich ein Hindernis befindet.
            }
        }
        marsKarte.put(new int[] {ROVER_XPOSITION , ROVER_YPOSITION }, "n"); //Erzeuge den Roboter auf den jeweiligen Positionen
    }
```


----------



## mrBrown (11. Apr 2019)

Was hat denn das 'X' (bzw. das 'Y') im Namen zu bedeuten?




Heyoka955 hat gesagt.:


> //Variablen statisch außerhalb der Klasseb gemacht, falls man später darauf zugreifen möchte.


Äh was?


----------



## Heyoka955 (11. Apr 2019)

mrBrown hat gesagt.:


> Was hat denn das 'X' (bzw. das 'Y') im Namen zu bedeuten?
> 
> 
> 
> Äh was?


Nur ein Kommentar, voher waren die Variablen innerhalb der Methode und ich habe die Variablen aus Übersicht als statisch Variable initialisiert.


----------



## mrBrown (11. Apr 2019)

Heyoka955 hat gesagt.:


> Nur ein Kommentar, voher waren die Variablen innerhalb der Methode und ich habe die Variablen aus Übersicht als statisch Variable initialisiert.


Die Variablen stehen an der gleichen Stelle, wie im zuerst gezeigten Code und ganz sicher nicht "außerhalb der Klasseb".


----------



## mrBrown (11. Apr 2019)

Und immer noch: Was hat denn das 'X' (bzw. das 'Y') im Namen zu bedeuten?


----------



## Heyoka955 (11. Apr 2019)

mrBrown hat gesagt.:


> Die Variablen stehen an der gleichen Stelle, wie im zuerst gezeigten Code und ganz sicher nicht "außerhalb der Klasseb".


Nein bevor ich das geändert hatte, standen die da.
Der Ursprungscode war so dass die Variablen innerhalb der Methode war. Und ich hatte so geändert aber ist auch nicht so wichtig.
Das was zählt sind die variablennamem.


----------



## mrBrown (11. Apr 2019)

Heyoka955 hat gesagt.:


> Nein bevor ich das geändert hatte, standen die da.
> Der Ursprungscode war so dass die Variablen innerhalb der Methode war. Und ich hatte so geändert aber ist auch nicht so wichtig.
> Das was zählt sind die variablennamem.


lokale Variablen zu statische Variablen ändern ist ganz sicher keine "nicht wichtige Änderung". Um das in diesem Code ändern zu können, muss man ziemlich viel ändern, was ich dir ehrlich gesagt nicht zutraue...

Oder es geht nur um die beiden untersten, dann ist der Kommentar aber immer noch falsch, weil sie jetzt *IN* der Klasse und *NICHT* außerhalb  der Klasse stehen.


----------



## Heyoka955 (11. Apr 2019)

mrBrown hat gesagt.:


> Und immer noch: Was hat denn das 'X' (bzw. das 'Y') im Namen zu bedeuten?


Im Ursprungscode stand x und y


mrBrown hat gesagt.:


> lokale Variablen zu statische Variablen ändern ist ganz sicher keine "nicht wichtige Änderung". Um das in diesem Code ändern zu können, muss man ziemlich viel ändern, was ich dir ehrlich gesagt nicht zutraue...
> 
> Oder es geht nur um die beiden untersten, dann ist der Kommentar aber immer noch falsch, weil sie jetzt *IN* der Klasse und *NICHT* außerhalb  der Klasse stehen.


ea geht um die letzten vier konstanten also alle Variablen die in x y in Verbindung stehen. Ich hatte die voher innerhalb der Methode gehabt aber da das unübersichtlich war keinen Einfluss hat hab ich sie außerhalb der Methode gemacht.


----------



## mrBrown (11. Apr 2019)

Heyoka955 hat gesagt.:


> Im Ursprungscode stand x und y


Und weil die Aufgabe ist, die Namen zu ändern, behältst du das, was vorher da war? Klingt sinnvoll...


----------



## Heyoka955 (11. Apr 2019)

mrBrown hat gesagt.:


> Und weil die Aufgabe ist, die Namen zu ändern, behältst du das, was vorher da war? Klingt sinnvoll...


Ne die Aufgabe ist es den code übersichtlicher zu machen.
Ist es falsch dass ich das so geändert habe ?


----------



## kneitzel (12. Apr 2019)

Falsch ist ein harter Begriff, den ich so nicht verwenden würde. So der Code funktioniert könntest Du alle Variablen V<UUID> nennen, also z.B. v029d43f298ef40f5a73e7d698ac09578, vf9ea0cb25f474b59b5dee2cbff5450fa, ... (Generator kannst Du z.B. im Web unter https://www.uuidgenerator.net/ finden...) Kann sogar "richtig" sein, wenn die Anforderungen entsprechend sind. (So Anforderungen gibt es und dann gibt es entsprechende Tools, die Code unleserlich machen. Nennt sich dann meist Obfuscator.)

Aber Dein Anspruch ist doch dass die Namen gewissen "Clean Code" Ansprüchen genügen sollen. Und da würde ich dann von besser und schlechter reden und nicht von richtig oder falsch.

Bei Namen wie X_LAENGE_MARSES ist dann doch tatsächlich die Frage, was da angegeben wird. Was ist X? Klar, x/y wird bei Koordinatensystemen of verwendet, aber das sind dann nur Kürzel. An die Achsen schreist Du aber dann doch hoffentlich, was da abgebildet ist. Also z.B. an die x Achse schreibst Du "Zeit in Sekunden" und an die Y Achse dann "Temperatur in Grad Celsius". Und schon macht die Kurve einen Sinn. Und wenn Du da etwas beschreibst, dann sprichst Du doch nicht von X und Y sondern von Grad Celsius Temperatur zu einem bestimmten Zeitpunkt. Also statt X sprichst Du von einem Zeitpunkt und statt Y von der Temperatur.

Also worauf man hier schlicht hinaus wollte: X und Y macht keinen Sinn. Das besagt schlicht nichts aus!

Und dann LAENGE und HOEHE. Ist es eine LAENGE? Dinge haben eine Breite und eine Höhe. Und dann ist es doch eher die Karte vom Mars und nicht der Mars selbst. Also sowas wie BREITE_KARTE und HOEHE_KARTE.

Als Entwickler abstrahiert man nun einmal. Da wird nicht mehr von "Herbie" gesprochen. Mag ja sein, dass Du Dein Auto Herbie nennst, aber es ist dann doch eher ein Auto oder Fahrzeug. So ist es hier egal, ob es nun der Mars, die Erde, eine erfundener Planet oder sonst was ist. Abstrahiere davon.

Viele Grüße,

Konrad


----------



## mrBrown (12. Apr 2019)

Statt „falsch“ würde ich sagen, es zeigt, dass du dir keine Gedanken zu den Namen gemacht hast...


----------



## Heyoka955 (12. Apr 2019)

kneitzel hat gesagt.:


> Falsch ist ein harter Begriff, den ich so nicht verwenden würde. So der Code funktioniert könntest Du alle Variablen V<UUID> nennen, also z.B. v029d43f298ef40f5a73e7d698ac09578, vf9ea0cb25f474b59b5dee2cbff5450fa, ... (Generator kannst Du z.B. im Web unter https://www.uuidgenerator.net/ finden...) Kann sogar "richtig" sein, wenn die Anforderungen entsprechend sind. (So Anforderungen gibt es und dann gibt es entsprechende Tools, die Code unleserlich machen. Nennt sich dann meist Obfuscator.)
> 
> Aber Dein Anspruch ist doch dass die Namen gewissen "Clean Code" Ansprüchen genügen sollen. Und da würde ich dann von besser und schlechter reden und nicht von richtig oder falsch.
> 
> ...


Ich habe das schon auf marsKarte umge


mrBrown hat gesagt.:


> Statt „falsch“ würde ich sagen, es zeigt, dass du dir keine Gedanken zu den Namen gemacht hast...


mars stand so drinne, den habe ich aber geändert auf marsKarte.
Und soll ich das jetzt auf breite und hoehe Karte ändern.


----------



## Heyoka955 (13. Apr 2019)

mrBrown hat gesagt.:


> Statt „falsch“ würde ich sagen, es zeigt, dass du dir keine Gedanken zu den Namen gemacht hast...


hätte eine frage 
zum Ausschnitt in der ersten methode wo das Array "int[] positionVomHindernis = new int[] { i, j };" gebildet wird, was macht genau dieses {i,j} drin und bei "marsKarte.put(positionVomHindernis, "#");" was wird genau von marskarte... übergeben, sind das die jeweiligen Indexe die wir vorher gebildet haben?


----------



## kneitzel (13. Apr 2019)

Hast Du Dir einmal im Detail angesehen, wie die Karte gespeichert wird? Meine Empfehlung ist immer noch, dass Du das Ganze einmal mit Stift und Zettel durchspielst. Was wird genau in der LinkedHashMap gespeichert? Was braucht man, um darauf zu zu greifen?

Oder ist dein Problem das Verständnis des genannten Codes? Da wird eine Variable positionVomHindernis vom Typ Int-Array definiert und direkt mit einem neuen Int Array initialisiert, wobei das Array die Elemente i und j hat.


----------



## Heyoka955 (13. Apr 2019)

kneitzel hat gesagt.:


> Hast Du Dir einmal im Detail angesehen, wie die Karte gespeichert wird? Meine Empfehlung ist immer noch, dass Du das Ganze einmal mit Stift und Zettel durchspielst. Was wird genau in der LinkedHashMap gespeichert? Was braucht man, um darauf zu zu greifen?
> 
> Oder ist dein Problem das Verständnis des genannten Codes? Da wird eine Variable positionVomHindernis vom Typ Int-Array definiert und direkt mit einem neuen Int Array initialisiert, wobei das Array die Elemente i und j hat.


um ehrlich zu sein habe ich ein wenig Problem das zu verstehen also deine aussage habe ich verstanden aber das problem ist ich weiß nicht genau wie die karte herstellt wird. ich weiß wie eine hashmap funktioniert also dass man keine Indexe sondern kexs abspeichert und Objekte als Inhalte übergeben kann, aber wie sich daraus die karte abbildet, ist schwer verdaulich.
so habe ich das verstanden


----------



## kneitzel (13. Apr 2019)

Ja, wobei das Wichtige ist aus meiner Sicht die Map Funktionalität. Wie diese dann am Ende gespeichert wird, ist erst einmal egal (Bei der Implementierung natürlich nicht, aber wenn man eine Map braucht, dann kann man sich auf die Map versteifen. Dann kann man später immer noch überlegen, wie die am Besten gespeichert werden sollte.)

Und bei der Map hast du halt immer Key - Value Paare. Und eine Funktionalität, um über den Key auf den Wert zuzugreifen.

Und hier wurde als Key eben ein int array definiert. Ist etwas, mit dem ich Probleme habe muss ich gestehen. Der Code mag zwar funktionieren, weil Du die eigentliche Map Funktionalität kaum nutzt (Du lässt Dir nur die Werte komplett geben und gehst diese dann selbst durch. Die Map hat da aber sehr viel Funktionalität bereits in sich drin.). So sieht man in dem anderen Thread eine get Funktion. Totaler Quatsch, die map das doch bereits hat. Aber das geht bei dem Code leider nicht, denn wir haben hier ein großes Problem:

Ein einfacher kleiner Code, der dies einmal demonstriert (Einfach in eine Datei Test.java packen):

```
public class Test {
  public static void main(String[] args) {
    int[] array1 = new int[] { 1, 2 };
    int[] array2 = new int[] { 1, 2 };

    if (!array1.equals(array2)) {
      throw new RuntimeException("Arrays not equal");
    }
  }
}
```
Da reicht dann ein einfaches "javac Test.java" mit einem folgenden "java Test".

Was passiert? Wir bekommen die Exception, aber warum? Ich habe doch zwei Array mit genau dem gleichen Inhalt!
Bei diesen Arrays wird bei der equals Methode aber leider nur die Gleichheit der Referenz geprüft. Und ich habe zwei unterschiedliche int Arrays, der Inhalt ist somit egal. Nur die Referenzen der beiden Objekte zählt!

Somit kann man die Funktionalität der Map in dem Code gar nicht wirklich nutzen. Und da frage ich mich dann schon, was Ihr da wie lernen sollt. Das finde ich auf den ersten Blick verwirrend (Aber evtl. greife ich dem Lehrer jetzt einfach nur vor?)

Was man daran halt auch erkennen kann: Ein einfaches int Array so als Key zu nutzen ist blöd. Bei Objektorientierter Entwicklung würde man da von mir aus eine Klasse Position schreiben, welche dann zwei ints beherbergen kann. Bei dieser Klasse würde man dann equals und hashCode überschreiben und schon hätte man Positionen, die da entsprechend tauglich ist. Dann wäre auch direkt deutlich: Das ist eine Position - hat ja den Typ Position!

Also ich finde es ehrlich gesagt verwirrend, wenn Leute Programmieren lernen, eine OO Sprache dazu wählen um dann eigentlich ganz auf Klassen zu verzichten? Wenn man rein prozedural programmieren möchte, dann gibt es dazu genug taugliche Möglichkeiten (Modula-2, Pascal, C, ...) und wenn es OO werden soll, dann bieten Pascal und C diese Wege auch, wobei dieses Vorgehen umstritten ist. Und ich sehe kein Problem darin, Leuten von Anfang an Klassen zu erläutern. Genutzt werden sie dann doch ehh (siehe LinkedHashMap)!

Ich bin recht weit abgeschweift, aber ich hoffe, ich konnte paar interessante Aspekte aufzeigen.


----------



## Heyoka955 (13. Apr 2019)

kneitzel hat gesagt.:


> Ja, wobei das Wichtige ist aus meiner Sicht die Map Funktionalität. Wie diese dann am Ende gespeichert wird, ist erst einmal egal (Bei der Implementierung natürlich nicht, aber wenn man eine Map braucht, dann kann man sich auf die Map versteifen. Dann kann man später immer noch überlegen, wie die am Besten gespeichert werden sollte.)
> 
> Und bei der Map hast du halt immer Key - Value Paare. Und eine Funktionalität, um über den Key auf den Wert zuzugreifen.
> 
> ...


versteheauch nicht wieso man das so kompliziert gemacth hat aber ich glaube seine Absicht war schweren Code ohne 100 prozentig zu verstehe schöner zu schreiben.
Das ist schon hardcore Niveau, also die aufgaben von codewars waren viel einfacher. 

Mein Problem ist erstmal wie schaffe ich es diese else bedinung in switch umzuändern. ich weiß wie switch funktioniert aber bei den bedinungen und objekt vergleiche fällt mir das schwer, ich weiß zbs nicht was ich in switch(x) in x schreiben soll für meine emthode.


----------



## Heyoka955 (13. Apr 2019)

kneitzel hat gesagt.:


> Ja, wobei das Wichtige ist aus meiner Sicht die Map Funktionalität. Wie diese dann am Ende gespeichert wird, ist erst einmal egal (Bei der Implementierung natürlich nicht, aber wenn man eine Map braucht, dann kann man sich auf die Map versteifen. Dann kann man später immer noch überlegen, wie die am Besten gespeichert werden sollte.)
> 
> Und bei der Map hast du halt immer Key - Value Paare. Und eine Funktionalität, um über den Key auf den Wert zuzugreifen.
> 
> ...


ich habe die switch bedinung gepackt, meine frage ware ob das dennoch nicht zu lang ist? hatte überlegt den Code noch in eine Methode zu packen so dass printe das nu rmethoden Signatur beinhaltet. aber dann müsste ich auch vieles ändern. 





```
public static void printeDasFeld() {
        //fehlerAbfangen();
        
            int[] max = maximum(marsKarte.keySet());
            for (int j = 0; j < max[1]; j++) {
                for (int i = 0; i < max[0]; i++) {
                // System.out.println(i + "," + j + ": " + get(mars, new int[] { i, j }));

                    if (get(marsKarte, new int[] { i, j }) == null) {     
                        System.out.print(" ");
                        continue;
                    }
                    switch(get(marsKarte, new int[] { i, j })){
                        case "#" : System.out.print("#");
                        
                        case "n" : System.out.print("^");
                        
                        case "s" : System.out.print("V");
                        
                        case "e" : System.out.print(">");
                    
                        default : System.out.print("<");
                    
                    }

                }
                System.out.println();
            }
        
        ausgabeAbgrenzungVonKarte(max); //Die Codebefehle hab ich in eine neue Methode geändert.
    }
```


----------



## kneitzel (13. Apr 2019)

Ja genau, das sollte noch weiter in Methoden gepackt werden. Zu viele Verschachtelungen sind nicht gut für die Übersichtlichkeit.


----------



## Heyoka955 (13. Apr 2019)

kneitzel hat gesagt.:


> Ja genau, das sollte noch weiter in Methoden gepackt werden. Zu viele Verschachtelungen sind nicht gut für die Übersichtlichkeit.


ja mache ispäter, ich muss pausieren, mein Problem ist eher den Code schritt für schritt zu verstehen, ich verstehe diese maximum Methode nicht ganz genau weil ich weiß was da passiert, ich hätte am anfnag gedacht dass er überprüft dass die breite und hoehe eingehalten werden und also 80 und 20jedoch unsicher.
Sehen codes immer so schlimm aus ? hahah
das ist echt heftig, der hat nichmal wirklich eingeführt in das Thema.


----------



## mihe7 (13. Apr 2019)

Heyoka955 hat gesagt.:


> Sehen codes immer so schlimm aus ?


Schlimmer.


----------



## Heyoka955 (13. Apr 2019)

I


mihe7 hat gesagt.:


> Schlimmer.


ich bin tot


----------



## mrBrown (13. Apr 2019)

Heyoka955 hat gesagt.:


> Das ist schon hardcore Niveau, also die aufgaben von codewars waren viel einfacher. [...]





Heyoka955 hat gesagt.:


> [...] Sehen codes immer so schlimm aus ? hahah




Du hast aber nicht wirklich erwartet, dass echter Code leichter ist als die ersten Übungen im Studium? Das hier ist noch ziemlich einfacher Code, sowohl vom Umfang auch als von der "Komplexität"...

Ist nicht böse gemeint, aber ich glaube die Aufgaben sind ganz gut, um dich mal etwas auf den Boden der Realität zurückzuholen. "Das ist schon hardcore Niveau" und "100k nach 3 Jahren" ist dann doch ziemlich weit voneinander entfernt...


----------



## Heyoka955 (13. Apr 2019)

mrBrown hat gesagt.:


> Du hast aber nicht wirklich erwartet, dass echter Code leichter ist als die ersten Übungen im Studium? Das hier ist noch ziemlich einfacher Code, sowohl vom Umfang auch als von der "Komplexität"...
> 
> Ist nicht böse gemeint, aber ich glaube die Aufgaben sind ganz gut, um dich mal etwas auf den Boden der Realität zurückzuholen. "Das ist schon hardcore Niveau" und "100k nach 3 Jahren" ist dann doch ziemlich weit voneinander entfernt...


also ich habe mit der main Methode weitergemacht und habe folgendes verändert.
Mein Problem ist dass ich nicht weiß was da seed macht?

```
public static void main(String[] args) {

        if (args.length > 1) {
            long seed = Long.parseLong(args[1]);
            r.setSeed(seed);
            // System.out.println("Seed: " + seed);
        }
        erstelleKarteUndSetzeRoverInDieMitte();
        String richtungsOptionenVomRover = args[0];
        printeDasFeld();
        for (int i = 0; i < richtungsOptionenVomRover.length(); i++) {
            BewegeRover(richtungsOptionenVomRover.charAt(i));
            printeDasFeld();
        }
    }
```


----------



## mrBrown (13. Apr 2019)

Heyoka955 hat gesagt.:


> also ich habe mit der main Methode weitergemacht und habe folgendes verändert.
> Mein Problem ist dass ich nicht weiß was da seed macht?
> 
> ```
> ...



weißt du was super hilfreich ist: Auch irgendwie auf die Dinge einzugehen, die man zitiert. 


Zum Seed: Guck in die Doku, wenn du das noch nie gemacht hast, ist es jetzt an der Zeit das zu lernen.


----------



## mihe7 (13. Apr 2019)

Heyoka955 hat gesagt.:


> Mein Problem ist dass ich nicht weiß was da seed macht?


Markiere die korrekten Antworten:

```
[ ] ich stelle eine Frage im Forum
[X] ich schaue in der Doku zu Random nach
[X] wenn ich es nicht verstanden habe, frage ich Onkel Google.
```

EDIT: @mrBrown war schneller


----------



## Heyoka955 (13. Apr 2019)

ich habe das nicht verstanden genau soweit ich weiß wird der startwert auf ein anderes wert gesetzt.


----------



## mihe7 (13. Apr 2019)

Heyoka955 hat gesagt.:


> ich habe das nicht verstanden genau soweit ich weiß wird der startwert auf ein anderes wert gesetzt.


Ja, und was hast Du jetzt nicht verstanden?


----------



## Heyoka955 (13. Apr 2019)

mihe7 hat gesagt.:


> Ja, und was hast Du jetzt nicht verstanden?


Ja was das ausmacht für das Programm.
Ich versuche nacheinander den Code genau zu verstehen.


----------



## kneitzel (13. Apr 2019)

Also echter Code hat natürlich eine höhere Komplexität, aber so sauber entwickelt wird, dann bleibt es auch lesbar.

Generell ist dabei aber wichtig, dass die Anforderungen sowie die verwendeten Begriffe klar sind. Und dann sind die Namen so, dass sie einleuchtend sind, so dass der Code sich selbst erklärt.

Natürlich ist ein x.y().z(90) absolut unverständlich. Aber ein car.getSteeringWheel().turnLeft(90) lässt schon eher vermuten, was dahinter steckt.

Daher ist es aus meiner Sicht, dass wirklich alles sauber dokumentiert wird. Das spart am Ende auch viel Zeil. Dokumentation kommt oft auch von ganz alleine und muss nicht viel Zeit in Anspruch nehmen. Man spricht hier dann manchmal von einer "Problem Domäne". Wenn man sich da nicht wirklich klar drüber ist, dann kommen halt so Dinge wie: Mal ist es die Karte und dann plötzlich Klötze ...

Aber klar: So sauberen Code schreiben viele nicht. Und dann kommen ganz tolle Ergebnisse dabei raus. Aber das sind dann Negativbeispiele. Und normalerweise gibt es halt zu allen Code-Änderungen auch entsprechende Kontrollen, d.h. Dritte schauen drüber um sicher zu stellen, dass der Code vernünftig ist. Code den ein Team-Mitglied nicht versteht, muss halt so angepasst werden, dass er verständlich wird.


----------



## mihe7 (13. Apr 2019)

So. Jetzt rufst Du mal google auf und tippst dort random seed ein. Und dann liest Du einen der ersten Artikel, dann weißt Du, wofür das ganze da ist.


----------



## mihe7 (13. Apr 2019)

kneitzel hat gesagt.:


> Aber das sind dann Negativbeispiele.


Warum sammeln sich die Negativbeispiele immer um mich herum?


----------



## mrBrown (13. Apr 2019)

mihe7 hat gesagt.:


> Warum sammeln sich die Negativbeispiele immer um mich herum?


Ist wie bei Magneten


----------



## kneitzel (13. Apr 2019)

Wenn Du eine Funnktion nicht verstehst, dann gehst Du wir folgt vor:
a) Auf welcher instanz wird die Funktion aufgerufen? Das ist bei dir r,
b) was ist r? Das ist bei Dir Random
c) Also musst Du Dir die Doku zu Random ansehen. Dazu kannst Du Google nutzen oder du lädst Dir die Dokumentation runter und dann kannst Du Dich da auch durchclickern (Also erst Namespace und dann die Klasse). Eine Suche ist bei mir immer "<Klassenname> class java"
d) Google liefert dann ganz viele Treffer und du willst da den Link von Oracle Help Center ... Und da hast Du oft mehrere Versionen (JRE8 und JRE7 sind die ersten beiden Treffer bei mir).

So kommst Du dann auf die entsprechende Dokumentation der Klasse Random:




__





						Random (Java Platform SE 8 )
					





					docs.oracle.com
				




Und in der allgemeinen Beschreibung oben findest Du dann auch die Erläuterung, was dieses Seed bedeutet:


> If two instances of Random are created with the same seed, and the same sequence of method calls is made for each, they will generate and return identical sequences of numbers. In order to guarantee this property, particular algorithms are specified for the class Random. Java implementations must use all the algorithms shown here for the class Random, for the sake of absolute portability of Java code. However, subclasses of class Random are permitted to use other algorithms, so long as they adhere to the general contracts for all the methods.



Wenn Du also den Seed vorgibst, dann kannst Du genau sagen, welche Zufallszahlen generiert werden. Kannst Du ja mal testen:
Schreib ein kleines Programm, welches eine Instanz von Random erzeugt, einen Seed setzt (egal was, irgendwas konstantes) und dann mehrere Zufallszahlen erzeugt und ausgibt.
Und dann startest Du das mehrfach und schaust Dir die erzeugten Zahlen einmal an.


----------



## mihe7 (13. Apr 2019)

mrBrown hat gesagt.:


> Ist wie bei Magneten


OMG, das eröffnet ganz neue Lösungsansätze :-o


----------



## mihe7 (13. Apr 2019)

kneitzel hat gesagt.:


> Kannst Du ja mal testen:


Das wäre zu viel verlangt.


----------



## Heyoka955 (13. Apr 2019)

kneitzel hat gesagt.:


> Also echter Code hat natürlich eine höhere Komplexität, aber so sauber entwickelt wird, dann bleibt es auch lesbar.
> 
> Generell ist dabei aber wichtig, dass die Anforderungen sowie die verwendeten Begriffe klar sind. Und dann sind die Namen so, dass sie einleuchtend sind, so dass der Code sich selbst erklärt.
> 
> ...


Kann ich dir morgen meinen Code sendne und du sagst mir ob der sauber genug ist?


----------



## kneitzel (13. Apr 2019)

mihe7 hat gesagt.:


> Warum sammeln sich die Negativbeispiele immer um mich herum?



Nunja - das Problem ist halt, mit welcher Einstellung die Leute an die Sache heran gehen. Wenn der Anspruch nicht besteht oder die Fähigkeiten nicht ausreichen, dann ist das Ergebnis halt auch entsprechend. Aber die Probleme mit der Qualität und so muss man halt doch sehen.

Wichtig: Das ist keine Wertung! Wir haben Kollegen, die halt in anderen Bereichen tätig sind und die schreiben sich dann ein kleines Tool selbst. Da kann man gewisse Dinge nicht erwarten. Aber bei einer professionellen Softwareentwicklung mit entsprechenden Leuten, die das wirklich als ihre Berufung ansehen, dann sollte das Ergebnis entsprechend sein.


----------



## kneitzel (13. Apr 2019)

Heyoka955 hat gesagt.:


> Kann ich dir morgen meinen Code sendne und du sagst mir ob der sauber genug ist?



Also das kann nicht funktionieren: 
a) Ich kenne die Anforderungen nicht, die an Deinen Code gestellt werden. Ich kann also die "perfekte" Lösung nicht kennen. So wie ich es verstehe ist das ja eben Teil des Unterrichts bei Dir...
b) Du bist ja noch Einsteiger - die Anforderungen, die ich stellen würde, wären also mit Sicherheit von dir nicht zu erfüllen. Und der Umfang geht natürlich deutlich über das hinaus, was ein Forum leisten kann. (Dazu gibt es ganze Bücher! Aber auch online findet sich sehr viel, z.B. https://clean-code-developer.de/

Somit können wir Hinweise geben. Wir können Fragen beantworten. Aber Du musst Dir auch selbst einiges erarbeiten. Ein Software Entwickler zeichnet sich durch zwei Dinge aus - ohne die geht es aus meiner Sicht nicht:
- Selbständiges Erarbeiten von Wissen (Sowohl im Bereich der Softwareentwicklung aber auch bezüglich Problem-Domäne und so....)
- Ausdauer bei Fehlersuche. Ohne Debugging geht es nicht. Und bei komplexen Projekten ist es normal, dass es Probleme gibt denen man auf den Grund gehen muss. Wer da nicht selbst dran bleibt um Probleme zu lösen, der muss nicht erst anfangen. Auch schnelle Tests (Proof of Concept) sind da wichtig und so ...


----------



## Heyoka955 (13. Apr 2019)

Ich 


kneitzel hat gesagt.:


> Also das kann nicht funktionieren:
> a) Ich kenne die Anforderungen nicht, die an Deinen Code gestellt werden. Ich kann also die "perfekte" Lösung nicht kennen. So wie ich es verstehe ist das ja eben Teil des Unterrichts bei Dir...
> b) Du bist ja noch Einsteiger - die Anforderungen, die ich stellen würde, wären also mit Sicherheit von dir nicht zu erfüllen. Und der Umfang geht natürlich deutlich über das hinaus, was ein Forum leisten kann. (Dazu gibt es ganze Bücher! Aber auch online findet sich sehr viel, z.B. https://clean-code-developer.de/
> 
> ...


Wir sollen Variablen sinnvoll benennen.
Wir Sollen Methoden aufteilen wenn möglich. 
Und an richtiger Stelle kommentieren. Da wo es Sinn macht. 
Und wir sollen eine Änderung der Datenstrukturen in Betracht ziehen.


----------



## Heyoka955 (13. Apr 2019)

Heyoka955 hat gesagt.:


> Ich
> 
> Wir sollen Variablen sinnvoll benennen.
> Wir Sollen Methoden aufteilen wenn möglich.
> ...


*Ihre Aufgaben*


Reparieren Sie einen Bug, bei dem der Rover plötzlich verschwindet. Sie können den Bug mit ./gradlew run --args="lff 4711" reproduzieren. Die Zahl sorgt dafür, dass die Hindernisse immer an den gleichen Stellen sind.
Formen Sie den Code nach den Ideen, die Sie in Aufgabe 1 entwickelt haben um. Jeder Änderungsschritt (d.h. eine Änderung des Quelltextes, die einen Zweck hat) soll ein einzelner Commit sein, nach jedem Commit soll die Anwendung compilier- und startbar sein. Jeder Commit soll eine Commitnachricht haben, aus dem man nachvollziehen kann, welchen Zweck die Änderung hat. Ziehen Sie auch eine Änderung der benutzten Datenstrukturen in Betracht.
Passen Sie den Bewegungscode so an, dass der Roboter einzelne Befehle ignoriert, die ihn in ein Hindernis laufen lassen würden.


----------



## mihe7 (13. Apr 2019)

Heyoka955 hat gesagt.:


> Die Zahl sorgt dafür, dass die Hindernisse immer an den gleichen Stellen sind.


Jetzt weißt Du, wofür der Seed benötigt wird...



Heyoka955 hat gesagt.:


> Formen Sie den Code nach den Ideen, die Sie in Aufgabe 1 entwickelt haben um.


Wie willst Du die Aufgabe lösen, wenn Du Aufgabe 1 noch nicht bearbeitet hast?!?


----------



## Heyoka955 (13. Apr 2019)

mihe7 hat gesagt.:


> Jetzt weißt Du, wofür der Seed benötigt wird...
> 
> 
> Wie willst Du die Aufgabe lösen, wenn Du Aufgabe 1 noch nicht bearbeitet hast?!?


sind zwei unterschiedliche sachen aber okay dann mache ich die 1 erstmal. Will bei dem projet 100 punkte erreichen.


----------



## mihe7 (13. Apr 2019)

Heyoka955 hat gesagt.:


> sind zwei unterschiedliche sachen


Ja, es sind zwei Aufgaben, von daher wäre es nicht falsch, wenn diese auch unterschiedlich wären.

Wenn Du in einer Aufgabe die Ergebnisse einer anderen Aufgabe verwenden sollst, dann solltest Du die Ergebnisse erstmal haben, oder?


----------



## Heyoka955 (13. Apr 2019)

stimmt schon soll ich alles umändern jetzt?

also für die aufgabe 1 gehe ich aus dass die move Methode zuständig ist für den bug

```
public static void BewegeRover(char c) {
        if (c == 'f') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("n"))
                p[1]--;
            else if (get(marsKarte, p).equals("s"))
                p[1]++;
            else if (get(marsKarte, p).equals("e"))
                p[0]++;
            else if (get(marsKarte, p).equals("w"))
                p[0]--;
        } else if (c == 'b') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("s"))
                p[1]--;
            else if (get(marsKarte, p).equals("n"))
                p[1]++;
            else if (get(marsKarte, p).equals("w"))
                p[0]++;
            else if (get(marsKarte, p).equals("e"))
                p[0]--;
        } else if (c == 'l') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("n"))
                marsKarte.put(p, "w");
            else if (get(marsKarte, p).equals("s"))
                marsKarte.put(p, "e");
            else if (get(marsKarte, p).equals("e"))
                marsKarte.put(p, "n");
            else if (get(marsKarte, p).equals("w"))
                marsKarte.put(p, "s");
        } else if (c == 'r') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("w"))
                marsKarte.put(p, "n");
            else if (get(marsKarte, p).equals("e"))
                marsKarte.put(p, "s");
            else if (get(marsKarte, p).equals("n"))
                marsKarte.put(p, "e");
            else if (get(marsKarte, p).equals("s"))
                marsKarte.put(p, "w");
        }

    }
```


----------



## mihe7 (13. Apr 2019)

Umändern?!? Du sollst den Code nehmen, den Du bekommen hast (oder ggf. schon in einer vorherigen Aufgabe angepasst hast?) und den Bug suchen und Dir überlegen, wie Du ihn beheben kannst. In Aufgabe 2 sollst Du die Änderungen vornehmen.


----------



## Heyoka955 (13. Apr 2019)

mihe7 hat gesagt.:


> Umändern?!? Du sollst den Code nehmen, den Du bekommen hast (oder ggf. schon in einer vorherigen Aufgabe angepasst hast?) und den Bug suchen und Dir überlegen, wie Du ihn beheben kannst. In Aufgabe 2 sollst Du die Änderungen vornehmen.


ne der ursprungscode sah so aus 

```
package rover;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;

public class Start {

    static Random r = new Random();
    static LinkedHashMap<int[], String> mars;

    public static void init() {
        mars = new LinkedHashMap<>();
        int x = 80;
        int y = 20;
        int rx = x / 2;
        int ry = y / 2;
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                int[] p = new int[] { i, j };
                if (r.nextDouble() < 0.25 && !(rx == i && ry == j))
                    mars.put(p, "#");
            }
        }
        mars.put(new int[] { rx, ry }, "n");
    }

    public static int[] maximum(Set<int[]> set) {
        int[] x = new int[2];
        for (int[] e : set) {
            if (e[0] > x[0])
                x[0] = e[0];
            if (e[1] > x[1])
                x[1] = e[1];
        }
        return x;
    }

    public static String get(Map<int[], String> kloetze, int[] p) {
        Set<Entry<int[], String>> entrySet = kloetze.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getKey()[0] == p[0] && entry.getKey()[1] == p[1])
                return entry.getValue();
        }
        return null;
    }

    public static void out() {
        // Set<int[]> keySet = mars.keySet();
        // for (int[] e : keySet) {
        // if (e[0] == 39 && e[1] == 10)
        // System.err.println(mars.get(e) + " " + e.hashCode());
        // }

        int[] max = maximum(mars.keySet());
        for (int j = 0; j < max[1]; j++) {
            for (int i = 0; i < max[0]; i++) {
                // System.out.println(i + "," + j + ": " + get(mars, new int[] { i, j }));

                if (get(mars, new int[] { i, j }) == null) {
                    System.out.print(" ");
                    continue;
                }
                if (get(mars, new int[] { i, j }).equals("#"))
                    System.out.print("#");
                else if (get(mars, new int[] { i, j }).equals("n"))
                    System.out.print("^");
                else if (get(mars, new int[] { i, j }).equals("s"))
                    System.out.print("V");
                else if (get(mars, new int[] { i, j }).equals("e"))
                    System.out.print(">");
                if (get(mars, new int[] { i, j }).equals("w"))
                    System.out.print("<");

            }
            System.out.println();
        }
        for (int i = 0; i < max[0]; i++) {
            System.out.print("=");
        }
        System.out.println();
    }

    public static void main(String[] args) {

        if (args.length > 1) {
            long seed = Long.parseLong(args[1]);
            r.setSeed(seed);
            // System.out.println("Seed: " + seed);
        }
        init();
        String pg = args[0];
        out();
        for (int i = 0; i < pg.length(); i++) {
            make(pg.charAt(i));
            out();
        }
    }

    public static void make(char c) {
        if (c == 'f') {
            int[] p = findeRover();
            if (get(mars, p).equals("n"))
                p[1]--;
            else if (get(mars, p).equals("s"))
                p[1]++;
            else if (get(mars, p).equals("e"))
                p[0]++;
            else if (get(mars, p).equals("w"))
                p[0]--;
        } else if (c == 'b') {
            int[] p = findeRover();
            if (get(mars, p).equals("s"))
                p[1]--;
            else if (get(mars, p).equals("n"))
                p[1]++;
            else if (get(mars, p).equals("w"))
                p[0]++;
            else if (get(mars, p).equals("e"))
                p[0]--;
        } else if (c == 'l') {
            int[] p = findeRover();
            if (get(mars, p).equals("n"))
                mars.put(p, "w");
            else if (get(mars, p).equals("s"))
                mars.put(p, "e");
            else if (get(mars, p).equals("e"))
                mars.put(p, "n");
            else if (get(mars, p).equals("w"))
                mars.put(p, "s");
        } else if (c == 'r') {
            int[] p = findeRover();
            if (get(mars, p).equals("w"))
                mars.put(p, "n");
            else if (get(mars, p).equals("e"))
                mars.put(p, "s");
            else if (get(mars, p).equals("n"))
                mars.put(p, "e");
            else if (get(mars, p).equals("s"))
                mars.put(p, "w");
        }

    }

    private static int[] findeRover() {
        Set<Entry<int[], String>> entrySet = mars.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getValue() != null && !entry.getValue().equals("#"))
                return entry.getKey();
        }
        throw new IllegalStateException("Rover missing in action");
    }

}



//Mein code sieht so aus
ublic class Start {
    
    static Random r = new Random();
    static LinkedHashMap<int[], String> marsKarte;
    static int BREITE_MARSES = 80;                         
    static int HOEHE_MARSES = 20;           
    static int ROVER_XPOSITION = BREITE_MARSES / 2;   
    static int ROVER_YPOSITION = HOEHE_MARSES / 2;

    public static void erstelleKarteUndSetzeRoverInDieMitte() {
        marsKarte = new LinkedHashMap<>();
        
        for (int i = 0; i < BREITE_MARSES; i++) {
            for (int j = 0; j < HOEHE_MARSES; j++) {
                int[] positionVomHindernis = new int[] { i, j };
                if (r.nextDouble() < 0.25 && !(ROVER_XPOSITION == i && ROVER_YPOSITION == j))
                    marsKarte.put(positionVomHindernis, "#"); //Füge zur LinkedHashMap die Position auf der sich ein Hindernis befindet.
            }
        }
        marsKarte.put(new int[] {ROVER_XPOSITION , ROVER_YPOSITION }, "n"); //Erzeuge den Roboter auf den jeweiligen Positionen
    }   
    
    
    
    
    public static int[] maximum(Set<int[]> set) {
        int[] x = new int[2];
        for (int[] e : set) {
            if (e[0] > x[0])
                x[0] = e[0];
            if (e[1] > x[1])
                x[1] = e[1];
        }
        return x;
    }

    public static String get(Map<int[], String> kloetze, int[] p) {
        Set<Entry<int[], String>> entrySet = kloetze.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getKey()[0] == p[0] && entry.getKey()[1] == p[1])
                return entry.getValue();
        }
        return null;
    }

     public static void printeDasFeld() {
        //fehlerAbfangen();
        
            int[] max = maximum(marsKarte.keySet());
            for (int j = 0; j < max[1]; j++) {
                for (int i = 0; i < max[0]; i++) {
                // System.out.println(i + "," + j + ": " + get(mars, new int[] { i, j }));

                    if (get(marsKarte, new int[] { i, j }) == null) {     
                        System.out.print(" ");
                        continue;
                    }
                    switch(get(marsKarte, new int[] { i, j })){
                        case "#" : System.out.print("#"); continue;
                        case "n" : System.out.print("^"); continue;
                        case "s" : System.out.print("V"); continue;
                        case "e" : System.out.print(">"); continue;
                        default : System.out.print("<");
                    }
                }
                System.out.println();
            }
        ausgabeAbgrenzungVonKarte(max); //Die Codebefehle hab ich in eine neue Methode geändert.
    }
    
    public static void ausgabeAbgrenzungVonKarte(int[] max){
        for (int i = 0; i < max[0]; i++) {  //Dient zur Trennung und Abgrenzung der unteren und oberen Grenze der Marskarte
            System.out.print("=");
        }
        System.out.println();
        
        
    }
    
    //public static void fehlerAbfangen(){
        //Set<int[]> keySet = marsKarte.keySet();
        //for (int[] e : keySet) {
          //if (e[0] == 39 && e[1] == 10)
          //System.err.println(marsKarte.get(e) + " " + e.hashCode());
        //}
    
    //}
    

    
    

    public static void main(String[] args) {

        if (args.length > 1) {
            long seed = Long.parseLong(args[1]);
            r.setSeed(seed);
            // System.out.println("Seed: " + seed);
        }
        erstelleKarteUndSetzeRoverInDieMitte();
        String pg = args[0];
        printeDasFeld();
        for (int i = 0; i < pg.length(); i++) {
            make(pg.charAt(i));
            printeDasFeld();
        }
    }

    public static void make(char c) {
        if (c == 'f') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("n"))
                p[1]--;
            else if (get(marsKarte, p).equals("s"))
                p[1]++;
            else if (get(marsKarte, p).equals("e"))
                p[0]++;
            else if (get(marsKarte, p).equals("w"))
                p[0]--;
        } else if (c == 'b') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("s"))
                p[1]--;
            else if (get(marsKarte, p).equals("n"))
                p[1]++;
            else if (get(marsKarte, p).equals("w"))
                p[0]++;
            else if (get(marsKarte, p).equals("e"))
                p[0]--;
        } else if (c == 'l') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("n"))
                marsKarte.put(p, "w");
            else if (get(marsKarte, p).equals("s"))
                marsKarte.put(p, "e");
            else if (get(marsKarte, p).equals("e"))
                marsKarte.put(p, "n");
            else if (get(marsKarte, p).equals("w"))
                marsKarte.put(p, "s");
        } else if (c == 'r') {
            int[] p = findeRover();
            if (get(marsKarte, p).equals("w"))
                marsKarte.put(p, "n");
            else if (get(marsKarte, p).equals("e"))
                marsKarte.put(p, "s");
            else if (get(marsKarte, p).equals("n"))
                marsKarte.put(p, "e");
            else if (get(marsKarte, p).equals("s"))
                marsKarte.put(p, "w");
        }

    }

    private static int[] findeRover() {
        Set<Entry<int[], String>> entrySet = marsKarte.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getValue() != null && !entry.getValue().equals("#"))
                return entry.getKey();
        }
        throw new IllegalStateException("Rover missing in action");
    }

}
```


----------



## Heyoka955 (14. Apr 2019)

ich muss das bis freitag abgeben, das w


mihe7 hat gesagt.:


> Umändern?!? Du sollst den Code nehmen, den Du bekommen hast (oder ggf. schon in einer vorherigen Aufgabe angepasst hast?) und den Bug suchen und Dir überlegen, wie Du ihn beheben kannst. In Aufgabe 2 sollst Du die Änderungen vornehmen.


ich habe den Code gefunden glaube ich für den fehler

also 

```
private static int[] findeRover() {
        Set<Entry<int[], String>> entrySet = marsKarte.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getValue() != null && !entry.getValue().equals("#"))
                return entry.getKey();
        }
        
        throw new IllegalStateException("Rover missing in action");
    }


//Das problem ist dass eine abfrage gemacht wird dass wenn die bedinung != "#" ist dass dann das
//aktuelle pfeil returnt wird aber was wenn das nicht der fall eintritt sondern dass die bedinung erfüllt ist und
//Der Rover genau auf dem "#", Dann wird ja der wert nicht returnt? jetzt ist hier das Problem wie änder ich diesen code so ab,
//dass der code doch die Stelle printet.
```


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> ich muss das bis freitag abgeben, das w


Dann hast Du ja noch viele Stunden Zeit. 

Zu Deiner Erklärung: ich würde jetzt mal annehmen, dass der Rover Hindernissen ausweichen soll, d. h. der Rover kann nicht genau auf dem "#" stehen.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Dann hast Du ja noch viele Stunden Zeit.
> 
> Zu Deiner Erklärung: ich würde jetzt mal annehmen, dass der Rover Hindernissen ausweichen soll, d. h. der Rover kann nicht genau auf dem "#" stehen.


ich habe noch vier andere fächer ahahaah ist kritisch, daher sitze ich ran, lieber programmieren als feiern.
Ja denke das ist das Problem also diese Methode dekt den fall nicht ab falls doch mal Sternchen kommen sollte,? oder leige ich falsch. Die Methode dient dazu die aktuelle Position des rovers zurückzugeben.
Der Rover soll diese Befehle ignorieren also die ihn auffordern über die Hindernisse zu gehen aber das Problem ist, ich muss erstmal den Bug finden der dazu sorgt dass er verschwindet. Und meine Intuition und Logik sagt mir die Methode hat damit zu tun.


----------



## mihe7 (14. Apr 2019)

Die Methode soll nur die aktuelle Position des Rovers zurückgeben. Das macht die Methode vermutlich auch, sofern ein Rover in der Karte vorhanden ist. Ist kein Rover vorhanden, kann natürlich keine Position zurückgegeben werden und es wird eine Exception geworfen. Da scheint das Problem nicht zu liegen...


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Die Methode soll nur die aktuelle Position des Rovers zurückgeben. Das macht die Methode vermutlich auch, sofern ein Rover in der Karte vorhanden ist. Ist kein Rover vorhanden, kann natürlich keine Position zurückgegeben werden und es wird eine Exception geworfen. Da scheint das Problem nicht zu liegen...


Das heißt es muss irgendwas in der Methode bewegeRover geben das dazu sorgt daaa der rover gelöscht wird sodass er in der aet nicht vorkommt.


----------



## mihe7 (14. Apr 2019)

Wer weiß?


----------



## mihe7 (14. Apr 2019)

Habe gerade gesehen, dass in der Aufgabe nichts davon steht., dass Du nicht auf Hindernisse fahren dürftest. D. h. das Hindernis und der Rover könnten sich tatsächlich auf der gleichen Position befinden. Das nur der Vollständigkeit halber, an der Methode findeRover liegt es trotzdem nicht.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Habe gerade gesehen, dass in der Aufgabe nichts davon steht., dass Du nicht auf Hindernisse fahren dürftest. D. h. das Hindernis und der Rover könnten sich tatsächlich auf der gleichen Position befinden. Das nur der Vollständigkeit halber, an der Methode findeRover liegt es trotzdem nicht.


aber in der aufgabe drei steht dass man diese befehle ignorieren soll,

Passen Sie den Bewegungscode so an, dass der Roboter einzelne Befehle ignoriert, die ihn in ein Hindernis laufen lassen würden.


also ich schaue mal ab der Methode bewegerover nach, kannst du mir vllr sagen, ob das an einer zeile von der codezeile liegt.

```
} else if (c == 'l') {
            int[] derzeitigePosition = findeRover();
            if (get(marsKarte, derzeitigePosition).equals("n"))
                marsKarte.put(derzeitigePosition, "w");
            else if (get(marsKarte, derzeitigePosition).equals("s"))
                marsKarte.put(derzeitigePosition, "e");
            else if (get(marsKarte, derzeitigePosition).equals("e"))
                marsKarte.put(derzeitigePosition, "n");
            else if (get(marsKarte, derzeitigePosition).equals("w"))
                marsKarte.put(derzeitigePosition, "s");
        } else if (c == 'r') {
            int[] derzeitigePosition = findeRover();
            if (get(marsKarte, derzeitigePosition).equals("w"))
                marsKarte.put(derzeitigePosition, "n");
            else if (get(marsKarte, derzeitigePosition).equals("e"))
                marsKarte.put(derzeitigePosition, "s");
            else if (get(marsKarte, derzeitigePosition).equals("n"))
                marsKarte.put(derzeitigePosition, "e");
            else if (get(marsKarte, derzeitigePosition).equals("s"))
                marsKarte.put(derzeitigePosition, "w");
        }
```


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> aber in der aufgabe drei steht dass man diese befehle ignorieren soll,


Aber erst in 3.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Aber erst in 3.


ich struggle immernoch bei dem bug. ich habe schon aufgabe zwei fast fertig hahaha. kannst du mir als tipp sagen wo ich den fehler finde also in welcher ethode?


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Aber erst in 3.


ich würde annehmen, dass also die Methode dafür zuständig ist (bewege rover), das Problem ist, dass wir wissen müssen, was in dem rover passiert. Wenn eine Kollision eintritt verschwindet der rover, das heißt wir müssen eine Methode schreiben die dazu sorgt, dass die Kollision abgefafangen wird.


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> kannst du mir als tipp sagen wo ich den fehler finde also in welcher ethode?


Tipp: wirft denn die findeRover-Methode eine Exception? Wenn nein, warum nicht? 



Heyoka955 hat gesagt.:


> ch würde annehmen, dass also die Methode dafür zuständig ist (bewege rover), das Problem ist, dass wir wissen müssen, was in dem rover passiert. Wenn eine Kollision eintritt verschwindet der rover, das heißt wir müssen eine Methode schreiben die dazu sorgt, dass die Kollision abgefafangen wird.


Ja, das ist aber erst die dritte Aufgabe. Du musst die zweite vorher machen (hängt zusammen).


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Tipp: wirft denn die findeRover-Methode eine Exception? Wenn nein, warum nicht?
> 
> 
> Ja, das ist aber erst die dritte Aufgabe. Du musst die zweite vorher machen (hängt zusammen).


weil der fehler nicht abgedeckt wurde dass der rover auf ein hinderniss stehen bleiben kann?


----------



## mihe7 (14. Apr 2019)

Das wäre, wie gesagt, die dritte Aufgabe. In den ersten beiden geht es erstmal nur darum, dass der Rover verschwindet.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Das wäre, wie gesagt, die dritte Aufgabe. In den ersten beiden geht es erstmal nur darum, dass der Rover verschwindet.


ja aber woran liegt der bug dann?


----------



## mihe7 (14. Apr 2019)

Was muss passieren, damit die findeRover-Methode eine Exception wirft?


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Was muss passieren, damit die findeRover-Methode eine Exception wirft?


dass der rover auf der Position leigt wo ein Hindernis liegt.


----------



## temi (14. Apr 2019)

Heyoka955 hat gesagt.:


> dass der rover auf der Position leigt wo ein Hindernis liegt.



Ein kleiner Tipp: Der Text der Exception sagt schon alles aus...


----------



## Heyoka955 (14. Apr 2019)

temi hat gesagt.:


> Ein kleiner Tipp: Der Text der Exception sagt schon alles aus...


verwirrt mich gerade hahahaa


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> dass der rover auf der Position leigt wo ein Hindernis liegt.


Das würde bedeuten, dass das Programm mit einer Exception abbricht.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Das würde bedeuten, dass das Programm mit einer Exception abbricht.


ja genau aber das wäre doch nicht vorteilhaft, wäre es nicht besser wenn man den rover auf den hinderniss anzeigen lässt?
und wenn nein wie solll ich die expetion gestalten?


----------



## temi (14. Apr 2019)

Heyoka955 hat gesagt.:


> ja genau aber das wäre doch nicht vorteilhaft, wäre es nicht besser wenn man den rover auf den hinderniss anzeigen lässt?
> und wenn nein wie solll ich die expetion gestalten?



Es geht doch erst mal nicht darum was besser wäre. Es geht darum, was passieren muss, damit im gegebenen Programm genau diese Exception ausgelöst wird.


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> ja genau aber das wäre doch nicht vorteilhaft, wäre es nicht besser wenn man den rover auf den hinderniss anzeigen lässt?


Alter Schwede... Es ist wirklich schwer, Dich auf irgendwas hinzuweisen, ohne Dir die ganze Lösung vorzukauen. Hast Du das Programm schon einmal ausgeführt? Wird denn eine Exception geworfen? Wenn nein, was ist der Grund dafür?


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Alter Schwede... Es ist wirklich schwer, Dich auf irgendwas hinzuweisen, ohne Dir die ganze Lösung vorzukauen. Hast Du das Programm schon einmal ausgeführt? Wird denn eine Exception geworfen? Wenn nein, was ist der Grund dafür?




```
private static int[] findeRover() {
        Set<Entry<int[], String>> entrySet = marsKarte.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getValue() != null && !entry.getValue().equals("#"))
                return entry.getKey();
        }
        throw new IllegalStateException("Rover missing in action");
    }
```

weil der rover immer vorhanden ist, und die bedinungen nie eintreffen


----------



## mihe7 (14. Apr 2019)

Wir halten fest: der Rover ist vorhanden. Funktioniert denn die Bewegungsmethode?


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Wir halten fest: der Rover ist vorhanden. Funktioniert denn die Bewegungsmethode?


Sollte aber klappt nicht weil der River sich dort befindet wo ein Hindernis liegt.


----------



## temi (14. Apr 2019)

Heyoka955 hat gesagt.:


> Sollte aber klappt nicht





mihe7 hat gesagt.:


> Wir halten fest: der Rover ist vorhanden.





Heyoka955 hat gesagt.:


> weil der rover immer vorhanden ist, und die bedinungen nie eintreffen


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> Sollte aber klappt nicht weil der River sich dort befindet wo ein Hindernis liegt.


Die Frage war nicht, ob Du den Rover angezeigt bekommst, sondern ob die Bewegungsmethode funktioniert. Das kannst und solltest Du überprüfen, indem Du Dir z. B. die Position des Rovers in Form von Koordinaten ausgeben lässt.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Die Frage war nicht, ob Du den Rover angezeigt bekommst, sondern ob die Bewegungsmethode funktioniert. Das kannst und solltest Du überprüfen, indem Du Dir z. B. die Position des Rovers in Form von Koordinaten ausgeben lässt.


Ja das funktioniert, die Methode klappt. Ich habe dies mit anderen strings getestet.
Die Methode kackt nur an wenn halt ein Hindernis da ist aber wenn da kein Hindernis ist also leer Feld dann klappt die


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> Die Methode kackt nur an wenn halt ein Hindernis da


Was passiert, wenn die Methode abkackt?


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Was passiert, wenn die Methode abkackt?


Der River kann kein Schritt machen.


----------



## mihe7 (14. Apr 2019)

D. h. die Koordinate des Rovers ändert sich bei Dir nicht? Das würde mich stark wundern.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> D. h. die Koordinate des Rovers ändert sich bei Dir nicht? Das würde mich stark wundern.


den sieht man doch garnicht den rover, wie soll sich die koordiante ändern?


so sieht die asuagbe aus


----------



## Heyoka955 (14. Apr 2019)

jungs meine Konzentration ist tot, ich weiß das klingt scheiße von mir, aber brauche lösungen. will weiter an aufgabe 2 arbeiten


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> den sieht man doch garnicht den rover, wie soll sich die koordiante ändern?


Liest Du eigentlich meine Kommentare?

Hier:


mihe7 hat gesagt.:


> Das kannst und solltest Du überprüfen, indem Du Dir z. B. die Position des Rovers in Form von Koordinaten ausgeben lässt.


----------



## temi (14. Apr 2019)

Heyoka955 hat gesagt.:


> den sieht man doch garnicht den rover, wie soll sich die koordiante ändern?



Nur weil du den Rover nicht siehst, bedeutet das nicht, dass er keine Koordinaten hat, die sich ändern oder geändert haben.

Wir haben ja bereits festgestellt:



mihe7 hat gesagt.:


> Wir halten fest: der Rover ist vorhanden.


----------



## Heyoka955 (14. Apr 2019)

temi hat gesagt.:


> Nur weil du den Rover nicht siehst, bedeutet das nicht, dass er keine Koordinaten hat, die sich ändern oder geändert haben.
> 
> Wir haben ja bereits festgestellt:


keine Ahnung um ehrlich zu sein


----------



## Heyoka955 (14. Apr 2019)

temi hat gesagt.:


> Nur weil du den Rover nicht siehst, bedeutet das nicht, dass er keine Koordinaten hat, die sich ändern oder geändert haben.
> 
> Wir haben ja bereits festgestellt:


er hat die selben koordianten wie der hinderniss selbst, das heißt



```
if (getRoverUndHindernisse(marsKarte, new int[] { i, j }) == null) {
                    System.out.print(" ");
                    continue;
                }
                if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("#"))
                    System.out.print("#");
                else if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("n"))
                    System.out.print("^");
                else if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("s"))
                    System.out.print("V");
                else if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("e"))
                    System.out.print(">");
                if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("w"))
                    System.out.print("<");
nehmen wir an rover hat gleiche koordianten wie wie hindernisse, dann würd er die untere if bedinung die für den rover zuständig ist, garnicht printen?
    man könnte doch theoretisch die bedinung hier ändern?
```


----------



## mihe7 (14. Apr 2019)

Aha... Wir kommen der Sache näher.



Heyoka955 hat gesagt.:


> man könnte doch theoretisch die bedinung hier ändern?


Versuch's doch mal.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Aha... Wir kommen der Sache näher.
> 
> 
> Versuch's doch mal.


Mein Rücken tut schon weh
ja habe es in der Methode gemacht wo das Feld geprintet

```
if (getRoverUndHindernisse(marsKarte, new int[] { i, j }) == null) {
                    System.out.print(" ");
                    continue;
                }
                if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("#") && getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("n") )
                    System.out.print("^"); //hier aber funz net
                
                if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("#"))
                    System.out.print("#");
                else if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("n"))
                    System.out.print("^");
                else if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("s"))
                    System.out.print("V");
                else if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("e"))
                    System.out.print(">");
                if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("w"))
                    System.out.print("<");

            }
```


----------



## temi (14. Apr 2019)

Heyoka955 hat gesagt.:


> Mein Rücken tut schon weh



Dann überprüfe bitte, ob dein Arbeitsplatz die ergonomischen Bedingungen für Bildschirmarbeitsplätze so gut wie möglich erfüllt:

Einstellung des Stuhls, die Schreibtischhöhe, Einstellung des Monitors usw...


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Aha... Wir kommen der Sache näher.
> 
> 
> Versuch's doch mal.


habe weiter rumpboriert, und ich bin auf etwas gekommen, also zu aller erst weiß ich das in de rmove Methode die aktuelle positiov´n immer geändert wird das heißt, der Pfeil bewegt sich und die akutelle Position ändert sich mit, nehmen wir an der Pfeil würde in der if bedinung von move auf ein Hindernis landen, dann könnte man theoretisch eine if abfrage am ende der Methode machen der so aussieht

```
//der code de rmethode
if(getRoverUndHindernisse(marsKarte, aktuellePosition).equals("#")){
            //marsKarte.put(aktuellePosition, "w|e|s|n");
            
        }
```


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> also zu aller erst weiß ich das in de rmove Methode die aktuelle positiov´n immer geändert wird das heißt, der Pfeil bewegt sich und die akutelle Position ändert sich mit


Ja, die Methode für die Bewegung funktioniert also. 

Zu Deinem Kommentar #125:



Heyoka955 hat gesagt.:


> if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("#") && getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("n") ) System.out.print("^"); //hier aber funz net


Ja. Suche nach dem Grund, warum es nicht funktioniert. 

Die von Dir geänderte Bedingung kann übrigens niemals true sein, denn dann müsste gelten "#".equals("n"). 

Du bist an der Stelle schon ganz nah dran, herauszufinden, wo der Bug liegt. @kneitzel hat Dir schon am Anfang einen entscheidenden Hinweis diesbezüglich gegeben.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Ja, die Methode für die Bewegung funktioniert also.
> 
> Zu Deinem Kommentar #125:
> 
> ...


Denke der Grund warum das nicht liegt ist weil die Hindernisse und Rover die gleichen Koordinaten haben. Und man dann zusammen Printet.
Die haben in der Datenstruktur den selben key. Daher wird nur eines von den ausgedrückt.  Könntest du vllt die Lösung geben 
Ich bin zu tot


----------



## kneitzel (14. Apr 2019)

Wenn Du im Augenblick "zu tot" bist, musst Du eine Pause einlegen und dann später erneut dran gehen.

Wir werden die Aufgabe nicht für Dich lösen. Wir helfen Dir mit Hinweisen, damit Du Dir das nötige Wissen / eine mögliche Vorgehensweise erarbeiten kannst.

Also müsstest Du eine Lösungsidee erarbeiten. Spiel es ggf. auf einem Zettel durch. Was könnte man denn alles machen um das zu ändern?


----------



## Heyoka955 (14. Apr 2019)

kneitzel hat gesagt.:


> Wenn Du im Augenblick "zu tot" bist, musst Du eine Pause einlegen und dann später erneut dran gehen.
> 
> Wir werden die Aufgabe nicht für Dich lösen. Wir helfen Dir mit Hinweisen, damit Du Dir das nötige Wissen / eine mögliche Vorgehensweise erarbeiten kannst.
> 
> Also müsstest Du eine Lösungsidee erarbeiten. Spiel es ggf. auf einem Zettel durch. Was könnte man denn alles machen um das zu ändern?


ist meine Idee mit den selben koordianten erstmal richtig?
denn so kann ich erst weiter kommen, kann mir einer sagen ob ich eine ausnahme werfen soll


----------



## Heyoka955 (14. Apr 2019)

kneitzel hat gesagt.:


> Wenn Du im Augenblick "zu tot" bist, musst Du eine Pause einlegen und dann später erneut dran gehen.
> 
> Wir werden die Aufgabe nicht für Dich lösen. Wir helfen Dir mit Hinweisen, damit Du Dir das nötige Wissen / eine mögliche Vorgehensweise erarbeiten kannst.
> 
> Also müsstest Du eine Lösungsidee erarbeiten. Spiel es ggf. auf einem Zettel durch. Was könnte man denn alles machen um das zu ändern?


Meine Frage wäre jetzt ob man eine Expception schmeißen musst oder dass so fixen dass der Roboter da rauf ist ?


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> ist meine Idee mit den selben koordianten erstmal richtig?


Ja, das geht in die richtige Richtung. Ich würde vor allem den Gedanken mit dem selben key weiterspielen...



Heyoka955 hat gesagt.:


> Meine Frage wäre jetzt ob man eine Expception schmeißen musst oder dass so fixen dass der Roboter da rauf ist ?


Erst mal sollst Du nur dafür sorgen, dass der Rover nicht von der Karte verschwindet.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Ja, das geht in die richtige Richtung. Ich würde vor allem den Gedanken mit dem selben key weiterspielen...
> 
> 
> Erst mal sollst Du nur dafür sorgen, dass der Rover nicht von der Karte verschwindet.


Dafür würde eine if abfrage in frage kommen.
Man muss entweder gucken ob an dieser Position also an den Koordinaten zwei Inhalte sind also # und ^ oder man muss eine Abfrage machen wo man nach den Nachbarn fragt vom Roboter(ist ja ein array) ... 
denke die erste ish bessere Idee.

Und wäre es sinnvoller eine neue Methode zu schreiben oder den Bug in der Methode  bewegerover zu fixen.

Ps. Ich habe echt die Geduld eines programmieren


----------



## kneitzel (14. Apr 2019)

Also hier kommt etwas ins Spiel, was "Debugging" genannt wird. Idealerweise lässt man dazu die Software Schritt für Schritt laufen bzw. lässt die Software bis zu einem sogenannten Breakpoint laufen, ab dem man dann Schritt für Schritt die Software ausführen lassen kann. Zusätzlich zeigt einem der Debugger auch den Inhalt von Variablen an und so ....

Wenn Dir das erst einmal zu komplex scheint, dann gibt es die Möglichkeit, andere Dinge zu machen:
- Die trivialste ist, dass man weitere Ausgaben einbaut. Also an gewissen Stellen wird einfach ausgegeben, wo Du Dich befindest gefolgt von den Variablen, die Dich interessieren.
- Du kannst das aber auch deutlich komplexer machen. So könntest Du z.B. eine Funktion schreiben, die den Inhalt der Karte ausgibt. Und zwar nicht die "graphische" Ausgabe, die Du schon hast, sondern wirklich alle Werte. Also sprich: Du gehst hin und für jeden gespeicherten Wert gibst du aus: Die Koordinate und den dazu gespeicherten String. Dann kannst Du diese Funktion an beliebigen Stellen ausführen. Ggf. zusammen mit Unterbrechungen, d.h. nach der Ausgabe musst Du einmal Enter drücken weil Du die Zeile einliest. Das könntest Du z.B. bei jeder Änderung aufrufen....

Und deine Frage bezüglich Exception:
Wenn Du für die Software einen Zustand definierst, der nicht gestattet ist und findest, dass dieser Zustand eintritt, dann ist es denkbar, eine Exception zu werfen. Aber damit hast Du das Problem nicht gelöst! Das Ergebnis ist ggf., dass die Applikation direkt beendet wird. (Stell Dir vor du arbeitest relativ lange an einer Applikation und dann schließt die sich einfach so - und Deine Daten sind weg. Willst Du das?)
Also eine Exception zu werfen ist erst einmal blöd - Du willst ja, dass die Applikation sicher läuft! Also solltest Du schauen, was wann wie das Problem verursacht und dir dann überlegen, wo Du eingreifen willst. Hier kommt dann auch oft der Produkt-Owner ins Spiel, denn der definiert ja, was das gewünschte Verhalten ist.

Wenn der Rover bei der Initialisierung auf ein Hindernis gesetzt wird, was ist dann?
a) Das ist ein Zustand, der OK, ist. Wenn der Rover auf einem Hindernis steht, dann soll "M" ausgegeben werden. (Das M ist jetzt zufällig ausgewählt worden)
b) Es darf immer nur ein Objekt auf einem Feld sein, wenn der Rover auf ein besetztes Feld kommt, dann verschwindet das bisherige Objekt.
c) Der Rover darf nicht auf ein Objekt gesetzt werden, Bewegungen dürfen dies nicht zulassen, bei der Initialisierung muss der Rover so lange gesetzt werden, bis der Rover auf ein leeres Feld gesetzt wird ...
d) ....

Es gibt hier sehr viele Idee. Was "richtig" oder "erwünscht" ist, muss festgelegt werden. Das können wir aber nicht. Das weisst Du evtl. auf Grund der Aufgabenstellung.


----------



## Heyoka955 (14. Apr 2019)

kneitzel hat gesagt.:


> Also hier kommt etwas ins Spiel, was "Debugging" genannt wird. Idealerweise lässt man dazu die Software Schritt für Schritt laufen bzw. lässt die Software bis zu einem sogenannten Breakpoint laufen, ab dem man dann Schritt für Schritt die Software ausführen lassen kann. Zusätzlich zeigt einem der Debugger auch den Inhalt von Variablen an und so ....
> 
> Wenn Dir das erst einmal zu komplex scheint, dann gibt es die Möglichkeit, andere Dinge zu machen:
> - Die trivialste ist, dass man weitere Ausgaben einbaut. Also an gewissen Stellen wird einfach ausgegeben, wo Du Dich befindest gefolgt von den Variablen, die Dich interessieren.
> ...


also muss ich es so fixen dass er funzt, vllt liegt es an der Datenstruktur, denn wenn ich überlege dass die beiden die gleichen koordianten haben dann weiß ich ja dass die in map gespeichert sind aber die map kann doch  nur ein inhat besitzen?


----------



## kneitzel (14. Apr 2019)

Also diese Frage musst Du Dir selbst beantworten. Die Möglichkeiten (Debugger, zusätzliche Ausgaben) dazu habe ich Dir genannt.
Wichtig ist: Keine Vermutungen sondern prüfe es! (In der professionellen Softwareentwicklung hätte man für alles auch sogenannte Unit Tests!)

Und bezüglich der vorhandenen Problematik hatte ich schon was geschrieben. Schau dir die Antwort #54 im Detail an.


----------



## Heyoka955 (14. Apr 2019)

kneitzel hat gesagt.:


> Also diese Frage musst Du Dir selbst beantworten. Die Möglichkeiten (Debugger, zusätzliche Ausgaben) dazu habe ich Dir genannt.
> Wichtig ist: Keine Vermutungen sondern prüfe es! (In der professionellen Softwareentwicklung hätte man für alles auch sogenannte Unit Tests!)
> 
> Und bezüglich der vorhandenen Problematik hatte ich schon was geschrieben. Schau dir die Antwort #54 im Detail an.


Wir lernen das noch, wenn ich weiß wie es gehen würde dann würde es machen hahaah. Jungs hilft mir 100 Punkte  zu bekommen.


----------



## kneitzel (14. Apr 2019)

Also ich bezweifle, dass jemand hier Deine Aufgabe erledigen wird. Und das, was ich Dir geschrieben habe, solltest Du können, denn Du hast alle notwendigen Dinge bereits im Code.
In der get Funktion siehst Du, wie Du über alle Elemente der Karte gehen kannst. Und Ausgaben auf dem Bildschirm hast Du auch schon gemacht. Also solltest Du in der Lage sein, alle Entry elemente der Map auf dem Bildschirm auszugeben.

Also wenn Du 100 Punkte haben willst, dann tue etwas dafür. Die 100 Punkte setzen nun einmal gewisses Wissen und gewisse Aktivitäten voraus. Also eigne Dir das notwendige Wissen an und führe Aktivitäten durch! Oder verzichte schlicht auf die 100 Punkte.

Wobei ich bezweifle, dass die Lösung selbst zu 100 Punkten führen wird. Sobald die Lehrkraft Fragen stellt wird sofort klar, dass die Lösung nicht von Dir stammen kann, denn Du wirst nicht erläutern können, was Du aus welchem Grund wie gelöst hast. Im ungünstigsten Fall würde die Lehrkraft dir 0 Punkte geben weil Du versucht hast, eine fremde Leistung als Deine auszugeben, was ein Betrug ist....


----------



## Heyoka955 (14. Apr 2019)

kneitzel hat gesagt.:


> Also ich bezweifle, dass jemand hier Deine Aufgabe erledigen wird. Und das, was ich Dir geschrieben habe, solltest Du können, denn Du hast alle notwendigen Dinge bereits im Code.
> In der get Funktion siehst Du, wie Du über alle Elemente der Karte gehen kannst. Und Ausgaben auf dem Bildschirm hast Du auch schon gemacht. Also solltest Du in der Lage sein, alle Entry elemente der Map auf dem Bildschirm auszugeben.
> 
> Also wenn Du 100 Punkte haben willst, dann tue etwas dafür. Die 100 Punkte setzen nun einmal gewisses Wissen und gewisse Aktivitäten voraus. Also eigne Dir das notwendige Wissen an und führe Aktivitäten durch! Oder verzichte schlicht auf die 100 Punkte.
> ...


Nah bei mir ist das so dass ich Lösungen direkt verstehen
Ich versteh es ja. Aber mir fehlt der Tipp was genau ich machen muss ?


----------



## Heyoka955 (14. Apr 2019)

Heyoka955 hat gesagt.:


> Nah bei mir ist das so dass ich Lösungen direkt verstehen
> Ich versteh es ja. Aber mir fehlt der Tipp was genau ich machen muss ?


Ich brauche nur den vodeansatz mit pseudicode


----------



## kneitzel (14. Apr 2019)

Dazu habe ich bereits was geschrieben. Es gibt mehrere Option, welche Richtig ist, musst Du wissen. Und dann kannst Du überlegen, an welcher Stelle Du evtl. eingreifen müsstest. Und das solltest Du ja dann gut können, den es geht dann ja nur darum, eine etwas fehlerhafte Lösung, die Du direkt verstanden hast, etwas anzupassen.


----------



## Heyoka955 (14. Apr 2019)

kneitzel hat gesagt.:


> Also hier kommt etwas ins Spiel, was "Debugging" genannt wird. Idealerweise lässt man dazu die Software Schritt für Schritt laufen bzw. lässt die Software bis zu einem sogenannten Breakpoint laufen, ab dem man dann Schritt für Schritt die Software ausführen lassen kann. Zusätzlich zeigt einem der Debugger auch den Inhalt von Variablen an und so ....
> 
> Wenn Dir das erst einmal zu komplex scheint, dann gibt es die Möglichkeit, andere Dinge zu machen:
> - Die trivialste ist, dass man weitere Ausgaben einbaut. Also an gewissen Stellen wird einfach ausgegeben, wo Du Dich befindest gefolgt von den Variablen, die Dich interessieren.
> ...


Okay meien frage wäre wie prüfe ich ob der rover auf den # liegt ? Weiß nicht wie und wo ich das anstellen soll?
Denn das war auch meine Idee aber.


----------



## Heyoka955 (14. Apr 2019)

mein prof hat auf eine email geantwortet, also aufgabe 1 und aufgabe 3 gehören, teilweise zusammen. 


"Wenn der Rover die Hindernisse nicht überfährt, verschwindet das Symptom (und wenn man so will, der Bug). Trotzdem lohnt es  sich  einmal Gedanken darüber machen, was genau das Problem im Originalcode ist. "


----------



## mrBrown (14. Apr 2019)

Heyoka955 hat gesagt.:


> Nah bei mir ist das so dass ich Lösungen direkt verstehen


Das ist bei fast allen so. Den meisten reichen aber auch die hier stehenden Erklärungen...

Nur hat man seltensten Fällen fertigen Code, den man nur noch verstehen muss....



Heyoka955 hat gesagt.:


> mein prof hat auf eine email geantwortet, also aufgabe 1 und aufgabe 3 gehören, teilweise zusammen.


Das wurde dir hier auch schon gesagt


----------



## Heyoka955 (14. Apr 2019)

mrBrown hat gesagt.:


> Das ist bei fast allen so. Den meisten reichen aber auch die hier stehenden Erklärungen...
> 
> Nur hat man seltensten Fällen fertigen Code, den man nur noch verstehen muss....
> 
> ...


ich werde versuchen das so zu machen:

bei der Methode move also bewegeRover werde ich eine eine Methode vom typ boolean hinzufügen die abfragt ob das Befehl der Kommandozeile dazu sorgt dass der Roboter evtl auf einen Hinderniss landet und wenn ja liefert er false ansonsten true? was hälr ihr von der Idee?

```
public static void bewegeRover(char c) {
        if(prüfeObHindernisLiegt(c) == false) return;
        
        if (c == 'f') {
        /:::::::}
    
        
    }
    
    
    public static boolean prüfeObHindernisLiegt(char c){
        //prüfe ob der Befehl daz´zu sorgt ob der rover auf ein hindenrisslandet wenn ja return false sonst return true
        
        
        
    }
```


----------



## Heyoka955 (14. Apr 2019)

habe die aufgabe gelöst. Jungs das war eig easy,  ich hatte leider ein schritt zu früh nachgedacht.
aber es gibt ein probem, wenn ich jetzt scheibe dass er nach links gehen soll, dann tut er es nicht erb bleibt städnig da stehen, woran liegt das





```
package rover;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;

public class Start {

    static Random r = new Random();
    static LinkedHashMap<int[], String> marsKarte;
    static int BREITE_MARSES = 80;                         
    static int HOEHE_MARSES = 20;           
    static int ROVER_XPOSITION = BREITE_MARSES / 2;   
    static int ROVER_YPOSITION = HOEHE_MARSES / 2;
    
    
    public static void erstelleKarteUndSetzeRoverInDieMitte() {
        marsKarte = new LinkedHashMap<>();
        int[] positionVomHindernis;
        
        for (int i = 0; i < BREITE_MARSES; i++) {
            for (int j = 0; j < HOEHE_MARSES; j++) {
                positionVomHindernis = new int[] { i, j };
                if (r.nextDouble() < 0.25 && !(ROVER_XPOSITION == i && ROVER_YPOSITION == j))
                    marsKarte.put(positionVomHindernis, "#"); //Füge zur LinkedHashMap die Position auf der sich ein Hindernis befindet.
            }
        }
        marsKarte.put(new int[] {ROVER_XPOSITION , ROVER_YPOSITION }, "n"); //Erzeuge den Roboter auf den jeweiligen Positionen
    }   
    
    
    
    
    public static int[] bestimmeWidthUndHeight(Set<int[]> KoordinatenVonKarte) {
        int[] MaxGrenzeVonKoordinaten = new int[2];
        for (int[] e : KoordinatenVonKarte) {
            if (e[0] > MaxGrenzeVonKoordinaten[0])
                MaxGrenzeVonKoordinaten[0] = e[0];
            if (e[1] > MaxGrenzeVonKoordinaten[1])
                MaxGrenzeVonKoordinaten[1] = e[1];
        }
        return MaxGrenzeVonKoordinaten;
    }
    
    public static String getRoverUndHindernisse(Map<int[], String> ObjekteVonMarskarte, int[] derzeitigePosition) {
        Set<Entry<int[], String>> entrySet = ObjekteVonMarskarte.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getKey()[0] == derzeitigePosition[0] && entry.getKey()[1] == derzeitigePosition[1])
                return entry.getValue();
        }
        return null;
    }


    
    public static void printeDasFeld() {
        // Set<int[]> keySet = marsKarte.keySet();
        //for (int[] e : keySet) {
        //if (e[0] == 39 && e[1] == 10)
        //System.err.println(marsKarte.get(e) + " " + e.hashCode());
         //}
        
        
        
         if(!pruefeObHindernisLiegt()) return; //Falls die Nächste Bewegung auf dem Hindernis sein sollte.
        
        

        int[] GroesseUndBreite = bestimmeWidthUndHeight(marsKarte.keySet());
        for (int j = 0; j < GroesseUndBreite[1]; j++) {
            for (int i = 0; i < GroesseUndBreite[0]; i++) {
                //System.out.println(i + "," + j + ": " + getRoverUndHindernisse(marsKarte, new int[] { i, j }));


                if (getRoverUndHindernisse(marsKarte, new int[] { i, j }) == null) {
                    System.out.print(" ");
                    continue;
                }
                
                if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("#"))
                    System.out.print("#");
                else if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("n"))
                    System.out.print("^");
                else if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("s"))
                    System.out.print("V");
                else if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("e"))
                    System.out.print(">");
                if (getRoverUndHindernisse(marsKarte, new int[] { i, j }).equals("w"))
                    System.out.print("<");

            }
            System.out.println();
        }
        for (int i = 0; i < GroesseUndBreite[0]; i++) {
            System.out.print("=");
        }
        System.out.println();
    }

    public static void main(String[] args) {

        if (args.length > 1) {
            long seed = Long.parseLong(args[1]);
            r.setSeed(seed);
            // System.out.println("Seed: " + seed);
        }
        erstelleKarteUndSetzeRoverInDieMitte();
        String RichtungsOptionen = args[0];
        printeDasFeld();
        for (int i = 0; i < RichtungsOptionen.length(); i++) {
            bewegeRover(RichtungsOptionen.charAt(i));
            printeDasFeld();
        }
    }

    public static void bewegeRover(char c) {
        
        
        if (c == 'f') {
            int[] aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n"))
                aktuellePosition[1]--;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s"))
                aktuellePosition[1]++;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e"))
                aktuellePosition[0]++;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w"))
                aktuellePosition[0]--;
                
        } else if (c == 'b') {
            int[] aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s"))
                aktuellePosition[1]--;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n"))
                aktuellePosition[1]++;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w"))
                aktuellePosition[0]++;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e"))
                aktuellePosition[0]--;
        } else if (c == 'l') {
            int[] aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n"))
                marsKarte.put(aktuellePosition, "w");
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s"))
                marsKarte.put(aktuellePosition, "e");
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e"))
                marsKarte.put(aktuellePosition, "n");
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w"))
                marsKarte.put(aktuellePosition, "s");
        } else if (c == 'r') {
            int[] aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w"))
                marsKarte.put(aktuellePosition, "n");
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e"))
                marsKarte.put(aktuellePosition, "s");
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n"))
                marsKarte.put(aktuellePosition, "e");
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s"))
                marsKarte.put(aktuellePosition, "w");
        }
    
        
    }
    public static boolean pruefeObHindernisLiegt(){
        int[] aktuellePosition = findeRover();
        if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("#"))
            return false;
        
        return true;
    }
    
    

    private static int[] findeRover() {
        
        
        Set<Entry<int[], String>> entrySet = marsKarte.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getValue() != null && !entry.getValue().equals("#"))
                return entry.getKey();
            
            
        }
        throw new IllegalStateException("Rover missing in action");
    }

}
```


**


----------



## kneitzel (14. Apr 2019)

Kannst Du einmal erläutern, was Du aus welchem Grund geändert hast?

Ich sehe zum einen die neue Funktion pruefeObHindernisLiegt und den Aufruf in deiner printeDasFeld Funktion. Evtl. gehst Du noch einmal einen Schritt zurück und beschreibst noch einmal, was Du wann genau machen willst. Und dann können wir mal überlegen, was Deine Änderungen überhaupt machen ...


----------



## Heyoka955 (14. Apr 2019)

kneitzel hat gesagt.:


> Kannst Du einmal erläutern, was Du aus welchem Grund geändert hast?
> 
> Ich sehe zum einen die neue Funktion pruefeObHindernisLiegt und den Aufruf in deiner printeDasFeld Funktion. Evtl. gehst Du noch einmal einen Schritt zurück und beschreibst noch einmal, was Du wann genau machen willst. Und dann können wir mal überlegen, was Deine Änderungen überhaupt machen ...


Also ich wollte das falls er über ein Hindernis stolpern sollte, also er die gleichen Koordinaten hat, dann sollte er das feld nichtmal also diesen Befehl ignorieren aber das Problem hierbei ist falls danach ein Befehl kommen sollte die besagt geh jetzt nach links und der Rover kann nach links dann bleibt er dennoch an der Position stehen das heißt. 

Der Rover bleibt immer stehen.

Das könnte daran liegen dass er evtl immer auf der Position des # liegt. 

Was könne man machen?

Wäre echt froh wenn ich die Aufgabe heute zu Ende habe


----------



## kneitzel (14. Apr 2019)

Du musst genauer formulieren! Du bist die ganze Zeit extrem ungenau und das könnte der Grund für Deine Probleme sein.

Derzeit prüfst du, ob der Rover auf einem Hindernis ist. Aber Du willst doch den Rover gar nicht auf die Position eines Hindernisses bringen. Und dann prüfst Du in der Ausgabe? Also zeigst einfach nichts an, wenn der Rover auf einem Hindernis ist?

Also nochmal im Detail drüber nachdenken und dann mal genau formulieren, was wann geprüft werden sollte und was dann auf Basis der Erkenntnis gemacht werden muss....


----------



## Heyoka955 (14. Apr 2019)

kneitzel hat gesagt.:


> Du musst genauer formulieren! Du bist die ganze Zeit extrem ungenau und das könnte der Grund für Deine Probleme sein.
> 
> Derzeit prüfst du, ob der Rover auf einem Hindernis ist. Aber Du willst doch den Rover gar nicht auf die Position eines Hindernisses bringen. Und dann prüfst Du in der Ausgabe? Also zeigst einfach nichts an, wenn der Rover auf einem Hindernis ist?
> 
> Also nochmal im Detail drüber nachdenken und dann mal genau formulieren, was wann geprüft werden sollte und was dann auf Basis der Erkenntnis gemacht werden muss....


genau so habe ich das gemacht ! aber wie schaffe ich es dass der rover nicht auf einem hinderniss landet?

oder ist es vielleicht nicht möglich dass nachdem der rover auf dem Hindernis gelandet ist, ich die werte dann zurücksetze also so



```
public static void pruefeObHindernisLiegt(){
        int[] aktuellePosition = findeRover();
        if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("#")){
            // hier ein befehl schreiben das dazu sorgt dass dass aktuelle position auf den gleichen wert bleibt
          
        }
       
    }

//dafür müsste ich die methoder aber ändern
```


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> aber wie schaffe ich es dass der rover nicht auf einem hinderniss landet?
> 
> oder ist es vielleicht nicht möglich dass nachdem der rover auf dem Hindernis gelandet ist, ich die werte dann zurücksetze


Warum schreibst Du so wirres Zeug?

Nur mal so als Gedanke: wenn ich mit meinem Auto nicht gegen eine Wand fahren will, dann weiche ich der Wand möglichst vorher aus.


----------



## kneitzel (14. Apr 2019)

Wie gehst Du denn vor, wenn Du auf einem Gebiet bist, bei denen Du abstürzen kannst?
Du bewegst Dich einfach und prüft, ob Du fällst? Und dann überlegst Du, ob Du vielleicht irgendwie zurück kommst?

Oder gehst Du anders vor?


----------



## Heyoka955 (14. Apr 2019)

kneitzel hat gesagt.:


> Wie gehst Du denn vor, wenn Du auf einem Gebiet bist, bei denen Du abstürzen kannst?
> Du bewegst Dich einfach und prüft, ob Du fällst? Und dann überlegst Du, ob Du vielleicht irgendwie zurück kommst?
> 
> Oder gehst Du anders vor?


ja ich weiß was ihr meint und die Logik ist klar aber dann muss ich doch eine Methode schreiben, die auf next key überprüft, aber keine Ahnung wie das gehen soll.


----------



## mihe7 (14. Apr 2019)

Gehen ist das Stichwort: in der Bewegungsmethode steht doch bereits drin, wie sich der Rover bewegen würde, wenn es dazu käme.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Gehen ist das Stichwort: in der Bewegungsmethode steht doch bereits drin, wie sich der Rover bewegen würde, wenn es dazu kommt.


ja ihr gebt manchmal so oberflächliche tipps hahaha, also ja aber da wird der fall nicht abgedeckt den ich haben will. Ich weiß dass das mit der Methode zu tun hat aber wie greife ich auf den wert zu ?


----------



## Heyoka955 (14. Apr 2019)

Heyoka955 hat gesagt.:


> ja ihr gebt manchmal so oberflächliche tipps hahaha, also ja aber da wird der fall nicht abgedeckt den ich haben will. Ich weiß dass das mit der Methode zu tun hat aber wie greife ich auf den wert zu ?


sag mal bitte zeile für zeiel wo das Problem ist?


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> sag mal bitte zeile für zeiel wo das Problem ist?


OK.

Hier:


Heyoka955 hat gesagt.:


> ja ihr gebt manchmal so oberflächliche tipps


Ja, wir schreiben gerne 150 Kommentare, wo zwei, drei reichen würden.

Dann hier:


Heyoka955 hat gesagt.:


> da wird der fall nicht abgedeckt den ich haben will.


So? Der Fall, dass sich der Rover bewegt wird hier also nicht abgedeckt?


Und hier:


Heyoka955 hat gesagt.:


> aber wie greife ich auf den wert zu ?


Auf welchen Wert?


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> OK.
> 
> Hier:
> 
> ...


ja haha, abe rich weiß immernoch nicht wie ich es schaffe auf den wert zuzugreifen?


----------



## mihe7 (14. Apr 2019)

Auf welchen Wert?


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Auf welchen Wert?


schau also ich will versuchen abzufragen ob der nächste wert auf den der rover liegt ein hinderniss ist, dafür habe ich auch eine Methode geschrieben die das abfängt. Aber mein Problem ist dass ich nicht weiß wie ich es schaffe in der Methode dass rover nicht mehr auf aufm hinderniss liegt sondern auf dem platz davor.


```
//public static boolean pruefeObHindernisLiegt(){
        //int[] aktuellePosition = findeRover();
        //if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("#")){
            
            //geh zurück zur vorherigen position
        //}
        //return true;
    //}
```

wenn du mr nicht helfen kannst, dann wäre es cool wenn du mir die lösung geben würdest.
Bin mit nerven am ende. 
15 stundne für ein kleines Problem, wie gut dass ich eh im Consulting oder projekt Management gehen will. lol haha


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> schau also ich will versuchen abzufragen ob der nächste wert auf den der rover liegt ein hinderniss ist,


Du willst also prüfen, ob an einer bestimmten Position in der Karte ein Hindernis liegt. Dafür hast Du doch schon eine Methode: getRoverUndHindernisse. Du musst also nur die nächste Position bestimmen und wie das geht steht ja bereits in Deiner Bewegungsmethode.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Du willst also prüfen, ob an einer bestimmten Position in der Karte ein Hindernis liegt. Dafür hast Du doch schon eine Methode: getRoverUndHindernisse. Du musst also nur die nächste Position bestimmen und wie das geht steht ja bereits in Deiner Bewegungsmethode.


Aber wo schreibe ich die hin? In welche Methode rein ?


----------



## Xyz1 (14. Apr 2019)

Wenn man alles auskommentiert, dann nützen Java Tags nix!



Heyoka955 hat gesagt.:


> 15 stundne für ein kleines Problem, wie gut dass ich eh im Consulting oder projekt Management gehen will. lol haha


Bitte Consulting.  die suchen händeringend.


----------



## mihe7 (14. Apr 2019)

Tobias-nrw hat gesagt.:


> Bitte Consulting.  die suchen händeringend.


So händeringend können die gar nicht suchen...


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> Aber wo schreibe ich die hin? In welche Methode rein ?


Du willst bei einer Bewegung sicherstellen, dass der Rover nicht auf ein Hindernis fährt. Dann würde es sich anbieten, das auch in der Bewegungsmethode abzufangen, findest Du nicht?


----------



## mrBrown (14. Apr 2019)

Heyoka955 hat gesagt.:


> 15 stundne für ein kleines Problem, wie gut dass ich eh im Consulting oder projekt Management gehen will. lol haha


Um realistisch zu bleiben: aktuell sieht das weder nach Consulting oder projekt Management im IT-Bereich aus, vielleicht eher im sozialen Bereich oder so


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Du willst bei einer Bewegung sicherstellen, dass der Rover nicht auf ein Hindernis fährt. Dann würde es sich anbieten, das auch in der Bewegungsmethode abzufangen, findest Du nicht?


Das hattte ich vor aber wie mache ich das 
Ich wollte das ganze Zeit machen aber ich weiß nicht wie ich daaa codieren soll.


----------



## mihe7 (14. Apr 2019)

mrBrown hat gesagt.:


> vielleicht eher im sozialen Bereich oder so


Wenn der so weiter macht, dann fange ich dort an.


----------



## Heyoka955 (14. Apr 2019)

Tobias-nrw hat gesagt.:


> Wenn man alles auskommentiert, dann nützen Java Tags nix!
> 
> 
> Bitte Consulting.  die suchen händeringend.



Du liest echt alles mit uns gibst kein Senf


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> Ich wollte das ganze Zeit machen aber ich weiß nicht wie ich daaa codieren soll.


Nimm einfach die Tastatur, damit gehts am Besten.



Heyoka955 hat gesagt.:


> Du liest echt alles mit uns gibst kein Senf


Ist ja nicht jeder ein Sozialarbeiter.


----------



## Heyoka955 (14. Apr 2019)

mihe7 hat gesagt.:


> Wenn der so weiter macht, dann fange ich dort an.


Hahahahahahahahahahahahahaah ich programmiere seit Dezember. Kannst kein Wunderwerke erwarten.
Ich habe ja verstanden wie ich das mache.
Meine Idee wäre jetzt 
Nach den ganzen if abfragen der Bewegungen eine letzte if abfrage zu machen wo ich diese anfange.


----------



## mrBrown (14. Apr 2019)

Heyoka955 hat gesagt.:


> Hahahahahahahahahahahahahaah


"Hahahahahahahahahahahahahaah" hab ich hier auch schon öfter gedacht...




Heyoka955 hat gesagt.:


> Nach den ganzen if abfragen der Bewegungen eine letzte if abfrage zu machen wo ich diese anfange.


Du willst also ERST die Bewegung ausführen und DANACH testen, ob die Bewegung überhaupt möglich ist?


----------



## mihe7 (14. Apr 2019)

Heyoka955 hat gesagt.:


> Kannst kein Wunderwerke erwarten.


Erstens sind das keine Wunderwerke und zweitens erwarte nicht ich etwas sondern Dein Prof  



Heyoka955 hat gesagt.:


> Nach den ganzen if abfragen der Bewegungen eine letzte if abfrage zu machen wo ich diese anfange.


Ich habe Dir doch genau geschrieben, was Du tun musst.  Algorithmus:
1. Sei x die nächste Position des Rovers
2. Ist an x ein Hindernis? Falls ja, ENDE, sonst weiter mit 3
3. Bewege Rover


----------



## Xyz1 (15. Apr 2019)

Heyoka955 hat gesagt.:


> Du liest echt alles mit uns gibst kein Senf


Sorry, aber als ich das mit Consulting gelesen habe, musste ich echt herzlich lachen.  (sogar ohne Unterbrechung)

Aber ne, 170 postings lese ich dann doch nicht... Deswegen sind jetzt wahrscheinlich keine weiteren "Unterbrechungen" durch mich zu erwarten.  Du könntest Dich aber etwas "zusammennehmen".


----------



## Heyoka955 (15. Apr 2019)

also so


mihe7 hat gesagt.:


> Erstens sind das keine Wunderwerke und zweitens erwarte nicht ich etwas sondern Dein Prof
> 
> 
> Ich habe Dir doch genau geschrieben, was Du tun musst.  Algorithmus:
> ...



so in etwa ?

```
public static void bewegeRover(char c) {
        
        if(!kollisionAbfangen()){
             return;
        }
        if (c == 'f') {
            int[] aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n"))
                aktuellePosition[1]--;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s"))
                aktuellePosition[1]++;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e"))
                aktuellePosition[0]++;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w"))
                aktuellePosition[0]--;
                
        } else if (c == 'b') {
            int[] aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s"))
                aktuellePosition[1]--;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n"))
                aktuellePosition[1]++;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w"))
                aktuellePosition[0]++;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e"))
                aktuellePosition[0]--;
        } else if (c == 'l') {
            int[] aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n"))
                marsKarte.put(aktuellePosition, "w");
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s"))
                marsKarte.put(aktuellePosition, "e");
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e"))
                marsKarte.put(aktuellePosition, "n");
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w"))
                marsKarte.put(aktuellePosition, "s");
        } else if (c == 'r' ) {
            int[] aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w"))
                marsKarte.put(aktuellePosition, "n");
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e"))
                marsKarte.put(aktuellePosition, "s");
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n"))
                marsKarte.put(aktuellePosition, "e");
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s"))
                marsKarte.put(aktuellePosition, "w");
                
                

        }
        
    }
    public static boolean kollisionAbfangen(){
        int[] aktuellePosition = findeRover();
        if(getRoverUndHindernisse(marsKarte, aktuellePosition).equals("#")){
            return false;
            
        }
        
        return true;
    }
```


----------



## Heyoka955 (15. Apr 2019)

Tobias-nrw hat gesagt.:


> Sorry, aber als ich das mit Consulting gelesen habe, musste ich echt herzlich lachen.  (sogar ohne Unterbrechung)
> 
> Aber ne, 170 postings lese ich dann doch nicht... Deswegen sind jetzt wahrscheinlich keine weiteren "Unterbrechungen" durch mich zu erwarten.  Du könntest Dich aber etwas "zusammennehmen".


ich bin im zweiten Semester, wieos habt ihr alle so hohe erwartungen


----------



## mrBrown (15. Apr 2019)

Guck nur mal deine kollisionAbfangen-Methode an.

Wann genau gibt die false zurück?


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> Guck nur mal deine kollisionAbfangen-Methode an.
> 
> Wann genau gibt die false zurück?


wenn da ein hinderniss vorhanden ist


----------



## mrBrown (15. Apr 2019)

Heyoka955 hat gesagt.:


> ich bin im zweiten Semester, wieos habt ihr alle so hohe erwartungen


Weil die meisten von uns auch mal im zweiten Semester waren oder anderweitig die dort gestellten Anforderungen kennen und einschätzen können.


----------



## mrBrown (15. Apr 2019)

Heyoka955 hat gesagt.:


> wenn da ein hinderniss vorhanden ist


*WO*?


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> *WO*?




```
if(getRoverUndHindernisse(marsKarte, aktuellePosition).equals("#")){
            return false;
            
        }
```


hattet ihr denn vorkenntisse?


----------



## mrBrown (15. Apr 2019)

Um das *WO* genauer auszudrücken: Das Hindernis welches du grad testest, liegt an welcher Position?



Heyoka955 hat gesagt.:


> hattet ihr denn vorkenntisse?


Im zweiten Semester hat man üblicherweise die Vorkenntnisse des ersten Semesters, und auch nur  auf diese ist der vermittelte und voraussetzte Stoff ausgelegt.


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> Um das *WO* genauer auszudrücken: Das Hindernis welches du grad testest, liegt an welcher Position?
> 
> 
> Im zweiten Semester hat man üblicherweise die Vorkenntnisse des ersten Semesters, und auch nur  auf diese ist der vermittelte und voraussetzte Stoff ausgelegt.


ok was ist nun mit meinem Problem?


----------



## mihe7 (15. Apr 2019)

Heyoka955 hat gesagt.:


> ich bin im zweiten Semester, wieos habt ihr alle so hohe erwartungen


Nochmal: das sind nicht unsere Erwartungen, sondern die Deiner Uni. Und ja, einen Hauch von Abstraktionsvermögen und logischem Denken darf man erwarten.


----------



## mihe7 (15. Apr 2019)

Heyoka955 hat gesagt.:


> ok was ist nun mit meinem Problem?


Hast Du seine Frage schon beantwortet? (Erste Zeile in dem von Dir zitierten Fragment)


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> Nochmal: das sind nicht unsere Erwartungen, sondern die Deiner Uni. Und ja, einen Hauch von Abstraktionsvermögen und logischem Denken darf man erwarten.


schau mal ist das richtig wie ch das jetzt gemacht habe? war das so wie du das meintest? Wenn ja dann funz das leider immer noch nicht


----------



## mihe7 (15. Apr 2019)

Heyoka955 hat gesagt.:


> schau mal ist das richtig wie ch das jetzt gemacht habe? war das so wie du das meintest?


Siehe Kommentar von @mrBrown


----------



## Heyoka955 (15. Apr 2019)

Heyoka955 hat gesagt.:


> schau mal ist das richtig wie ch das jetzt gemacht habe? war das so wie du das meintest?





mrBrown hat gesagt.:


> Um das *WO* genauer auszudrücken: Das Hindernis welches du grad testest, liegt an welcher Position?
> 
> 
> Im zweiten Semester hat man üblicherweise die Vorkenntnisse des ersten Semesters, und auch nur  auf diese ist der vermittelte und voraussetzte Stoff ausgelegt.


an dergleichen wie der rover


----------



## mrBrown (15. Apr 2019)

Also:
Du prüfst, ob an der Stelle, an der der Rover AKTUELL steht, ein Hindernis ist.
Inwiefern hilft dir das, zu verhindern, dass der Rover sich danach auf ein Hindernis bewegt?


----------



## mihe7 (15. Apr 2019)

Heyoka955 hat gesagt.:


> an dergleichen wie der rover


Jetzt schau Dir nochmal Algorithmus aus Kommentar #174, Schritt 1 an. Fällt Dir was auf?


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> Also:
> Du prüfst, ob an der Stelle, an der der Rover AKTUELL steht, ein Hindernis ist.
> Inwiefern hilft dir das, zu verhindern, dass der Rover sich danach auf ein Hindernis bewegt?


Garnicht eig, weil er ja schon da ist. Das heißt ich muss sorgen dass er garnicht Dahin kommt. Aber wie


----------



## mrBrown (15. Apr 2019)

Gute Frage, wie könnte man wohl verhindern, dass der Rover auf ein Hindernis fährt?

Man muss testen, ob an der Zielposition ein Hindernis ist und wenn ja, den Rover nicht dort hin fahren lassen lassen.

Kommst du selbst drauf?


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> Erstens sind das keine Wunderwerke und zweitens erwarte nicht ich etwas sondern Dein Prof
> Wie ubereg
> 
> Ich habe Dir doch genau geschrieben, was Du tun musst.  Algorithmus:
> ...





mihe7 hat gesagt.:


> Erstens sind das keine Wunderwerke und zweitens erwarte nicht ich etwas sondern Dein Prof
> 
> 
> Ich habe Dir doch genau geschrieben, was Du tun musst.  Algorithmus:
> ...


das habe ich doch gemacht denn? ich habe die aktuelle position und dort habe ich auch abgefangen ob das ein hindernis ist?


----------



## mrBrown (15. Apr 2019)

Der Unterschied zwischen "1. Sei x die nächste Position des Rovers" und "ich habe die aktuelle position" fällt dir der schon selbst auf? (Falls nicht: wie bist du im Grundschulalter an eine Uni gekommen??)


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> Gute Frage, wie könnte man wohl verhindern, dass der Rover auf ein Hindernis fährt?
> 
> Man muss testen, ob an der Zielposition ein Hindernis ist und wenn ja, den Rover nicht dort hin fahren lassen lassen.
> 
> Kommst du selbst drauf?


so wollte ich das ganze zeit machen, aber ich wusste nict wie ich das mit den programmier werkzeugen mache.
ich weiß was ich machen muss aber nicht wie. Das ist das Problem.
ja klar aber wie übergebe ich die da die nächste position


----------



## mrBrown (15. Apr 2019)

Heyoka955 hat gesagt.:


> so wollte ich das ganze zeit machen, aber ich wusste nict wie ich das mit den programmier werkzeugen mache.
> ich weiß was ich machen muss aber nicht wie. Das ist das problem


Dann unabhängig von den "programmier werkzeugen", welche Schritte musst du denn dafür machen?


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> Dann unabhängig von den "programmier werkzeugen", welche Schritte musst du denn dafür machen?


ich übergebe die nächste Position die er gehen soll und überprüfe ob dann dieser auf Hindernis liegt wenn ja dann returnt er false.

Nun die frage wie mache ich das genau


----------



## mihe7 (15. Apr 2019)

Der schafft uns alle noch.


----------



## mrBrown (15. Apr 2019)

Kannst du denn irgendwie die nächste Position zu die er gehen soll bestimmen?
Kannst du irgendwie ermitteln, was an einer Position liegt?
Wenn du weißt, was an einer Position liegt, kannst du irgendwie testen, ob es ein Hindernis ist?


----------



## Xyz1 (15. Apr 2019)

Heyoka955 hat gesagt.:


> ich bin im zweiten Semester, wieos habt ihr alle so hohe erwartungen


Dann überleg mal, wie weit Du schon bist... Du hast eine Hochschulzugangsberechtigung erworben. Und Du hast das erst Semester unbeschadet überstanden. (was ich gut finde!) Also folgen nur noch ca 2,5 Jahre Mindest- oder Regelstudienzeit.
Dementsprechend solltest Du Dich aber nicht wie ein kleines Kind verhalten, etwas lapidar formuliert.


----------



## Heyoka955 (15. Apr 2019)

Tobias-nrw hat gesagt.:


> Dann überleg mal, wie weit Du schon bist... Du hast eine Hochschulzugangsberechtigung erworben. Und Du hast das erst Semester unbeschadet überstanden. (was ich gut finde!) Also folgen nur noch ca 2,5 Jahre Mindest- oder Regelstudienzeit.
> Dementsprechend solltest Du Dich aber nicht wie ein kleines Kind verhalten, etwas lapidar formuliert.





mrBrown hat gesagt.:


> Kannst du denn irgendwie die nächste Position zu die er gehen soll bestimmen?
> Kannst du irgendwie ermitteln, was an einer Position liegt?
> Wenn du weißt, was an einer Position liegt, kannst du irgendwie testen, ob es ein Hindernis ist?


leider nein,


----------



## mrBrown (15. Apr 2019)

Okay, schaffst du es denn irgendwann mal, sinnvoll zu zitieren und ganze Sätze zu schreiben?


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> Okay, schaffst du es denn irgendwann mal, sinnvoll zu zitieren und ganze Sätze zu schreiben?


Leider nein nein Spaß

Mit der move Methode kann man das doch bestimmen was als nächstes kommt.
Aber ernsthaft an da hatte ich Probleme


----------



## mrBrown (15. Apr 2019)

Heyoka955 hat gesagt.:


> Mit der move Methode kann man das doch bestimmen was als nächstes kommt.


Die move-Methode bewegt den Rover.  Das bestimmen des Ziels ist allerdings ein Teil davon, du musst nur noch rausfinden, welcher, und wie du den nutzen kannst.


----------



## Heyoka955 (15. Apr 2019)

diese codezeilen : marsKarte.put(aktuellePosition, "e") und aktuellePosition[0]--;, 

der erstere dient eher zum bestimmen und zweite für die schritte


----------



## mrBrown (15. Apr 2019)

Also:

dies:


Heyoka955 hat gesagt.:


> marsKarte.put(aktuellePosition, "e")


bestimmt die nächste Position

und dies:


Heyoka955 hat gesagt.:


> aktuellePosition[0]--;


Bewegt den Rover dann an die Position? (meinst du mit "die schritte", oder?)


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> Also:
> 
> dies:
> 
> ...





Heyoka955 hat gesagt.:


> diese codezeilen : marsKarte.put(aktuellePosition, "e") und aktuellePosition[0]--;,


Ja genau jetzt muss ich irgendwie das bestimmen in meine neue Methode einbinden


----------



## Heyoka955 (15. Apr 2019)

Heyoka955 hat gesagt.:


> Ja genau jetzt muss ich irgendwie das bestimmen in meine neue Methode einbinden


Aber wie


----------



## mrBrown (15. Apr 2019)

Du musst erstmal ausfinden, was denn jetzt eigentlich die neue Position ist.

Hint: Es ist nur eine der beiden Codezeilen, die du genannt hast.


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> Du musst erstmal ausfinden, was denn jetzt eigentlich die neue Position ist.
> 
> Hint: Es ist nur eine der beiden Codezeilen, die du genannt hast.


Die erste das den Wert des arrays erhöht


----------



## mrBrown (15. Apr 2019)

Heyoka955 hat gesagt.:


> Die erste das den Wert des arrays erhöht


In Bezug auf dieses ist nur die Hälfte des Satzes richtig: 


Heyoka955 hat gesagt.:


> diese codezeilen : marsKarte.put(aktuellePosition, "e") und aktuellePosition[0]--;,


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> In Bezug auf dieses ist nur die Hälfte des Satzes richtig:


Ja sorry dachte wäre verständlich also aktuellePosition[0]--;,


----------



## flopalko (15. Apr 2019)

Heyoka955 hat gesagt.:


> schau also ich will versuchen abzufragen ob der nächste wert auf den der rover liegt ein hinderniss ist, dafür habe ich auch eine Methode geschrieben die das abfängt. Aber mein Problem ist dass ich nicht weiß wie ich es schaffe in der Methode dass rover nicht mehr auf aufm hinderniss liegt sondern auf dem platz davor.
> 
> 
> ```
> ...


Auch im Consulting, bzw. vor allem da, braucht man Leute die Ahnung haben und sicherlich nicht dich...


----------



## Heyoka955 (15. Apr 2019)

flopalko hat gesagt.:


> Auch im Consulting, bzw. vor allem da, braucht man Leute die Ahnung haben und sicherlich nicht dich...





flopalko hat gesagt.:


> Auch im Consulting, bzw. vor allem da, braucht man Leute die Ahnung haben und sicherlich nicht dich...


Hast du echt nix besseres zu tun als Nachrichten von Random Leuten zu lesen...

Traurig


----------



## mrBrown (15. Apr 2019)

Heyoka955 hat gesagt.:


> Hast du echt nix besseres zu tun als Nachrichten von Random Leuten zu lesen...
> 
> Traurig


Sollen wir alle aufhören, deine "Nachrichten" zu lesen?


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> Sollen wir alle aufhören, deine "Nachrichten" zu lesen?


Am besten nur die Leute die helfen wollen sollen kommentieren


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> Sollen wir alle aufhören, deine "Nachrichten" zu lesen?





Heyoka955 hat gesagt.:


> Am besten nur die Leute die helfen wollen sollen kommentieren



Leute die flemmen, sollen woanders hin. Also du


----------



## mrBrown (15. Apr 2019)

Heyoka955 hat gesagt.:


> Leute die flemmen, sollen woanders hin. Also du


Okay.

btw, es heißt "flennen".


----------



## flopalko (15. Apr 2019)

mrBrown hat gesagt.:


> Okay.
> 
> btw, es heißt "flennen".


Ich glaube er meint "flamen"
Jedenfalls sollte er mal die Grundlagen lernen und nicht wegen jedem Blödsinn hier mehrere Threads aufmachen, auf keine Hilfe eingehen und glauben seine Arbeit sei mehr als 100k€ Wert...


----------



## kneitzel (15. Apr 2019)

mihe7 hat gesagt.:


> Nimm einfach die Tastatur, damit gehts am Besten.



Ich glaube das war bisher die beste Antwort. Hat mir meinen Morgen auf jeden Fall gerettet.


----------



## kneitzel (15. Apr 2019)

Heyoka955 hat gesagt.:


> diese codezeilen : marsKarte.put(aktuellePosition, "e") und aktuellePosition[0]--;,
> 
> der erstere dient eher zum bestimmen und zweite für die schritte


Also ich bin mir hier relativ sicher, dass Du nicht verstanden hast, was der Code wirklich macht! Selbst durch das reine Lesen der Aufgabenstellung sollte man schon verstanden haben, dass der Rover sich vor und zurück bewegen kann (=> Bewegung im Sinne von Feld wechseln) und er sich einfach nur drehen kann (=> Kein Wechsel des Feldes).

Und genau das findet sich in dem Code ja dann auch.

Hast Du denn den Algorithmus mal mit Papier und Stift durchgespielt? Damit du verstehst, was da wirklich passiert? Das habe ich dir schon mindestens zwei mal geraten meine ich! Und wenn Du unsere Ratschläge nicht befolgen willst, dann müssen wir Dir die auch nicht weiter geben.

@All: Ich entführe jetzt den Thread jetzt mal etwas:

Beim Ansehen des Codes: Läuft es euch auch kalt den Rücken runter? Bei jeder Code Revision würde ich da ja richtig verhauen bei sowas.
Den Punkt mit dem Array als Key habe ich ja schon erwähnt, aber der Code, der den Rover bewegt, verändert den Key einer Collection.... Ok, das ändert hier ja ehh nichts, da ja HashCode und equals ehh nicht wirklich nutzbar sind (bzw. das Ändern des Arrays verändert den HashCode nicht). Aber das ist ein Pattern, das einen ja förmlich anschreit. Collections, welche auf HashCodes basieren, werden dadurch nicht mehr funktionieren, da der Key nun bei einem HashCode gespeichert ist, der nicht mehr dem HashCode des Keys entspricht.

Und ich frage mich, was hier hinter steckt. Ist das ein Professor, der keine Ahnung hat? Oder ist evtl. die Erwartungshaltung an die Studenten, die wirklich 100 Punkte kriegen wollen, dass diese Speicher-Problematik auch gesehen und angepasst wird?


----------



## temi (15. Apr 2019)

kneitzel hat gesagt.:


> Oder ist evtl. die Erwartungshaltung an die Studenten, die wirklich 100 Punkte kriegen wollen, dass diese Speicher-Problematik auch gesehen und angepasst wird?



Diese Zusammenhänge (mit allen negativen Konsequenzen) zu Erkennen finde ich in diesem Lernstadium schon ziemlich schwierig. Ich hab ehrlich gesagt auch erst mal schauen müssen, wie die beim Bewegen geänderten Koordinaten überhaupt zurück in die Map kommen. Aber ich hab ja auch nicht Informatik studiert 

Ich hoffe der Prof spielt auf den dritten Teil der Aufgabe an, wo geeignete Datenstrukturen verwendet werden sollen...


----------



## kneitzel (15. Apr 2019)

temi hat gesagt.:


> Diese Zusammenhänge (mit allen negativen Konsequenzen) zu Erkennen finde ich in diesem Lernstadium schon ziemlich schwierig. Ich hab ehrlich gesagt auch erst mal schauen müssen, wie die beim Bewegen geänderten Koordinaten überhaupt zurück in die Map kommen. Aber ich hab ja auch nicht Informatik studiert
> 
> Ich hoffe der Prof spielt auf den dritten Teil der Aufgabe an, wo geeignete Datenstrukturen verwendet werden sollen...



Dabei fehlt uns aber das Wissen, was die Studenten bereits wissen bzw. wissen sollten. Ich weiss nur, dass unsere Profs damals von uns erwartet haben, eine Sprache in 2 Wochen zu beherrschen - selbst beigebracht! Eigentlich seien nur 2 Tage notwendig, aber da wir ja andere Vorlesungen auch hatten, wurde es zu 2 Wochen ausgedehnt. 

Daher ist die Frage, ob das Thema HashCodes und darauf basierende Datenstrukturen bereits Thema war, aber das werden wir wohl nicht erfahren.  Und ich hätte doch immer erst die Objektorientierung erläutert ehe ich auf die Library und soche Dinge eingehe ...

Aber im Augenblick scheint mir dies ein bewusst gewähltes Problem im Code zu sein...


----------



## Heyoka955 (15. Apr 2019)

kneitzel hat gesagt.:


> Also ich bin mir hier relativ sicher, dass Du nicht verstanden hast, was der Code wirklich macht! Selbst durch das reine Lesen der Aufgabenstellung sollte man schon verstanden haben, dass der Rover sich vor und zurück bewegen kann (=> Bewegung im Sinne von Feld wechseln) und er sich einfach nur drehen kann (=> Kein Wechsel des Feldes).
> 
> Und genau das findet sich in dem Code ja dann auch.
> 
> ...


Die Methode bewegt das Objekt zusätzlich, bestimmt er die Richtungen indem er es in der map als value von nem key speichert.


----------



## Heyoka955 (15. Apr 2019)

Heyoka955 hat gesagt.:


> Die Methode bewegt das Objekt zusätzlich, bestimmt er die Richtungen indem er es in der map als value von nem key speichert.


Ich bin gestern bei der Methode stehen geblieben ! Wie ich es schaffe das nächste Ziel zu bestimmen uns ob dieser ein Hindernis ist ?


----------



## temi (15. Apr 2019)

Heyoka955 hat gesagt.:


> Ich bin gestern bei der Methode stehen geblieben ! Wie ich es schaffe das nächste Ziel zu bestimmen uns ob dieser ein Hindernis ist ?



Meine Güte das kann doch nicht so schwer zu verstehen sein! Du hast doch bereits alles was du dazu benötigst!

Du weißt, wie du prüfst ob an einer bestimmten Position ein Hindernis ist.
Du weißt, wie du deine aktuelle Position bestimmst.
Du weißt, wie sich der Rover an die nächste Position bewegt.

Kurz gesagt, du nimmst die aktuelle Position, schaust wohin sich der Rover bewegen soll und prüfst, ob an dieser Position ein Hindernis ist. Falls ja, wird der Rover eben nicht bewegt.


```
public static boolean pruefeObHindernisLiegt(){
        int[] aktuellePosition = findeRover();
        if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("#"))
            return false;
        
        return true;
    }
```

Mit deiner Methode prüfst du nur an der aktuellen Position.

Tipp: Gib der Methode einen Parameter für eine Position mit, damit du die Methode universell für eine beliebige Position verwenden kannst. Damit kannst du dann VOR jeder Bewegung die nächste geplante Position checken.


----------



## Heyoka955 (15. Apr 2019)

Wieach


temi hat gesagt.:


> Meine Güte das kann doch nicht so schwer zu verstehen sein! Du hast doch bereits alles was du dazu benötigst!
> 
> Du weißt, wie du prüfst ob an einer bestimmten Position ein Hindernis ist.
> Du weißt, wie du deine aktuelle Position bestimmst.
> ...


Wie mache ich das als Code ?
Das ug das Problem


----------



## temi (15. Apr 2019)

Heyoka955 hat gesagt.:


> Wie mache ich das als Code ?



Das ist so popelig, dass du es selbst hinkriegen musst.


----------



## Heyoka955 (15. Apr 2019)

temi hat gesagt.:


> Das ist so popelig, dass du es selbst hinkriegen musst.


Muss ich dann nicht die ganze if abfrage mit einbeziehen ? Die in move steht? Ich hatte es so erwartet.


----------



## temi (15. Apr 2019)

Heyoka955 hat gesagt.:


> Muss ich dann nicht die ganze if abfrage mit einbeziehen ? Die in move steht? Ich hatte es so erwartet.



Mach es doch so, wie du erwartest, dass es sein muss.

Edit:

Du musst vor jeder Bewegung prüfen, weil die nächste Position von der Bewegungsrichtung abhängt...


----------



## mihe7 (15. Apr 2019)

@Heyoka955 geh einfach mal davon aus, dass sich der Rover aktuell an Position (3,6) befindet. Wie lautet dann die Koordinate der nächsten Position?


----------



## Heyoka955 (15. Apr 2019)

temi hat gesagt.:


> Das ist so popelig, dass du es selbst hinkriegen musst.


Also ich weiß dass ich das bestimmen des Zieles brauche dann kann ich dich einfach

If(put(aktuelle Position, e).equals(#) return false;

Und das für alle Fälle ?

Die Position wäre : 3,7 aber es kommt darauf an wohin er gehen will.


----------



## mihe7 (15. Apr 2019)

Heyoka955 hat gesagt.:


> es kommt darauf an wohin er gehen will.


Welche Möglichkeiten gibt es und wie würden dann die Koordinaten zu jeder Möglichkeit lauten, wenn der Rover einen Schritt fährt?


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> Welche Möglichkeiten gibt es und wie würden dann die Koordinaten zu jeder Möglichkeit lauten, wenn der Rover einen Schritt fährt?


4 verschwindene?


----------



## mihe7 (15. Apr 2019)

Du schreibst, dass es darauf ankommt, wohin er gehen will. D. h. es gibt ja offensichtlich verschiedene Möglichkeiten. Welche sind das?


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> Du schreibst, dass es darauf ankommt, wohin er gehen will. D. h. es gibt ja offensichtlich verschiedene Möglichkeiten. Welche sind das?




```
marsKarte.put(aktuellePosition, "n");
           
[CODE=java]if(marsKarte.put(aktuellePosition, "w")eequals("Hindernis") ) return false;
if(marsKarte.put(aktuellePosition, "s").equals("Hindernis") ) return false;
if(marsKarte.put(aktuellePosition, "e").equals("Hindernis") ) return false;
if(marsKarte.put(aktuellePosition, "n").equals("Hindernis") ) return false;


//so ungefähr
```
                marsKarte.put(aktuellePosition, "s");

                marsKarte.put(aktuellePosition, "e");

                marsKarte.put(aktuellePosition, "w");


das sind die möglichkeiten die es fibt[/CODE]


----------



## temi (15. Apr 2019)

Das ist die aktuelle Position des Rovers:

`int[] aktuellePosition = findeRover();`

Du kannst auf die beiden Koordinatenbestandteile folgendermaßen zugreifen:

`aktuellePosition[0];`
`aktuellePosition[1];`

Wie du richtig erkannt hast, ist es abhängig von der Orientierung des Rovers (n, s, e, w) in welche Richtung er sich fortbewegen wird.

Wie würden sich die neuen Positionen des Rovers, abhängig von der Richtung berechnen lassen?

n: ??
s: ??
e: ??
w: ??


----------



## Heyoka955 (15. Apr 2019)

temi hat gesagt.:


> Das ist die aktuelle Position des Rovers:
> 
> `int[] aktuellePosition = findeRover();`
> 
> ...


wie in der Methode bewegRover, die steht ja da,  mein Problem ist jetzt das zu verbinden?

kannst du mal ein beispuel geben dafür wie die erste abfrage aussehen würde?


----------



## temi (15. Apr 2019)

Heyoka955 hat gesagt.:


> wie in der Methode bewegRover, die steht ja da,  mein Problem ist jetzt das zu verbinden?
> 
> kannst du mal ein beispuel geben dafür wie die erste abfrage aussehen würde?



Setz doch mal den Vorschlag aus #226 um, dann wird das ganz einfach...

In Pseudocode:

Wenn RoverAnAktuellerPosition.RichtungX && !HindernisAnNeuerPosition.RichtungX, dann RoverZurNeuenPosition;


----------



## Heyoka955 (15. Apr 2019)

temi hat gesagt.:


> Setz doch mal den Vorschlag aus #226 um, dann wird das ganz einfach...




```
public static boolean pruefeObHindernisLiegt(){
        int[] aktuellePosition = findeRover();
        if (aktuellePosition[0] == getRoverUndHindernisse(marsKarte, aktuellePosition).equals("#"))
            return false;
        
        return true;
    }
```


----------



## mrBrown (15. Apr 2019)

kann es sein, dass du gerne in Kreisen läufst?


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> kann es sein, dass du gerne in Kreisen läufst?


ja


----------



## temi (15. Apr 2019)

Heyoka955 hat gesagt.:


> ```
> public static boolean pruefeObHindernisLiegt(){
> int[] aktuellePosition = findeRover();
> if (aktuellePosition[0] == getRoverUndHindernisse(marsKarte, aktuellePosition).equals("#"))
> ...



Lies noch mal nach...


----------



## Heyoka955 (15. Apr 2019)

temi hat gesagt.:


> Lies noch mal nach...


das macht keinen sinn was ch geschrieben habe. 
Also ich will inde rmethode so vorgehen.
ich kriege den char übergeben und und bestimme aktuelle Position nachem ich das gemacht habe mache ich die selben if bedinungen wie in der BewegeRover Methode und dann gucke ich wo er sich befindet, nachdem ich das fertig habe, müsste dies klappem


----------



## mihe7 (15. Apr 2019)

Heyoka955 hat gesagt.:


> ich kriege den char übergeben und und bestimme aktuelle Position nachem ich das gemacht habe mache ich die selben if bedinungen wie in der BewegeRover Methode und dann gucke ich wo er sich befindet, nachdem ich das fertig habe, müsste dies klappem


Das ist zu ungenau.


----------



## temi (15. Apr 2019)

Heyoka955 hat gesagt.:


> das macht keinen sinn was ch geschrieben habe.
> Also ich will inde rmethode so vorgehen.
> ich kriege den char übergeben und und bestimme aktuelle Position nachem ich das gemacht habe mache ich die selben if bedinungen wie in der BewegeRover Methode und dann gucke ich wo er sich befindet, nachdem ich das fertig habe, müsste dies klappem



Du bist irgendwie grundsätzlich extrem resistent gegen Hilfen, die man dir geben will. Oh, man.


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> Das ist zu ungenau.




```
public static boolean kollisionAbfangen(char c){
        int[] aktuellePosition = findeRover();
        if(c = 'f')
            aktuellePosition = findeRover();
        
        
    }   

//sowäre mein ansatz
```


----------



## temi (15. Apr 2019)

Heyoka955 hat gesagt.:


> ```
> public static boolean kollisionAbfangen(char c){
> int[] aktuellePosition = findeRover();
> if(c = 'f')
> ...



Das würde im Prinzip so gehen.

ABER

In den Aufgaben geht es auch darum den Code zu verbessern und mit deinem Ansatz wirst du sehr viel bereits vorhandenen Code wiederholen. Das ist nicht  gewünscht.

Wenn es dir hilft, dann mach es trotzdem so und versuche es danach zu vereinfachen.


----------



## Heyoka955 (15. Apr 2019)

temi hat gesagt.:


> Das würde im Prinzip so gehen.
> 
> ABER
> 
> ...


ich komem ncht mehr weiter, sorry jungs!


----------



## mihe7 (15. Apr 2019)

Nochmal zwei Schritte zurück.



Heyoka955 hat gesagt.:


> das sind die möglichkeiten die es fibt


Der Rover kann also in Richtung n, w, e oder s "stehen".



Heyoka955 hat gesagt.:


> wie in der Methode bewegRover, die steht ja da, mein Problem ist jetzt das zu verbinden?


Darum machen wir das in ganz kleinen Schritten, Du musst aber die Fragen schon beantworten, sonst funktioniert das nicht.

Also: 

Würde der Rover einen Schritt fahren, wie würde sich dann die Koordinate ändern? Ich möchte von Dir jetzt kein Wischiwaschi-Gelaber mehr lesen sonder eine konkrete Berechnungsvorschrift (keinen Code!). 

Also etwas wie: Der Rover befindet sich an Punkt p=(x,y) und blickt in Richtung "n". Würde er jetzt einen Schritt in Blickrichtung fahren, dann würde er sich am Punkt p'=(...) befinden. Das ganze für alle Blick- und Fahrtrichtungen.


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> Nochmal zwei Schritte zurück.
> 
> 
> Der Rover kann also in Richtung n, w, e oder s "stehen".
> ...




```
int[] aktuellePosition = findeRover();
        if(c == 'f')
        if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n" ) && aktuellePosition[1]- == "#" ))
                
            return false;
            
        }


// so will ich das machen aber das funz net.
```


----------



## temi (15. Apr 2019)

Wir sind jetzt bei 252 Beiträgen und noch keinen Schritt weiter, weil du NIE darauf eingehst, wenn Menschen versuchen dir zu helfen. Antworte doch einfach mal darauf was @mihe7 in #250 geschrieben hat. Vielleicht kommt es danach bei dir zur Erkenntnis, die dir aktuell noch fehlt.


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> Nochmal zwei Schritte zurück.
> 
> 
> Der Rover kann also in Richtung n, w, e oder s "stehen".
> ...




```
public static boolean kollisionAbfangen(char c){
        int[] aktuellePosition = findeRover();
        if (c == 'f') {
            int[] aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n") && aktuellePosition[1]-- == "#")
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s") && aktuellePosition[1]++ == "#")
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e") && aktuellePosition[0]++ == "#" )
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w") && aktuellePosition[0]-- == "#"  )
               
   
        }
        // also wenn ich das funktionieren würde dann würde das klappen aber der bugt leider
```


```
public static boolean kollisionAbfangen(char c){
        int[] aktuellePosition = findeRover();
        if (c == 'f') {
             aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n") && aktuellePosition[1]-- == "#")
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s") && aktuellePosition[1]++ == "#")
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e") && aktuellePosition[0]++ == "#" )
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w") && aktuellePosition[0]-- == "#"  )
                    return false;
    
        }
            
        if (c == 'b') {
            aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s") && aktuellePosition[1]-- == "#")
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n") && aktuellePosition[1]++ == "#")
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w") && aktuellePosition[0]++ == "#" )
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e") && aktuellePosition[0]-- == "#"  )
                    return false;
    
        }
        
        return true;
        
        
        
        
    }
```


----------



## mihe7 (15. Apr 2019)

Wo war noch gleich die Tüte mit den Chips?


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> Wo war noch gleich die Tüte mit den Chips?


Wie vergleiche ich den array mit dem Zeichen #.

Also das sind ja die Koordinaten und ich will so gesehen die Koordinaten des # vergleichen wenn sie gleich sind dann weiß ich der Schritt wurde sorgen dass er auf Hindernis landet.


----------



## temi (15. Apr 2019)

`aktuellePosition[1]-- == "#"` kann nicht funktionieren, weil du versuchst einen Integerwert mit einem String zu vergleichen.

Du möchtest das Zeichen, das sich an der neuen Position befindet, haben und das bekommst du wie?

Tipp: Es steht schon da und zwar in genau derselben Zeile.


----------



## Heyoka955 (15. Apr 2019)

temi hat gesagt.:


> `aktuellePosition[1]-- == "#"` kann nicht funktionieren, weil du versuchst einen Integerwert mit einem String zu vergleichen.
> 
> Du möchtest das Zeichen, das sich an der neuen Position befindet, haben und das bekommst du wie?


mit der getRover Methode? ansonsten keine ahnung


----------



## kneitzel (15. Apr 2019)

Also von mir einfach noch einmal ein kleiner Einwurf....

Es ist ja schon geschrieben worden, dass man der Funktion, die prüft, ob ein Hindernis vorhanden ist, eine Position (also ein Argument vom Typ int[]) mitgeben könnte. Und dann testet man diese Position statt die Position von findeRover().

Und dann kann man in der Funktion, die die Bewegung durchführt, ja schauen, wo da die Position wie verändert wird. Da wir die Position vom Rover nicht ändern wollen, können wir die Position des Rovers ja einmal kopieren und dann in der Bewegung die Kopie anpassen.

Nach der Anpassung der Kopie kann man dann prüfen, ob an der neuen Stelle ein Hindernis ist. Ist dies nicht der Fall, aktualisieren wir die Position vom Rover.

Also ganz trivialer Pseudo Code. Und wenn Du dies nicht umsetzen kannst, alleine, in kurzer Zeit: Studieren bedeutet, dass man auch gelernt hat, zu lernen! Welche Basics fehlen dir? Wie kannst Du Dir diese selbst beibringen? Was für Lernmittel wurden Dir vom Prof an die Hand gegeben? Hast Du die wirklich durchgearbeitet? Evtl. noch einmal durcharbeiten.
Es geht an der Uni nicht nur darum, irgendwie 100 Punkte zu kriegen. Es geht darum, etwas zu lernen und auch darum, dass man das gelernte anwenden kann. Wie willst Du etwas studieren, wenn Du nicht selbständig Themen für Dich erarbeiten kannst? Sorry, ich will Dir nicht zu nahe treten, aber evtl. solltest Du überlegen, ob das, was Du machst, wirklich das Richtige für Dich ist. Lieber nachdem 2. Semester wechseln als später im Job nicht klar zu kommen, weil es einem einfach nicht liegt und man die Leistung, die von einem erwartet werden, nicht bringen kann? Und ich sehe Dich weder als Consultant (Da muss man sich bei Kunden schnell und größtenteils eigenständig in die Themen des Kunden einarbeiten!) noch als Projektmanager (Da wirkst Du mir viel zu unkoordiniert - wenn Du Dich selbst nicht koordiniert bekommst bei relativ einfachen Problemen: Wie willst Du dies unter Druck mit vielen weiteren Personen schaffen?) Mein Eindruck mag täuschen, aber im Augenblick ist das meine Sicht.


----------



## temi (15. Apr 2019)

Heyoka955 hat gesagt.:


> mit der getRover Methode? ansonsten keine ahnung



Die getRover Methode liefert die die Position des Rovers und steht außerdem nicht in der selben Zeile...

Was glaubst du was diese Methode macht?

`getRoverUndHindernisse(marsKarte, aktuellePosition)`


----------



## Heyoka955 (15. Apr 2019)

Hab


kneitzel hat gesagt.:


> Also von mir einfach noch einmal ein kleiner Einwurf....
> 
> Es ist ja schon geschrieben worden, dass man der Funktion, die prüft, ob ein Hindernis vorhanden ist, eine Position (also ein Argument vom Typ int[]) mitgeben könnte. Und dann testet man diese Position statt die Position von findeRover().
> 
> ...


hab ich das bei meinem jetzigen Code nicht gemacht ? Also wenn ich den bug da fixxe dann würde das doch gehen ider


----------



## Heyoka955 (15. Apr 2019)

temi hat gesagt.:


> Die getRover Methode liefert die die Position des Rovers und steht außerdem nicht in der selben Zeile...


Dann weiß ich nicht


----------



## Heyoka955 (15. Apr 2019)

temi hat gesagt.:


> Die getRover Methode liefert die die Position des Rovers und steht außerdem nicht in der selben Zeile...
> 
> Was glaubst du was diese Methode macht?
> 
> `getRoverUndHindernisse(marsKarte, aktuellePosition)`


die gibt den rover und die leere Felder wieder


----------



## mihe7 (15. Apr 2019)

11 (EDIT: 13) Kommentare und eine Hand voll Chips später und ich immer noch keine Antwort von @Heyoka955 - tütütü....


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> 11 (EDIT: 13) Kommentare und eine Hand voll Chips später und ich immer noch keine Antwort von @Heyoka955 - tütütü....
> was hast du denn gesagt hhahaa


----------



## temi (15. Apr 2019)

Ich hab jetzt keine Lust mehr:

Diese Methode `getRoverUndHindernisse(marsKarte, new int[] {10,10})` liefert dir den Inhalt vom Kartenfeld (10/10).

Mach was draus und Tschüß!


----------



## mihe7 (15. Apr 2019)

@temi ach komm, die 1000er-Marke bringen wir noch voll.


----------



## Heyoka955 (15. Apr 2019)

wie bringe ich die Koordinaten des rovers da rein?

```
if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s") && getRoverUndHindernisse(marsKarte, new int[] {10,10}).equals("#"))
                return false;
```


----------



## temi (15. Apr 2019)

mihe7 hat gesagt.:


> @temi ach komm, die 1000er-Marke bringen wir noch voll.



Ich muss arbeiten gehen, bin aber zuversichtlich, dass es sich noch etwas hinziehen wird


----------



## temi (15. Apr 2019)

temi hat gesagt.:


> Ich muss arbeiten gehen, bin aber zuversichtlich, dass es sich noch etwas hinziehen wird





Heyoka955 hat gesagt.:


> wie bringe ich die Koordinaten des rovers da rein?



Was hab ich gesagt


----------



## Heyoka955 (15. Apr 2019)

temi hat gesagt.:


> Was hab ich gesagt


aktuellePosition[1]++


----------



## Heyoka955 (15. Apr 2019)

Heyoka955 hat gesagt.:


> aktuellePosition[1]++


so
	
	
	
	





```
if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s") && getRoverUndHindernisse(marsKarte, new int[] {aktuellePosition[1]--}).equals("#"))
```


----------



## mihe7 (15. Apr 2019)

Ach, es könnte so einfach sein...


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> Ach, es könnte so einfach sein...




```
public static boolean kollisionAbfangen(char c){
        int[] aktuellePosition = findeRover();
        if (c == 'f') {
             aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n") && getRoverUndHindernisse(marsKarte, new int[] {aktuellePosition[1]--}).equals("#"))
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s") && getRoverUndHindernisse(marsKarte, new int[] {aktuellePosition[1]++}).equals("#"))
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e") && getRoverUndHindernisse(marsKarte, new int[] {aktuellePosition[0]++}).equals("#"))
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w") && getRoverUndHindernisse(marsKarte, new int[] {aktuellePosition[0]--}).equals("#"))
                    return false;
    
        }
            
        if (c == 'b') {
            aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s") && getRoverUndHindernisse(marsKarte, new int[] {aktuellePosition[1]--}).equals("#"))
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n") && getRoverUndHindernisse(marsKarte, new int[] {aktuellePosition[1]++}).equals("#"))
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w") && getRoverUndHindernisse(marsKarte, new int[] {aktuellePosition[0]++ }).equals("#"))
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e") && getRoverUndHindernisse(marsKarte, new int[] {aktuellePosition[0]--}).equals("#"))
                    return false;
    
        }
        
        return true;
        
        
        
        
    }


so ist mei code, der müsste eigentlich funktionieren.
```


----------



## Heyoka955 (15. Apr 2019)

nachdem der Code funktioniet, werde ich ihn in die bewege rover methode einbeziehen, denn das ist um grunde genommen doppelgemobbel. Ich müsste dann die bedinung verneinen.


----------



## mihe7 (15. Apr 2019)

Heyoka955 hat gesagt.:


> nachdem der Code funktioniet,


??? Ok, tu', was Du nicht lassen kannst.


----------



## Robat (15. Apr 2019)

mihe7 hat gesagt.:


> ??? Ok, tu', was Du nicht lassen kannst.


Hör auf denjenigen, der 100k verdienen wird!


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> ??? Ok, tu', was Du nicht lassen kannst.


ich verstehe den bug nicht jetzt


----------



## mihe7 (15. Apr 2019)

Robat hat gesagt.:


> Hör auf denjenigen, der 100k verdienen wird!


Ok, bin ja schon still.


----------



## Heyoka955 (15. Apr 2019)

kann einer sagen was der fehler genau ist, das war es mit 100k


----------



## mihe7 (15. Apr 2019)

Heyoka955 hat gesagt.:


> kann einer sagen was der fehler genau ist


Meist sitzt er vor dem Bildschirm.


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> Meist sitzt er vor dem Bildschirm.


Hahahah wieso fickst du mich


----------



## mihe7 (15. Apr 2019)

Öh, nichts läge mir ferner.


----------



## MoxxiManagarm (15. Apr 2019)

Ich würde ja gerne mitquatschen, aber 14 Seiten  Ihr seids verrückt  Aber ja ohne groß zu lesen kann ich mir schon denken warum es so ausgeartet ist


----------



## mihe7 (15. Apr 2019)

@MoxxiManagarm hier eine Zusammenfassung:


mrBrown hat gesagt.:


> kann es sein, dass du gerne in Kreisen läufst?


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> @MoxxiManagarm hier eine Zusammenfassung:


Ok Jungs danke aber für eure Hilfe.


----------



## mihe7 (15. Apr 2019)

Wie?!? Du willst schon aufgeben?


----------



## Heyoka955 (15. Apr 2019)

mihe7 hat gesagt.:


> Wie?!? Du willst schon aufgeben?


Ja


----------



## Meniskusschaden (15. Apr 2019)

Heyoka955 hat gesagt.:


> mihe7 hat gesagt.:
> 
> 
> > Wie?!? Du willst schon aufgeben?
> ...


Dann noch einen Tipp für die Zukunft. Ich zitiere mal aus einem deiner anderen Threads:


Heyoka955 hat gesagt.:


> Thallius hat gesagt.:
> 
> 
> > Ohne Dir jetzt zu nahe treten zu wollen, aber um 100k zu verdienen fehlt es Dir im Moment erst einmal an guter Rechtschreibung. Es ist auch eine Frage des persönlichen Anspruchs sich die Mühe zu geben sich richtig auszudrücken. Wem es schon zu viel Aufwand ist sich diese Mühe machen, der wird es auch im Job nicht weit bringen...
> ...


Vielleicht solltest du diese Haltung noch mal überdenken und nicht erst im Job sondern bereits jetzt mehr Mühe und Sorgfalt investieren. Dann läuft's sicher auch hier im Forum deutlich konstruktiver.


----------



## temi (15. Apr 2019)

Heyoka955 hat gesagt.:


> Ja



Eigentlich schade, die Lösung lag jetzt schon in Greifweite.


----------



## MoxxiManagarm (15. Apr 2019)

temi hat gesagt.:


> jetzt schon


----------



## Heyoka955 (15. Apr 2019)

temi hat gesagt.:


> Eigentlich schade, die Lösung lag jetzt schon in Greifweite.


Kriege neues Projekt, aber denke da packe ich das


----------



## mrBrown (15. Apr 2019)

Ich dachte, das ist ne Abgabe bis Freitag?


----------



## Robat (15. Apr 2019)

Heyoka955 hat gesagt.:


> Kriege neues Projekt, aber denke da packe ich das


Woran machst du das fest?


----------



## Heyoka955 (15. Apr 2019)

Robat hat gesagt.:


> Woran machst du das fest?


Wir haben vier Projekte und brauchen Zulassung


----------



## mrBrown (15. Apr 2019)

@Robat bezog sich eher auf diesen Teil:


Heyoka955 hat gesagt.:


> denke da packe ich das


----------



## Heyoka955 (15. Apr 2019)

Heyoka955 hat gesagt.:


> Wir haben vier Projekte und brauchen Zulassung


Die Angaben ist bis Freitag danach haben wir Zeit eine Woche lang zu korrigieren


----------



## Heyoka955 (15. Apr 2019)

Robat hat gesagt.:


> Woran machst du das fest?


Weil ich mehr zusammenreißen werde, wieso seid ihr so negativ


----------



## mrBrown (15. Apr 2019)

Wir sind nicht negativ, wir sind optimistisch.


----------



## Robat (15. Apr 2019)

Heyoka955 hat gesagt.:


> wieso seid ihr so negativ


Nun ja.. dir wurde hier 290 Nachrichten lang die Lösung bis ins kleinste Detail vorgekaut und am Ende hast du aufgegeben. 
Auf Fragen hast du meist gar nicht oder zu ungenau geantwortet. Es kommt mir so vor als seist du etwas beratungsresistent. 

Wieso also sollte es bei der nächsten Aufgabe besser laufen? Ich sage mal den Verlauf voraus:

- du bekommst die Aufgabe und stellst diese irgendwann ins Forum 
- es werden wieder die gleichen Leute versuchen dir zu helfen
- nach 150 Beiträgen verlierst du entweder wieder die Konzentration oder stellst fest, dass du lieber aufgibst, weil bald Abgabe ist

BTW: Dein Gehalt später (100k) wird nicht anhand der Beiträge hier im Forum bestimmt - falls das dein Ziel ist . (SCNR)


----------



## mrBrown (15. Apr 2019)

Heyoka955 hat gesagt.:


> Weil ich mehr zusammenreißen werde


Lass dir einen Rat geben: die ersten Aufgaben nicht machen, weil man sich bei den späteren „zusammenreißt“, geht IMMER schief.
JETZT sind die Aufgaben am leichtesten, die späteren werden schwerer.
JETZT hast du am meisten Zeit, später bedingt durch die anderen Fächer nahezu immer weniger.
JETZT werden die Grundlagen für spätere Aufgaben gelegt, die werden Dir bei späteren Aufgaben fehlen.


----------



## mrBrown (15. Apr 2019)

Robat hat gesagt.:


> BTW: Dein Gehalt später (100k) wird nicht anhand der Beiträge hier im Forum bestimmt - falls das dein Ziel ist


Verdammt, schlechte Aussichten für mich


----------



## mihe7 (15. Apr 2019)

Vielleicht sollte man dazu sagen, dass die Metrik LOC nicht für Lines Of Comments steht...


----------



## mihe7 (15. Apr 2019)

Heyoka955 hat gesagt.:


> Kriege neues Projekt, aber denke da packe ich das


Dir ist klar, dass die erste Aufgabe die zum Aufwärmen ist?

Jetzt schlaf' mal eine Nacht drüber, dann schaust Du Dir morgen mal die Sache nochmal an. Wenn Du willst, dann beantwortest Du #250 und dann wirst Du die paar Zeilen wohl auch noch hinbekommen.

Irgendwie müssen wir den Thread ja am Laufen halten, unter 500 Kommentare gebe ich mich nicht zufrieden


----------



## Heyoka955 (15. Apr 2019)

mrBrown hat gesagt.:


> Verdammt, schlechte Aussichten für mich


Ne


mihe7 hat gesagt.:


> Dir ist klar, dass die erste Aufgabe die zum Aufwärmen ist?
> 
> Jetzt schlaf' mal eine Nacht drüber, dann schaust Du Dir morgen mal die Sache nochmal an. Wenn Du willst, dann beantwortest Du #250 und dann wirst Du die paar Zeilen wohl auch noch hinbekommen.
> 
> Irgendwie müssen wir den Thread ja am Laufen halten, unter 500 Kommentare gebe ich mich nicht zufrieden


Ja mache ich, hast ja richtig Spaß


----------



## Heyoka955 (16. Apr 2019)

So Leute bin back,
Am besten fangen wir von neu an.

Also ich möchte einen Code schreiben der dafür sorgt dass der Rover voher abfragt ob der nächste schritt notwendig auf ein Rover landet, aber leider weiß ich nicht wie ich das machen soll?
Ich hatte überlegt abzufragen was übergeben wird also ob f oder b übergeben je dann wollte ich von der move Methode die Bedingungen kopieren und einen weiteren booleschen Ausdruck hinzuzufügen das besagt aktuekleposition++ == „#“


----------



## JCODA (16. Apr 2019)

Fang nochmal einen Schritt früher an.
Was bedeutet i++, wenn i eine integer-Variable mit Wert 0 ist? Welchen Wert hat der Ausdruck i++ und welchen Wert hat i danach?


----------



## Heyoka955 (16. Apr 2019)

JCODA hat gesagt.:


> Fang nochmal einen Schritt früher an.
> Was bedeutet i++, wenn i eine integer-Variable mit Wert 0 ist? Welchen Wert hat der Ausdruck i++ und welchen Wert hat i danach?


Dass der Wert danach diesen Wert beinhaltet so daas i danach i = i+ 1 ist, 
Das heißt ich muss es so machen dass i sich nicht verändert aber wie


----------



## mrBrown (16. Apr 2019)

Heyoka955 hat gesagt.:


> Dass der Wert danach diesen Wert beinhaltet so daas i danach i = i+ 1 ist,


Das ist keine Antwort auf die gestellten Fragen. Und außerdem völlig grottiger Satzbau, gib dir doch endlich mal ein bisschen Mühe! Hier wenden andere Leute Stunden ihrer Zeit auf, um dir zu helfen, und du honorierst das mit hingerotzten Texten.


----------



## Heyoka955 (16. Apr 2019)

JCODA hat gesagt.:


> Fang nochmal einen Schritt früher an.
> Was bedeutet i++, wenn i eine integer-Variable mit Wert 0 ist? Welchen Wert hat der Ausdruck i++ und welchen Wert hat i danach?


Er hat dann 1!


----------



## temi (16. Apr 2019)

Heyoka955 hat gesagt.:


> Dass der Wert danach diesen Wert beinhaltet so daas i danach i = i+ 1 ist,
> Das heißt ich muss es so machen dass i sich nicht verändert aber wie



Mal ein Beispiel, du musst die Erkenntnis daraus, danach auf dein Problem abstrahieren umsetzen:


```
boolean istDieZahlVier(int zahl) {
    return zahl == 4; // Das Ergebnis wird wahr, wenn die Zahl im Parameter gleich 4 ist
}

// Nehmen wir jetzt an, dass du später prüfen möchtest, ob eine Zahl = 4 ist, dann:

int zahl = 3;
istDieZahlVier(zahl); // ergibt false

// Möchtest du prüfen, ob die nächst größere Zahl = 4 ist, dann könntest du machen:

istDieZahlVier(zahl++); // ergibt true, aber jetzt ist die zahl nicht mehr 3 sondern 4, dass wolltest du nicht

// Du könntest es auch so machen:

istDieZahlVier(zahl + 1); // ergibt true, aber die zahl bleibt auf den alten Wert. Es wird 1 zur Zahl addiert und dieser neue Wert an die Methode übergeben.
```


----------



## Heyoka955 (16. Apr 2019)

temi hat gesagt.:


> Mal ein Beispiel, du musst die Erkenntnis daraus, danach auf dein Problem abstrahieren:
> 
> 
> ```
> ...


Womit soll ich das subtrahieren


----------



## temi (16. Apr 2019)

Heyoka955 hat gesagt.:


> Womit soll ich das subtrahieren



Verstehst du, was in dem Beispiel passiert?

Um die Fremdwörter können wir uns danach kümmern.


----------



## Heyoka955 (16. Apr 2019)

temi hat gesagt.:


> Verstehst du, was in dem Beispiel passiert?
> 
> Um die Fremdwörter können wir uns danach kümmern.


Habe ich der prüft ob der Wert vier ist und bej der einen Methode hast du plus 1 gemacht um true zu bekommen.


----------



## mihe7 (16. Apr 2019)

Womit Du die Antwort auf die Frage


Heyoka955 hat gesagt.:


> Das heißt ich muss es so machen dass i sich nicht verändert aber wie


hast.


----------



## Heyoka955 (16. Apr 2019)

mihe7 hat gesagt.:


> Womit Du die Antwort auf die Frage
> 
> hast.


Hä?


----------



## mihe7 (16. Apr 2019)

Das steht doch in dem Beispiel: zahl++ verändert die Variable zahl, zahl+1 verändert die Variable zahl nicht. Ersetze zahl durch i und Du hast die Antwort auf die Frage, wie du "es so machen" kannst, dass sich i nicht verändert.


----------



## Heyoka955 (16. Apr 2019)

mihe7 hat gesagt.:


> Das steht doch in dem Beispiel: zahl++ verändert die Variable zahl, zahl+1 verändert die Variable zahl nicht. Ersetze zahl durch i und Du hast die Antwort auf die Frage, wie du "es so machen" kannst, dass sich i nicht verändert.


Ja das meinte ich ja aber dann kam bei meiner of abfrage Fehlermeldung !!!


----------



## temi (16. Apr 2019)

Heyoka955 hat gesagt.:


> Ja das meinte ich ja aber dann kam bei meiner of abfrage Fehlermeldung !!!



Wie sieht denn dein Code aus? Lass dir halt nicht immer alles aus der Nase ziehen!


----------



## Heyoka955 (16. Apr 2019)

Heyoka955 hat gesagt.:


> ```
> public static boolean kollisionAbfangen(char c){
> int[] aktuellePosition = findeRover();
> if (c == 'f') {
> ...


So sieht er aus, wenn ich das Minus weg mache dann klappt das nicht.


----------



## temi (16. Apr 2019)

Heyoka955 hat gesagt.:


> So sieht er aus, wenn ich das Minus weg mache dann klappt das nicht.



Schau dir mal dies an: `int[] aktuellePosition = findeRover();`

Bei der Position handelt es sich um ein Array mit zwei Elementen (sozusagen X/Y-Koordinaten). Auch die Methode "getRoverUndHindernisse" erwartet als Parameter ein Array. Du übergibst zwar ein Array, aber nur mit einem Element.

Schau dir noch mal Beitrag #265 weiter oben an, es fehlt eigentlich nur die zweite Hälfte der Koordinate.

In Beitrag #237 steht, wie du auf die beiden Teile der Koordinate zugreifen kannst.


----------



## Heyoka955 (16. Apr 2019)

Ist das dann fer


temi hat gesagt.:


> Schau dir mal dies an: `int[] aktuellePosition = findeRover();`
> 
> Bei der Position handelt es sich um ein Array mit zwei Elementen (sozusagen X/Y-Koordinaten). Auch die Methode "getRoverUndHindernisse" erwartet als Parameter ein Array. Du übergibst zwar ein Array, aber nur mit einem Element.
> 
> ...


thab ich es dann fertig ☺️


----------



## temi (16. Apr 2019)

Heyoka955 hat gesagt.:


> Ist das dann fer
> 
> thab ich es dann fertig ☺



Ist das eine Frage oder eine Bestätigung? Dein Schreibstil ist wirklich grauenhaft...


----------



## Heyoka955 (16. Apr 2019)

temi hat gesagt.:


> Ist das eine Frage oder eine Bestätigung? Dein Schreibstil ist wirklich grauenhaft...


Frage ob ich es habe danach.


----------



## Heyoka955 (16. Apr 2019)

temi hat gesagt.:


> Schau dir mal dies an: `int[] aktuellePosition = findeRover();`
> 
> Bei der Position handelt es sich um ein Array mit zwei Elementen (sozusagen X/Y-Koordinaten). Auch die Methode "getRoverUndHindernisse" erwartet als Parameter ein Array. Du übergibst zwar ein Array, aber nur mit einem Element.
> 
> ...


Die beiden muss ich in mekne of Bedingung einfügen oder wie ?


----------



## mihe7 (16. Apr 2019)

Heyoka955 hat gesagt.:


> Die beiden muss ich in mekne of Bedingung einfügen oder wie ?


OMG. Wenn Du eine 2-dimensionale Koordinate angibst, brauchst Du halt zwei 1-dimensionale Koordinaten. Das hat nichts mit Java zu tun. In Deinem Programm wird eine 2-dimensionale Koordinate durch ein 2-elementiges Array dargestellt. Jedes Element entspricht damit einer 1-dimensionalen Koordinate. Folglich musst Du überall, wo Du eine 2-dimensionale Koordinate angeben willst, ein 2-elementiges Array verwenden.


----------



## Heyoka955 (16. Apr 2019)

mihe7 hat gesagt.:


> OMG. Wenn Du eine 2-dimensionale Koordinate angibst, brauchst Du halt zwei 1-dimensionale Koordinaten. Das hat nichts mit Java zu tun. In Deinem Programm wird eine 2-dimensionale Koordinate durch ein 2-elementiges Array dargestellt. Jedes Element entspricht damit einer 1-dimensionalen Koordinate. Folglich musst Du überall, wo Du eine 2-dimensionale Koordinate angeben willst, ein 2-elementiges Array verwenden.


A


mihe7 hat gesagt.:


> OMG. Wenn Du eine 2-dimensionale Koordinate angibst, brauchst Du halt zwei 1-dimensionale Koordinaten. Das hat nichts mit Java zu tun. In Deinem Programm wird eine 2-dimensionale Koordinate durch ein 2-elementiges Array dargestellt. Jedes Element entspricht damit einer 1-dimensionalen Koordinate. Folglich musst Du überall, wo Du eine 2-dimensionale Koordinate angeben willst, ein 2-elementiges Array verwenden.


Verstehe also muss ich schreiben

New int[] {aktuelle Position[0], aktuelle Position[1]}


----------



## mihe7 (16. Apr 2019)

Wenn Du damit `new int[]{aktuellePosition[0], aktuellePosition[1]}` meinst, wäre das eine vollständige Koordinate. In diesem Fall würde es sich um eine Kopie der Koordinate aktuellePosition handeln.


----------



## temi (16. Apr 2019)

`getRoverUndHindernisse(marsKarte, aktuellePosition)`

und

`getRoverUndHindernisse(marsKarte, new int[]{aktuellePosition[0], aktuellePosition[1]})`

sind gleichwertig. Im ersten Fall nimmst du direkt ein Array mit zwei Elementen und im zweiten Fall erzeugst du ein neues Array mit zwei Elementen mit den gleichen Werten wie in "aktuellePosition"


----------



## Heyoka955 (16. Apr 2019)

Heyoka955 hat gesagt.:


> A
> 
> Verstehe also muss ich schreiben
> 
> New int[][] = new int[] {aktuelle Position[0], aktuelle Position[1]+}





mihe7 hat gesagt.:


> Wenn Du damit `new int[]{aktuellePosition[0], aktuellePosition[1]}` meinst, wäre das eine vollständige Koordinate. In diesem Fall würde es sich um eine Kopie der Koordinate aktuellePosition handeln.


also dann müsste ich es für den Fall falls c „f“ ost so schreiben.

new int[]{aktuellePosition[0], aktuellePosition[1]-1} und das in die bedinung rein ?


----------



## temi (16. Apr 2019)

Heyoka955 hat gesagt.:


> also dann müsste ich es für den Fall falls c „f“ ost so schreiben.
> 
> new int[]{aktuellePosition[0], aktuellePosition[1]-1} und das in die bedinung rein ?



Ja, allerdings hängt es von der Richtung in der der Rover steht ab, welchen Teil der Koordinate du ändern musst.


----------



## flopalko (16. Apr 2019)

Wieso helft ihr ihm eigentlich immer noch?
Würde man irgendeine Eigeninitiative erkennen fände ich das ja noch verständlich. Allerdings geht der TE auf keine Hinweise (vernünftig) ein, formuliert noch immer keine korrekten Sätze, schreibt einfach nicht verständlich und zeigt mit jedem Posting, dass er von Programmieren einfach absolut keine Ahnung hat. Ich glaube, dass das Problem mittlerweile jemand lösen könnte, der noch nie programmiert hat und als Hilfestellung NUR diesen Thread hat.


----------



## jhjh (16. Apr 2019)

Na deswegen


mihe7 hat gesagt.:


> Irgendwie müssen wir den Thread ja am Laufen halten, unter 500 Kommentare gebe ich mich nicht zufrieden


----------



## mihe7 (16. Apr 2019)

flopalko hat gesagt.:


> Allerdings geht der TE auf keine Hinweise (vernünftig) ein, formuliert noch immer keine korrekten Sätze, schreibt einfach nicht verständlich und zeigt mit jedem Posting, dass er von Programmieren einfach absolut keine Ahnung hat.


Der Witz kommt ja am Schluss, wenn er dann die Lösung hat. Ich werde zu gegebener Zeit hierauf verweisen


----------



## temi (16. Apr 2019)

flopalko hat gesagt.:


> Wieso helft ihr ihm eigentlich immer noch?



Altruismus, um mal wieder ein Fremw


flopalko hat gesagt.:


> Ich glaube, dass das Problem mittlerweile jemand lösen könnte, der noch nie programmiert hat und als Hilfestellung NUR diesen Thread hat.



Wir können ja ein Tutorial draus machen


----------



## mihe7 (16. Apr 2019)

temi hat gesagt.:


> Wir können ja ein Tutorial draus machen


Tutorial? "Java - die Enzyklopädie".


----------



## Heyoka955 (16. Apr 2019)

```
public static boolean kollisionAbfangen(char c){
        int[] aktuellePosition = findeRover();
        if (c == 'f') {
             aktuellePosition = findeRover();
            if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("n") && getRoverUndHindernisse(marsKarte, new int[][]{aktuellePosition[0],aktuellePosition[1]-1}).equals("#"))
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("s") && getRoverUndHindernisse(marsKarte, new int[][] {aktuellePosition[0],aktuellePosition[1]+1}).equals("#"))
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("e") && getRoverUndHindernisse(marsKarte, new int[][] {aktuellePosition[0]+1,aktuellePosition[1]}).equals("#"))
                return false;
            else if (getRoverUndHindernisse(marsKarte, aktuellePosition).equals("w") && getRoverUndHindernisse(marsKarte, new int[][]{aktuellePosition[0]-1}.aktuellePosition[1]).equals("#"))
                    return false;
 
        }
         
       .. //so ungefähr ?
     
     
     
    }
```


----------



## temi (16. Apr 2019)

Heyoka955 hat gesagt.:


> werde ich ihn in die bewege rover methode einbeziehen, denn das ist um grunde genommen doppelgemobbel. Ich müsste dann die bedinung verneinen.



Es wird langsam. Beziehe mal deinen Gedanken, den du gestern gehabt hast, in deine Überlegungen ein. Der war gut.


----------



## Heyoka955 (16. Apr 2019)

temi hat gesagt.:


> Es wird langsam. Beziehe mal deinen Gedanken, den d
> 
> ```
> public static void move(char c) {
> ...


i


----------



## mrBrown (16. Apr 2019)

Heyoka955 hat gesagt.:


> temi hat gesagt.:
> 
> 
> > Es wird langsam. Beziehe mal deinen Gedanken, den d
> ...



Wie bekommst du solche "kaputten" Beiträge hin? Es ist schon fast ne Beleidigung, Leuten die dir helfen, mit solchen Beiträgen zu antworten...


----------



## Heyoka955 (16. Apr 2019)

mrBrown hat gesagt.:


> Wie bekommst du solche "kaputten" Beiträge hin? Es ist schon fast ne Beleidigung, Leuten die dir helfen, mit solchen Beiträgen zu antworten...


ich tippe zu schnell, ist die jetzt richtig?


----------



## mrBrown (16. Apr 2019)

Heyoka955 hat gesagt.:


> ich tippe zu schnell, ist die jetzt richtig?


Kommt drauf an, wen zu mit "die" meinst. Bezieht sich das auf diesen Beitrag, oder auf den Code, oder auf irgendwas anderes?

Kleiner Tipp am Rande: wenn beim "zu schnell tippen" nur Müll raus kommt, tipp langsamer. Tippgeschwindigkeit ist wirklich nicht das wichtigste für Informatiker...


----------



## Heyoka955 (16. Apr 2019)

mrBrown hat gesagt.:


> Kommt drauf an, wen zu mit "die" meinst. Bezieht sich das auf diesen Beitrag, oder auf den Code, oder auf irgendwas anderes?
> 
> Kleiner Tipp am Rande: wenn beim "zu schnell tippen" nur Müll raus kommt, tipp langsamer. Tippgeschwindigkeit ist wirklich nicht das wichtigste für Informatiker...


mein aktueller beitrag, jo nehme ich mir als tipp


----------



## Xyz1 (16. Apr 2019)

mrBrown hat gesagt.:


> Tippgeschwindigkeit ist wirklich nicht das wichtigste für Informatiker


Würde ich so nicht unterschreiben, aber gut.

@Heyoka955 In welche Richtung soll sich dieses lange Thema eigentlich (noch) entwickeln?


----------



## Heyoka955 (16. Apr 2019)

Tobias-nrw hat gesagt.:


> Würde ich so nicht unterschreiben, aber gut.
> 
> @Heyoka955 In welche Richtung soll sich dieses lange Thema eigentlich (noch) entwickeln?


bis wir 500 Kommentare haben und meine lösung richtig ist.


----------



## Xyz1 (16. Apr 2019)

Heyoka955 hat gesagt.:


> bis wir 500 Kommentare haben


dann müssen es aber auch bei diesen 500 Kommentaren bleiben...


----------



## Heyoka955 (16. Apr 2019)

Tobias-nrw hat gesagt.:


> dann müssen es aber auch bei diesen 500 Kommentaren bleiben...


sind ja noch 150 lol, also sieht das richtig aus?


----------



## mihe7 (16. Apr 2019)

Schon probiert?


----------



## Heyoka955 (16. Apr 2019)

mihe7 hat gesagt.:


> Schon probiert?


ne habe angst davor hahaah aber leider ist das nicht die aufgabe 1. haha


----------



## mrBrown (16. Apr 2019)

Tobias-nrw hat gesagt.:


> Würde ich so nicht unterschreiben, aber gut.


Gibt da zB diesen Zitat zum Programmieren:


			
				Robert C. Martin hat gesagt.:
			
		

> Indeed, the ratio of time spent reading versus writing is well over 10 to 1.


Programmieren macht aber meist auch nur einen Teil der Arbeit aus, kommt durchaus vor, dass man nen Tag lang keine einzige Zeile Code schreibt. Und selbst beim Programmieren ist die Schreibzeit keineswegs ein durchgängig tippen...

Wenn man mal optimistisch wirklich 1/10 ansetzt, braucht man grad mal doppelt so lange für irgendwas, wenn man nur ein Zehntel der Zeichen tippt, da machen andere Sachen doch deutlich mehr aus (wofür dieser Thread ja wohl das beste Beispiel ist  )


----------



## Heyoka955 (16. Apr 2019)

```
if (c == 'f') {
            int[] p = findeRover();
              if (get(mars, p).equals("n") && !get(mars, new int[][]{p[0],p[1]-1}).equals("#"))
                p[1]--;
            else if (get(mars,p).equals("s") && !get(mars, new int[][] {p[0],p[1]+1}).equals("#"))
                p[1]++;
            else if (get(mars, p).equals("e") && !get(mars, new int[][] {p[0]+1,p[1]}).equals("#"))
                p[0]++;
            else if (get(mars, p).equals("w") && !get(mars, new int[][]{p[0]-1}.p[1]).equals("#"))
                   p[0]--;
        }
//int kann nicht convertent to int[] ist die fehlermeldung
```


----------



## mrBrown (16. Apr 2019)

Guck dir mal an, was für ein Array du da versuchst zu erzeugen (`int[][]`), womit du das versuchst zu initialisieren (`{p[0],p[1]-1}`, eine Dimension!) und was der erwartet Parametertyp der aufgerufenen Methode ist.



Heyoka955 hat gesagt.:


> convertent


"converted"?


----------



## mihe7 (16. Apr 2019)

Heyoka955 hat gesagt.:


> //int kann nicht convertent to int[] ist die fehlermeldung


Das liegt daran, dass Du Deinen Code genau so sorgfältig schreibst wie Deine Beiträge. 



Spoiler



Schau Dir mal das letzte if-Statement genau an, insbesondere das Array...


----------



## Heyoka955 (16. Apr 2019)

mihe7 hat gesagt.:


> Das liegt daran, dass Du Deinen Code genau so sorgfältig schreibst wie Deine Beiträge.
> 
> 
> 
> ...


der zeigt den fehler bei allen abfragen


----------



## mrBrown (16. Apr 2019)

Heyoka955 hat gesagt.:


> der zeigt den fehler bei allen abfragen


Siehe den Beitrag über dem von dir zitierten, im letzten if sind zwei verschiedene Fehler versteckt...


----------



## Heyoka955 (16. Apr 2019)

mrBrown hat gesagt.:


> Siehe den Beitrag über dem von dir zitierten, im letzten if sind zwei verschiedene Fehler versteckt...


hab es hinbekommen, leider ist das nur die aufgabe 3 und nicht die 1, mir wurde klar dass bei aufgabe 1 den bug wollten dass die Fehlermeldung erscheint aber leider zu spät verpeilt


----------



## mihe7 (16. Apr 2019)

Dein Code wäre leichter lesbar, wenn Du einheitlich formatieren würdest und ihm an bestimmten Stellen ein Leerzeichen spendierst.


```
new int[][]{p[0],p[1]-1}
new int[][] {p[0],p[1]+1}
new int[][]{p[0]-1}.p[1])
```
Was soll das?

So

```
new int[][]{p[0], p[1]-1}
new int[][]{p[0], p[1]+1}
new int[][]{p[0]-1}. p[1])
```
sieht man den Fehler schneller.


----------



## mihe7 (16. Apr 2019)

Oh, ich sehe die Möglichkeit, doch noch auf 500 zu kommen  


Heyoka955 hat gesagt.:


> mir wurde klar dass bei aufgabe 1 den bug wollten dass die Fehlermeldung erscheint


?!?


----------



## Heyoka955 (16. Apr 2019)

mihe7 hat gesagt.:


> Oh, ich sehe die Möglichkeit, doch noch auf 500 zu kommen
> 
> ?!?


aufgabe 1 bei dem anfangs code auf seite 1 müsste der stehn steht eine expection und diese expetion muss ausgegeben werden wenn der rover nicht zu sehen ist. bei der aufgabe 1 war das nicht deutlich aber habe es mittleweile verstandne


----------



## mihe7 (16. Apr 2019)

Heyoka955 hat gesagt.:


> und diese expetion muss ausgegeben werden wenn der rover nicht zu sehen ist


Wie kommst Du darauf?


----------



## Heyoka955 (16. Apr 2019)

mihe7 hat gesagt.:


> Wie kommst Du darauf?


Da war ja die eine Fehlermeldung in der Expertin klasse Rover is missin und die stand unten bei der Ausgabe nie wenn der Rover verschwand und ein Kollege meinte mir man solle das so machen. 
Aber von der Aufgabe 1 her sehr unübersichtlich.


----------



## flopalko (16. Apr 2019)

Ich bin echt froh, dass meine Tage als Übungsleiter auf der Uni vorbei sind. Du wirkst mir genau so wie mein Lieblingstyp von Studenten damals: keine Ahnung vom Programmieren, kein bisschen von seinem Code selbst geschrieben (das trifft bei dir mit diesem Thread sowas von zu; mittlerweile kannst du alle, die dir geholfen haben als Autoren des Codes auflisten), nichts am Code verstehen, aber stets vehement behaupten, dass man eh programmieren will und kann, bemüht sei und Code eh immer verstehe, wenn man ihn liest.

Aus Erfahrung weiß ich, 

dass solche Leute Code eben nicht verstehen wenn sie ihn lesen, nicht mal einen sehr einfachen,
dass solche Leute immer am Ende die Übung nicht bestanden haben,
dass solche Leute sich ihre Fehler nicht eingestehen wollen,
und, dass solche Leute absolut beratungsresistent sind.
Versteht mich nicht falsch, in den Betreuungseinheiten wurde Leuten immer geholfen und bei vielen hat das gefruchtet. Ähnlich wie bei andren Fragenstellern hier im Forum hat man Tipps, aber keine fertigen Lösungen gegeben, die wurden angenommen, es wurde viel dabei gelernt und am Ende haben diese Leute dann immer durchaus mit einem Sehr Gut abgeschlossen.
Solche Studenten wie der TE kamen aber meist gar nicht zur Übungsstunde, wenn sie doch kamen waren sie ähnlich beratungsresistent und sind dann bei den Abgaben untergegangen.

@Heyoka955 nimm dir meine Erfahrungen zu Herzen und bessere deine Einstellung, sonst wird das nie was.


----------



## Heyoka955 (16. Apr 2019)

flopalko hat gesagt.:


> Ich bin echt froh, dass meine Tage als Übungsleiter auf der Uni vorbei sind. Du wirkst mir genau so wie mein Lieblingstyp von Studenten damals: keine Ahnung vom Programmieren, kein bisschen von seinem Code selbst geschrieben (das trifft bei dir mit diesem Thread sowas von zu; mittlerweile kannst du alle, die dir geholfen haben als Autoren des Codes auflisten), nichts am Code verstehen, aber stets vehement behaupten, dass man eh programmieren will und kann, bemüht sei und Code eh immer verstehe, wenn man ihn liest.
> 
> Aus Erfahrung weiß ich,
> 
> ...


Ja das Problem war es wurde zu viel diskutiert und viel Input gegeben und mein brain war am Ende weg. Den Code hab ich zu 80 Prozent verstanden und am Anfang kannst du die anderen fragen dass ich genau diesen Ansatz hatte aber mein Kopf schnell verwirrt war. 
Ich habe programmieren ohne zu lernen bestanden. Ich kann das aber Druck macht alles kaputt.


----------



## Heyoka955 (16. Apr 2019)

flopalko hat gesagt.:


> Ich bin echt froh, dass meine Tage als Übungsleiter auf der Uni vorbei sind. Du wirkst mir genau so wie mein Lieblingstyp von Studenten damals: keine Ahnung vom Programmieren, kein bisschen von seinem Code selbst geschrieben (das trifft bei dir mit diesem Thread sowas von zu; mittlerweile kannst du alle, die dir geholfen haben als Autoren des Codes auflisten), nichts am Code verstehen, aber stets vehement behaupten, dass man eh programmieren will und kann, bemüht sei und Code eh immer verstehe, wenn man ihn liest.
> 
> Aus Erfahrung weiß ich,
> 
> ...


Den Code hat der prof gegeben


----------



## mihe7 (16. Apr 2019)

Heyoka955 hat gesagt.:


> Ich habe programmieren ohne zu lernen bestanden.


Klar, wenn der Kurs schon "Programmieren ohne zu lernen" heißt.


----------



## Heyoka955 (16. Apr 2019)

mihe7 hat gesagt.:


> Klar, wenn der Kurs schon "Programmieren ohne zu lernen" heißt.


Ne der hieß Einführung in programmieren. Aber Druck ist das Problem. Ich komm mit Druck und zulaaaung selten klar.


----------



## flopalko (16. Apr 2019)

Heyoka955 hat gesagt.:


> Ne der hieß Einführung in programmieren. Aber Druck ist das Problem. Ich komm mit Druck und zulaaaung selten klar.


Was soll denn "zulaaaung" heißen?
Außerdem sind das keine guten Voraussetzungen für einen Consultant oder IT Projektleiter. Da hat man schon andauernd Druck...



Heyoka955 hat gesagt.:


> Den Code hat der prof gegeben


Das wiederum widerspricht deiner These, dass du Code den du bekommst immer verstehst, denn von diesem Code hast du absolut keine Ahnung.
Außerdem waren das allgemeine Beschreibungen aus meinen Erfahrungen. Die Anmerkung bezüglich der Autoren bezog sich dann auf die Änderungen die du vornehmen sollst.
Bei den nächsten Projekten wirst du denke/hoffe ich selbst Code produzieren müssen, da wird's dann sicherlich eng für dich.


----------



## Heyoka955 (16. Apr 2019)

flopalko hat gesagt.:


> Was soll denn "zulaaaung" heißen?
> Außerdem sind das keine guten Voraussetzungen für einen Consultant oder IT Projektleiter. Da hat man schon andauernd Druck...
> 
> 
> ...


Kriege ich hin, ich knn dir gerne sagen was der Code macht.


----------



## Heyoka955 (16. Apr 2019)

J wir


flopalko hat gesagt.:


> Was soll denn "zulaaaung" heißen?
> Außerdem sind das keine guten Voraussetzungen für einen Consultant oder IT Projektleiter. Da hat man schon andauernd Druck...
> 
> 
> ...


----------



## kneitzel (16. Apr 2019)

Heyoka955 hat gesagt.:


> Ja das Problem war es wurde zu viel diskutiert und viel Input gegeben und mein brain war am Ende weg. Den Code hab ich zu 80 Prozent verstanden und am Anfang kannst du die anderen fragen dass ich genau diesen Ansatz hatte aber mein Kopf schnell verwirrt war.
> Ich habe programmieren ohne zu lernen bestanden. Ich kann das aber Druck macht alles kaputt.



Dem kann ich nicht folgen. Es ist vollkommen normal, dass man hin und wieder an einen Punkt kommt, an dem man nicht weiter kommt. Wenn für jetzt zu viel Input gekommen ist, dann schläft man einmal drüber oder macht eine Pause. Und dann geht man den Input erneut durch!

Dir wurden manche Dinge mehrfach gesagt, auf Hinweise bist du selten eingegangen, ... Das ist in meinen Augen Ignoranz und absolut nicht so lapidar ab zu tun! Hinzu Deine Art und Weise hier zu posten - das ist schon eine Zumutung. Und dann kommt da auch noch Dein toller Beitrag im anderen Thread ... wir haben in diesem Thread massiv Geduld mit Dir gehabt und wir haben bewiesen, dass dies eben kein Flamen oder Shitstorm ist.


----------



## mihe7 (16. Apr 2019)

@flopalko 



mihe7 hat gesagt.:


> Der Witz kommt ja am Schluss, wenn er dann die Lösung hat. Ich werde zu gegebener Zeit hierauf verweisen





Heyoka955 hat gesagt.:


> das Problem war es wurde zu viel diskutiert





Heyoka955 hat gesagt.:


> Den Code hab ich zu 80 Prozent verstanden





Heyoka955 hat gesagt.:


> dass ich genau diesen Ansatz hatte





Heyoka955 hat gesagt.:


> Ich kann das



Ich hätte ja eigentlich einen Kommentar wie im anderen Thread erwartet, aber noch ist er ja nicht ganz durch.


----------



## flopalko (16. Apr 2019)

Heyoka955 hat gesagt.:


> Kriege ich hin, ich knn dir gerne sagen was der Code macht.


Du gehst sowieso nie auf die Fragen in Posts ein, die du zitierst. Was soll den jetzt "zulaaaung" bedeuten?
Ich gehe aber auf das Angebot gerne ein, erkläre mir ganz genau was der Code macht, jede Methode detailliert bitte. Ich sehe das auch durchaus als Schreibübung für dich. Du musst schließlich auch lernen dich besser (und vor allem verständlich) auszudrücken.
Ich warte und mache mir derweil Popcorn


----------



## flopalko (16. Apr 2019)

mihe7 hat gesagt.:


> @flopalko
> Ich hätte ja eigentlich einen Kommentar wie im anderen Thread erwartet, aber noch ist er ja nicht ganz durch.


und wieder hast du Recht behalten @mihe7


----------



## Heyoka955 (16. Apr 2019)

kneitzel hat gesagt.:


> Dem kann ich nicht folgen. Es ist vollkommen normal, dass man hin und wieder an einen Punkt kommt, an dem man nicht weiter kommt. Wenn für jetzt zu viel Input gekommen ist, dann schläft man einmal drüber oder macht eine Pause. Und dann geht man den Input erneut durch!
> 
> Dir wurden manche Dinge mehrfach gesagt, auf Hinweise bist du selten eingegangen, ... Das ist in meinen Augen Ignoranz und absolut nicht so lapidar ab zu tun! Hinzu Deine Art und Weise hier zu posten - das ist schon eine Zumutung. Und dann kommt da auch noch Dein toller Beitrag im anderen Thread ... wir haben in diesem Thread massiv Geduld mit Dir gehabt und wir haben bewiesen, dass dies eben kein Flamen oder Shitstorm ist.


Habe auch nie gesagt dass das einer ist. 
Das Problem war ich habe euch Manchnal nicht ganz verstanden. 
Aber das mit meiner Mühe zur Rechtschreibung stimmt!!!


----------



## kneitzel (16. Apr 2019)

Heyoka955 hat gesagt.:


> Habe auch nie gesagt dass das einer ist.
> Das Problem war ich habe euch Manchnal nicht ganz verstanden.
> Aber das mit meiner Mühe zur Rechtschreibung stimmt!!!



Weißt Du was hilft, wenn man etwas nicht verstanden hat? Nachfragen!
Dazu musst Du auf das, was Dir gesagt wurde eingehen und dazu formulieren, was an der Antwort Du nicht verstanden hast oder konkrete Fragen dazu stellen. Das einfach ignorieren führt einfach nur dazu, dass alle viel Zeit verschwenden....


----------



## Heyoka955 (16. Apr 2019)

flopalko hat gesagt.:


> und wieder hast du Recht behalten @mihe7


erste methhode erstellt die karte die koordianten sorgen dazu dass der rover in der mitte ist. Die datenstruktur speichert als key den index der Hindernisse und rover, und der Inhalt sind die einzelnen zeichen, man darf auch nicht vergessen dass die zueinander refernziert sind, wie bei einer linkd list. Das heißt
key    value
{0,1}   Hindernis
{0,2} Hindernis
{0,3} null, das für die leeren Felder spricht.

soll ich mit der zweiten Methode weiter machen?


----------



## mihe7 (16. Apr 2019)

Heyoka955 hat gesagt.:


> soll ich mit der zweiten Methode weiter machen?


Ich schwanke zwischen "ja, bitte" und "bitte nicht".



Heyoka955 hat gesagt.:


> Da war ja die eine Fehlermeldung in der Expertin klasse Rover is missin und die stand unten bei der Ausgabe nie wenn der Rover verschwand und ein Kollege meinte mir man solle das so machen.


Mir ist immer noch nicht klar, warum man eine Exception "Rover is missing" werfen sollte, wenn der Rover vorhanden ist.


----------



## Heyoka955 (16. Apr 2019)

mihe7 hat gesagt.:


> Ich schwanke zwischen "ja, bitte" und "bitte nicht".
> 
> 
> Mir ist immer noch nicht klar, warum man eine Exception "Rover is missing" werfen sollte, wenn der Rover vorhanden ist.


war das nicht richtig ws ich gesagt habe?

nein man muss das schritt für schritt gehen glaube ich, also man hätte mit der aufgabe 1 anfnagen sollen und die hochladen mit einem commit und danach sollte man die aufgabe zwei machen und dann die drei


----------



## flopalko (16. Apr 2019)

Heyoka955 hat gesagt.:


> erste methhode erstellt die karte die koordianten sorgen dazu dass der rover in der mitte ist. Die datenstruktur speichert als key den index der Hindernisse und rover, und der Inhalt sind die einzelnen zeichen, man darf auch nicht vergessen dass die zueinander refernziert sind, wie bei einer linkd list. Das heißt
> key    value
> {0,1}   Hindernis
> {0,2} Hindernis
> ...


Zitiere doch dafür auch den richtigen Beitrag. Bleiben wir derweil noch bei dieser Methode: erkläre diese bitte vernünftig und in verständlicher Sprache. Insbesondere der erste Satz ist einfach nicht verständlich geschrieben.


----------



## Heyoka955 (16. Apr 2019)

die erste Methode speichert die verschiedenen Koordinaten Möglichkeiten in der hashmap, wir haben als key einen 2d array und als value die einzelnen zeichen, dabei existieren mehrere Möglichkeiten, die Hindernisse werden dadurch erschaffen durch einen long wert den man übergeben bekommt also.  
Reicht das?


----------



## mihe7 (16. Apr 2019)

Heyoka955 hat gesagt.:


> war das nicht richtig ws ich gesagt habe?


Nein. Du meinst vermutlich das Richtige, schreibst aber das Falsche.



Heyoka955 hat gesagt.:


> man muss das schritt für schritt gehen glaube ich, also man hätte mit der aufgabe 1 anfnagen sollen


Das hatte ich Dir gefühlte 200-mal geschrieben und Dein Prof. hat das in einer Mail bestätigt. 



> *Ihre Aufgaben*
> 
> Reparieren Sie einen Bug, bei dem der Rover plötzlich verschwindet. Sie können den Bug mit ./gradlew run --args="lff 4711" reproduzieren. Die Zahl sorgt dafür, dass die Hindernisse immer an den gleichen Stellen sind.
> Formen Sie den Code nach den Ideen, die Sie in Aufgabe 1 entwickelt haben um. Jeder Änderungsschritt (d.h. eine Änderung des Quelltextes, die einen Zweck hat) soll ein einzelner Commit sein, nach jedem Commit soll die Anwendung compilier- und startbar sein. Jeder Commit soll eine Commitnachricht haben, aus dem man nachvollziehen kann, welchen Zweck die Änderung hat. Ziehen Sie auch eine Änderung der benutzten Datenstrukturen in Betracht.
> Passen Sie den Bewegungscode so an, dass der Roboter einzelne Befehle ignoriert, die ihn in ein Hindernis laufen lassen würden.



Also nochmal die Frage: wie kommst Du darauf, dass bei 1. eine Exception geworfen werden soll? Verschwindet dann dadurch der Rover nicht?


----------



## Heyoka955 (16. Apr 2019)

mihe7 hat gesagt.:


> Nein. Du meinst vermutlich das Richtige, schreibst aber das Falsche.
> 
> 
> Das hatte ich Dir gefühlte 200-mal geschrieben und Dein Prof. hat das in einer Mail bestätigt.
> ...


ne schau bei der aufgabe 1 sollte man das anfangsprogramm nehmen und als erstes sorgen, dass die exception geworfen wird bei einem befehl das den rover dazu bringt über ein Hindernis zu laufen


----------



## kneitzel (16. Apr 2019)

Heyoka955 hat gesagt.:


> erste methhode erstellt die karte die koordianten sorgen dazu dass der rover in der mitte ist. Die datenstruktur speichert als key den index der Hindernisse und rover, und der Inhalt sind die einzelnen zeichen, man darf auch nicht vergessen dass die zueinander refernziert sind, wie bei einer linkd list. Das heißt
> key    value
> {0,1}   Hindernis
> {0,2} Hindernis
> ...



Hmm, habe ich da was übersehen? Leere Felder sind erst einmal nicht gespeichert. Es werden lediglich Hindernisse und der Rover eingefügt.



Heyoka955 hat gesagt.:


> die erste Methode speichert die verschiedenen Koordinaten Möglichkeiten in der hashmap, wir haben als key einen 2d array und als value die einzelnen zeichen, dabei existieren mehrere Möglichkeiten, die Hindernisse werden dadurch erschaffen durch einen long wert den man übergeben bekommt also.
> Reicht das?



Ein ganz wichtiger Tipp: Lies einen Beitrag noch einmal durch, ehe du ihn abschickst.
Und selbst wenn man davon absieht, dass dein Text kaum zu verstehen ist: es beschreibt nicht, was die Funktion macht.


----------



## Heyoka955 (16. Apr 2019)

kneitzel hat gesagt.:


> Hmm, habe ich da was übersehen? Leere Felder sind erst einmal nicht gespeichert. Es werden lediglich Hindernisse und der Rover eingefügt.
> 
> 
> 
> ...


die Funktion speichert die koordianten und die Hindernisse und den rover in der linkedhashmap, dabei setzt sie den rover in die mitte, nicht dass sie das Feld printet sondern nur von den Koordinaten hat der rover die Mitte. Denke das muss reichen.


----------



## Heyoka955 (16. Apr 2019)

*Projekt 1 - Aufgabe 2.1 (Bugfix) Unklarheit bei der Aufgabenstellung*


Hi zusammen,
bei der ersten "richtigen" Aufgabe heisst es, dass wir einen Bug fixen sollen bei dem der Rover verschwindet.
Ist damit gemeint dass der Rover gar nicht erst verschwinden soll?
Oder reicht es dafür, die "Rover missing in Action" fehlermeldung zu throwen (welche ursprünglich ja nicht ge"throwt" wird).

Weil in der zweiten Teilaufgabe sollen wir den Code ja refractoren so wie ich das verstehe. Also schätze ich ist der Sinn der Sache, einmal Aufgabenorientierten Code in Aufgabe 1 zu schreiben und einmal "nachhaltigen" Code in Aufgabe 2 und 3 zu schreiben.

Danke im vorraus

Viele Grüße
TrueAlpha

#sauakuf







 Antworten                         Toggle Dropdown             



 
 




In Schritt 1 geht es darum, dass der Rover schlichtweg nicht mehr verschwindet. Das haben Sie also richtig erkannt.

Bei den weiteren Aufgaben geht es dann eben darum den Code zu transformieren und alle Schritte dann einzeln logisch zu unterteilen und in Commits zusammen zu fassen.

Ihre Interpretation der Aufgabenstellung ist also korrekt. Bitte daran denken schöne schlanke Commits zu schreiben, die in sich abgeschlossen sind und nur jeweils eine Transformation beinhalten.




also das sagte man im forum


----------



## mihe7 (16. Apr 2019)

Frage:


Heyoka955 hat gesagt.:


> Ist damit gemeint dass der Rover gar nicht erst verschwinden soll?
> Oder reicht es dafür, die "Rover missing in Action" fehlermeldung zu throwen (welche ursprünglich ja nicht ge"throwt" wird).


Antwort:


Heyoka955 hat gesagt.:


> In Schritt 1 geht es darum, dass der Rover schlichtweg nicht mehr verschwindet.


----------



## kneitzel (16. Apr 2019)

Also die Beschreibung einer Funktion sollte exakt sein. Wenn ich diese Funktion erstelleKarteUndSetzeRoverInDirMitte beschreiben sollte, würde ich sagen:
Die Funktion erstellt eine Map mit unserer int-Array Koordinate als Key und einem String als Wert.
Für die virtuelle Karte mit dem Abmessungen BREITE_MARSES zu HOEHE_MARSES wird für jedes Feld eine Zufallszahl im Bereich von  0..1 erzeugt und so diese kleiner 0,25 ist und es sich nicht um die Koordinate des Rovers handelt, wird in der Karte für diese Koordinate ein "#" als Hindernis gespeichert.
Am Ende wird der Rover mit seiner Koordinate mit Blickrichtung Norden in die Map eingetragen.

Vergleich das einmal mit den zwei Erläuterungen von Dir ...


----------



## Heyoka955 (16. Apr 2019)

kneitzel hat gesagt.:


> Also die Beschreibung einer Funktion sollte exakt sein. Wenn ich diese Funktion erstelleKarteUndSetzeRoverInDirMitte beschreiben sollte, würde ich sagen:
> Die Funktion erstellt eine Map mit unserer int-Array Koordinate als Key und einem String als Wert.
> Für die virtuelle Karte mit dem Abmessungen BREITE_MARSES zu HOEHE_MARSES wird für jedes Feld eine Zufallszahl im Bereich von  0..1 erzeugt und so diese kleiner 0,25 ist und es sich nicht um die Koordinate des Rovers handelt, wird in der Karte für diese Koordinate ein "#" als Hindernis gespeichert.
> Am Ende wird der Rover mit seiner Koordinate mit Blickrichtung Norden in die Map eingetragen.
> ...


das lustige ist der name der Methode ist sogar von mir selber hahahah
ja okay dann achte darauf-


----------



## Heyoka955 (16. Apr 2019)

mihe7 hat gesagt.:


> Frage:
> 
> Antwort:


wozu dann die aufgabe 3, sind die behindert oder so lol


----------



## Xyz1 (16. Apr 2019)

@Heyoka955 höre einfach nicht auf @flopalko , MMN war das ein schlag unter die Gürtellinie. Ich würde erwidern, umgekehrt auch solche Tutoren gesehen zu haben, die einfach nur nach oben buckeln und nach unten treten (fast sozialchauvinistische Einstellungen...). Also denen es unter Umständen egal ist, ob sie was und wie vermitteln können. Man mag sich kritisch darüber auseinandersetzen, inwiefern dies von den Dozierenden so weitervorgeleitet wird usw. - aber davon habe ich fast kA.

DENNOCH wäre es zu begrüßen, diesen Faden nicht weiter wie wildwüchsiges Unkraut wuchern zu lassen.


----------



## flopalko (16. Apr 2019)

Tobias-nrw hat gesagt.:


> @Heyoka955 höre einfach nicht auf @flopalko , MMN war das ein schlag unter die Gürtellinie. Ich würde erwidern, umgekehrt auch solche Tutoren gesehen zu haben, die einfach nur nach oben buckeln und nach unten treten (fast sozialchauvinistische Einstellungen...). Also denen es unter Umständen egal ist, ob sie was und wie vermitteln können. Man mag sich kritisch darüber auseinandersetzen, inwiefern dies von den Dozierenden so weitervorgeleitet wird usw. - aber davon habe ich fast kA.
> 
> DENNOCH wäre es zu begrüßen, diesen Faden nicht weiter wie wildwüchsiges Unkraut wuchern zu lassen.


Mir war klar, dass sowas kommen wird, daher hab ich auch noch den letzten Absatz dazugeschrieben.
Um auf deinen Post konkret einzugehen:

ad "nach oben buckeln": Das hat bei uns niemand getan, wollte auch niemand und hätte auch nichts gebracht. Wir hatten Vorgaben vom Professor was wie umzusetzen ist und haben dies auch so gemacht. Die Resonanz der Studenten war durchaus positiv, außer von denjenigen die beratungsresistent waren.
ad "nach unten treten": Darum ging es eben nicht. In den Betreuungseinheiten waren wir immer für die Studenten da und diese konnten gerne fragen stellen und bekamen immer gute Hilfestellungen. Bei den Studenten, die das Angebot angenommen haben kam dies sehr gut an. Bei den Abgaben hatten wir dennoch die Vorgabe ganz genau zu überprüfen ob der Code selbst geschrieben wurde und detaillierte Fragen dazu zu stellen. Genau da flogen dann halt einige auf, die Vorgabe war klar: dies muss negativ beurteilt werden, beim 2. Mal auffliegen ist die Übung für denjenigen sofort dabei. Hier gab es keinen Spielraum.


----------



## Xyz1 (16. Apr 2019)

Da fällt mir etwas lustiges am Rande ein, mir wurde auch mal vorgeworfen, etwas komplexeren C++11-Code NICHT selbstgeschrieben zu haben, weil ich diesen (wegen der Komplexität) nicht so knülle erklären konnte. Letztendlich betraf es aber nur die Gesamtpunktzahl, die Übung war bestanden und extra Einspruch wollte ich deswegen nicht erheben.

@flopalko Ich meinte damit natürlich nicht Dich persönlich, deswegen hatte ich im Allgemeinen geschrieben...


----------



## flopalko (17. Apr 2019)

@Tobias-nrw schon gut, ich wollte das trotzdem klarstellen.
Natürlich gibt es solche Tutoren auch, bei uns war das aber bei keinem so.
Ad nicht perfekt erklären: bei sehr komplexen Code ist es verständlich, dass man vielleicht nicht mehr alles ganz genau weiß, aber grundsätzlich sollte man sich in seinem Code schon auskennen. Bei Zweifeln musste dann eben live vor uns eine einfache Schleife programmiert werden. Wenn man so etwas Elementares dann nicht konnte war klar, dass der Code nicht von demjenigen stammen konnte.


----------



## Heyoka955 (17. Apr 2019)

flopalko hat gesagt.:


> @Tobias-nrw schon gut, ich wollte das trotzdem klarstellen.
> Natürlich gibt es solche Tutoren auch, bei uns war das aber bei keinem so.
> Ad nicht perfekt erklären: bei sehr komplexen Code ist es verständlich, dass man vielleicht nicht mehr alles ganz genau weiß, aber grundsätzlich sollte man sich in seinem Code schon auskennen. Bei Zweifeln musste dann eben live vor uns eine einfache Schleife programmiert werden. Wenn man so etwas Elementares dann nicht konnte war klar, dass der Code nicht von demjenigen stammen konnte.


viele tutoren machen das nur aus geld, wie oft hab ich erlebt dass ich einen tutor unnötig korigiert habe...


----------



## flopalko (17. Apr 2019)

Heyoka955 hat gesagt.:


> viele tutoren machen das nur aus geld, wie oft hab ich erlebt dass ich einen tutor unnötig korigiert habe...


Das ist wieder ein Paradebeispiel für deinen Schreibstil: man hat keine Ahnung was du mit diesem Satz eigentlich meinst.
Ein guter Tipp, der auch beim Code schreiben gilt: überlege zuerst genau was du schreiben/ausdrücken willst und schreibe erst dann.


----------



## mihe7 (17. Apr 2019)

Heyoka955 hat gesagt.:


> wozu dann die aufgabe 3, sind die behindert oder so lol


Warum soll irgendwer irgendwie behindert sein, wenn Du die Zusammenhänge der Aufgabenstellung nicht verstehst?

In Aufgabe 1 sollst Du einen Bug beheben, dabei soll Dir klar werden, was an dem Code verbessert werden kann. Das setzt Du in Aufgabe 2 um. In Aufgabe 3 geht es dann darum, eine einfache, zusätzliche Anforderung zu erfüllen. Da dieses auf Basis des geänderten (und hoffentlich verbesserten) Codes erfolgt, sollte das kein Problem darstellen.

Also: nochmal von vorne.



Heyoka955 hat gesagt.:


> wie oft hab ich erlebt dass ich einen tutor unnötig korigiert habe...


Unnötig dürfte es ziemlich gut treffen.


----------



## Xyz1 (17. Apr 2019)

Wo ist @mihe7 eigentlich, gerade da es jetzt interessant wird?  ...

(Ich leg mich schlafen, Dienstag schon wieder rum. N8!)


----------



## mihe7 (17. Apr 2019)

Melde mich zurück zum Dienst.


----------



## Xyz1 (17. Apr 2019)

Oha, wenn man von spricht.  

So Bier ist auch leer gn8.


----------



## mihe7 (17. Apr 2019)

Tobias-nrw hat gesagt.:


> So Bier ist auch leer gn8


LOL - soll ja beruhigende Wirkung haben. Gute Nacht. 

Oh, nur noch 101 Kommentare bis zum Ziel.


----------



## flopalko (17. Apr 2019)

mihe7 hat gesagt.:


> LOL - soll ja beruhigende Wirkung haben. Gute Nacht.
> 
> Oh, nur noch 101 Kommentare bis zum Ziel.


Einigen wir uns bitte alle darauf, dass Kommentar #500 der letzte zu diesem Thema sein wird?


----------



## Heyoka955 (17. Apr 2019)

hhhahahhhahaahh geil, wie lange bleibt der thread


----------



## Heyoka955 (17. Apr 2019)

flopalko hat gesagt.:


> Einigen wir uns bitte alle darauf, dass Kommentar #500 der letzte zu diesem Thema sein wird?


soll ich meinen account löschen lol


----------



## mihe7 (17. Apr 2019)

flopalko hat gesagt.:


> Einigen wir uns bitte alle darauf, dass Kommentar #500 der letzte zu diesem Thema sein wird?


Die Geister, die ich rief. Nach #500 schreib ich garantiert nichts mehr


----------



## mihe7 (17. Apr 2019)

Heyoka955 hat gesagt.:


> soll ich meinen account löschen lol


Das würde am Thread nichts ändern.


----------



## Heyoka955 (17. Apr 2019)

hhahahahhaahahahah ja okay habe die aufgabe eig schon fast! ich häte eig vornehein auf den bug kommen sollen. naja mache jetzt theoretische Informatik.


----------



## mihe7 (17. Apr 2019)

Heyoka955 hat gesagt.:


> ja okay habe die aufgabe eig schon fast!



Schön, dann können wir ja bald mit einem Ergebnis rechnen.  



Heyoka955 hat gesagt.:


> naja mache jetzt theoretische Informatik.



Oh... viel Glück Spaß.


----------



## Heyoka955 (18. Apr 2019)

Heyoka955 hat gesagt.:


> Da war ja die eine Fehlermeldung in der Expertin klasse Rover is missin und die stand unten bei der Ausgabe nie wenn der Rover verschwand und ein Kollege meinte mir man solle das so machen.
> Aber von der Aufgabe 1 her sehr unübersichtlich.


Bei mir klappt das Für den Fall mit b nicht falls f gleich b ist?
Dann gibt es eine Fehlermeldung


----------



## mrBrown (18. Apr 2019)

Heyoka955 hat gesagt.:


> Dann gibt es eine Fehlermeldung


Und welche?


----------



## Heyoka955 (18. Apr 2019)

mrBrown hat gesagt.:


> Und welche?


Finished with non zero exit


----------



## mrBrown (18. Apr 2019)

Sicher, dass es keinen Compile-Fehler und auch keine Exception gab?


----------



## Heyoka955 (18. Apr 2019)

Es 


mrBrown hat gesagt.:


> Sicher, dass es keinen Compile-Fehler und auch keine Exception gab?


ja wir haben das auf Intelij gemacht sogar


----------



## Heyoka955 (18. Apr 2019)

Heyoka955 hat gesagt.:


> Es
> 
> ja wir haben das auf Intelij gemacht sogar


Also das funktioniert.


----------



## mihe7 (18. Apr 2019)

Ich will ja nichts sagen, aber in Deinem Screenshort ist mars rot unterringelt. Hat das eine andere Bedeutung als "Fehler"?


----------



## Heyoka955 (18. Apr 2019)

mihe7 hat gesagt.:


> Ich will ja nichts sagen, aber in Deinem Screenshort ist mars rot unterringelt. Hat das eine andere Bedeutung als "Fehler"?


Die non-zero exit exception kommt raus


----------



## Heyoka955 (18. Apr 2019)

Heyoka955 hat gesagt.:


> Die non-zero exit exception kommt raus


Also der macht den nur bei lff weg und nicht bei rff


----------



## mihe7 (18. Apr 2019)

Ja und gestern war heute morgen.


----------



## Heyoka955 (18. Apr 2019)

mihe7 hat gesagt.:


> Ja und gestern war heute morgen.


----------



## Heyoka955 (18. Apr 2019)

Heyoka955 hat gesagt.:


> ```
> if (c == 'f') {
> int[] p = findeRover();
> if (get(mars, p).equals("n") && !get(mars, new int[][]{p[0],p[1]-1}).equals("#"))
> ...


So habe ich das hingeschrieben! 
Aber der funktioniert nicht wenn r übergeben wird


----------



## kneitzel (18. Apr 2019)

Also das ist doch nicht mehr dein aktueller Code. Wenn, dann musst uns den aktuellen codeabschnitt geben.

Und Du hast doch auch eine genaue Fehlermeldung. Was ist in Start.java Zeile 111? Und wieso kann man so Fehlermeldungen nicht per copy and Paste weiter geben?


----------



## Heyoka955 (18. Apr 2019)

kneitzel hat gesagt.:


> Also das ist doch nicht mehr dein aktueller Code. Wenn, dann musst uns den aktuellen codeabschnitt geben.
> 
> Und Du hast doch auch eine genaue Fehlermeldung. Was ist in Start.java Zeile 111? Und wieso kann man so Fehlermeldungen nicht per copy and Paste weiter geben?


Mein Freund ht saa Probleme, ich saß an seinem noteBook und habe das abfotografiert.

Ich schicke euch meinen code mal.
Also ich habe das so gemacht für den Fall von c = f


```
Public boolean h(char c){

if (c == 'f') {
            int[] p = findeRover();
              if (get(mars, p).equals("n") && !get(mars, new int[]{p[0],p[1]-1}).equals("#"))
                Return false;
            else if (get(mars,p).equals("s") && !get(mars, new int[] {p[0],p[1]+1}).equals("#"))
                Return false;
            else if (get(mars, p).equals("e") && !get(mars, new int[] {p[0]+1,p[1]}).equals("#"))
                Return false;
            else if (get(mars, p).equals("w") && !get(mars, new int[] {p[0]-1,p[1]}).equals("#"))
                   Return false;



Return true;

        }

}
```


----------



## kneitzel (18. Apr 2019)

Habe ich das jetzt richtig verstanden:
Wir haben zwei Computer
- diese haben einen unterschiedlichen Code
- diese haben unterschiedliche Fehlerbilder

Und nun bekommen wir den Code von c='f' von Deinem System aber die Fehler, die wir bekommen haben, waren beim anderen System. Hinzu kommt, dass das Problem bei c='b' sein sollte, oder habe ich da etwas missverstanden?
Und welche Zeile er angemeckert hat, wissen wir immer noch nicht (außer, dass es eben Zeile 111 ist.

Wenn das eine Foto von Intellij war: Intellij unterstreicht Fehler. Also gibt es definitiv Fehler in der Applikation. Statt Fotos mit dem Handy sollte man eher Screenshot machen oder so. Wenn ihr das richtige Fenster mit den Fehlermeldungen nicht finden solltet (evtl. habt ihr das ja geschlossen oder so, wobei ich meine, dass IntelliJ beim Build das Fenster auch wieder öffnen würde...) kann man mit der Maus auch auf so eine unterstrichene Stelle gehen und dann kommt nach kurzer Zeit eine Einblendung mit dem Fehler.

Oder gib uns mal den ganzen Code als Dateianhang und dann können wir auch einmal drüber schauen.


----------



## Heyoka955 (18. Apr 2019)

kneitzel hat gesagt.:


> Habe ich das jetzt richtig verstanden:
> Wir haben zwei Computer
> - diese haben einen unterschiedlichen Code
> - diese haben unterschiedliche Fehlerbilder
> ...


Mache ich jetzt wenn ich zuhause bin


----------



## Heyoka955 (18. Apr 2019)

```
package rover;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;

public class Start {

    static Random r = new Random();
    static LinkedHashMap<int[], String> mars;

    public static void init() {
        mars = new LinkedHashMap<>();
        int x = 80;
        int y = 20;
        int rx = x / 2;
        int ry = y / 2;
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                int[] p = new int[] { i, j };
                if (r.nextDouble() < 0.25 && !(rx == i && ry == j))
                    mars.put(p, "#");
            }
        }
        mars.put(new int[] { rx, ry }, "n");
    }

    public static int[] maximum(Set<int[]> set) {
        int[] x = new int[2];
        for (int[] e : set) {
            if (e[0] > x[0])
                x[0] = e[0];
            if (e[1] > x[1])
                x[1] = e[1];
        }
        return x;
    }

    public static String get(Map<int[], String> kloetze, int[] p) {
        Set<Entry<int[], String>> entrySet = kloetze.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getKey()[0] == p[0] && entry.getKey()[1] == p[1])
                return entry.getValue();
        }
        return null;
    }

    public static void out() {
        // Set<int[]> keySet = mars.keySet();
        // for (int[] e : keySet) {
        // if (e[0] == 39 && e[1] == 10)
        // System.err.println(mars.get(e) + " " + e.hashCode());
        // }

        int[] max = maximum(mars.keySet());
        for (int j = 0; j < max[1]; j++) {
            for (int i = 0; i < max[0]; i++) {
                // System.out.println(i + "," + j + ": " + get(mars, new int[] { i, j }));

                if (get(mars, new int[] { i, j }) == null) {
                    System.out.print(" ");
                    continue;
                }
                if (get(mars, new int[] { i, j }).equals("#"))
                    System.out.print("#");
                else if (get(mars, new int[] { i, j }).equals("n"))
                    System.out.print("^");
                else if (get(mars, new int[] { i, j }).equals("s"))
                    System.out.print("V");
                else if (get(mars, new int[] { i, j }).equals("e"))
                    System.out.print(">");
                if (get(mars, new int[] { i, j }).equals("w"))
                    System.out.print("<");

            }
            System.out.println();
        }
        for (int i = 0; i < max[0]; i++) {
            System.out.print("=");
        }
        System.out.println();
    }

    public static void main(String[] args) {

        if (args.length > 1) {
            long seed = Long.parseLong(args[1]);
            r.setSeed(seed);
            // System.out.println("Seed: " + seed);
        }
        init();
        String pg = args[0];
        out();
        for (int i = 0; i < pg.length(); i++) {
            make(pg.charAt(i));
            out();
        }
    }

    public static void make(char c) {
        
        
        if (c == 'f') {
            int[] p = findeRover();
            if (get(mars, p).equals("n") && !get(mars, new int[]{p[0],p[1]-1}).equals("#"))
                p[1]--;
            else if (get(mars, p).equals("s") && !get(mars, new int[] {p[0],p[1]+1}).equals("#"))
                p[1]++;
            else if (get(mars, p).equals("e") && !get(mars, new int[] {p[0]+1,p[1]}).equals("#"))
                p[0]++;
            else if (get(mars, p).equals("w") && !get(mars, new int[] {p[0]-1,p[1]}).equals("#"))
                p[0]--;
        } else if (c == 'b') {
            int[] p = findeRover();
            if (get(mars, p).equals("s"))
                p[1]--;
            else if (get(mars, p).equals("n"))
                p[1]++;
            else if (get(mars, p).equals("w"))
                p[0]++;
            else if (get(mars, p).equals("e"))
                p[0]--;
        } else if (c == 'l') {
            int[] p = findeRover();
            if (get(mars, p).equals("n"))
                mars.put(p, "w");
            else if (get(mars, p).equals("s"))
                mars.put(p, "e");
            else if (get(mars, p).equals("e"))
                mars.put(p, "n");
            else if (get(mars, p).equals("w"))
                mars.put(p, "s");
        } else if (c == 'r') {
            int[] p = findeRover();
            if (get(mars, p).equals("w"))
                mars.put(p, "n");
            else if (get(mars, p).equals("e"))
                mars.put(p, "s");
            else if (get(mars, p).equals("n"))
                mars.put(p, "e");
            else if (get(mars, p).equals("s"))
                mars.put(p, "w");
        }

    }
    

    
    

    private static int[] findeRover() {
        Set<Entry<int[], String>> entrySet = mars.entrySet();
        for (Entry<int[], String> entry : entrySet) {
            if (entry.getValue() != null && !entry.getValue().equals("#"))
                return entry.getKey();
        }
        throw new IllegalStateException("Rover missing in action");
    }

}
```


----------



## Xyz1 (18. Apr 2019)

77 comments left.


----------



## Heyoka955 (18. Apr 2019)

Tobias-nrw hat gesagt.:


> 77 comments left.


Hilf mir mal haahah


----------



## mrBrown (18. Apr 2019)

Heyoka955 hat gesagt.:


> Die non-zero exit exception kommt raus


Nur so als Hinweis: das rote* Exception in thread ...* ist die Exception und die Fehlermeldung, nicht das "non-zero exit".


----------



## Heyoka955 (18. Apr 2019)

mrBrown hat gesagt.:


> Nur so als Hinweis: das rote* Exception in thread ...* ist die Exception und die Fehlermeldung, nicht das "non-zero exit".


was heißt das denn expection in thread


----------



## kneitzel (18. Apr 2019)

Also gut, dann wollen wir da mal dran gehen.

Du hast IntelliJ, also wollen wir jetzt mal zusammen den Fehler finden und ggf beheben.

Du siehst erst einmal die Exception: Die NPE tritt in Start.java Zeile 111 auf. Dann geh doch mal auf die Zeile 111. IntelliJ zeigt ja die Zeilen an, so dass dies erst einmal möglich sein sollte. Zu welcher Zeile kommst Du da genau?

Und nun setzen wir in dieser Zeile einen sogenannten Breakpoint, d.h. wir sagen IntelliJ, dass es aufhören soll das Programm abzuarbeiten, wenn es in diese Zeile kommt. Dazu klicken wir einfach links neben das Codefenster - zwischen den Rahmen und der Zeilennummer, so dass da ein roter Punkt erscheint:


Als nächstes starten wir das Programm mit dem Debugger. Dazu klicken wir oben in der Leiste nicht auf den grünen pfeil sondern den grünen Käfer daneben. (Die Start-Config wirst Du ja gesetzt haben mit dem "lff 4711".

Nun sollte die Ausführung laufen bis zu diesem Punkt und Du solltest das Debugger Fenster sehen:

Im oberen Bereich und am linken Rand siehst Du die wichtige Knöpfe:
Für Dich ist wichtig:
Oben:
Step over: Die Zeile, in der Du gerade bist, wird abgearbeitet und Du bist in der nächsten Zeile.
Step into: Es wird in einen Funktionsaufruf gesprungen und Du bist dann in der nächsten Funktion.
Step Out: Wenn Du in eine Funktion kommst, die Dich nicht interessiert, dann kannst Du damit die Funktion abarbeiten und bist dann wieder eine Ebene höher.
Links:
Resume Program - So der Breakpoint erreicht wurde und die Begleitumstände nicht so sind wie gedacht (hier würde es bedeuten: Du bist ohne Exception in die nächste Zeile gekommen), kannst Du damit den Debugger weiter laufen lassen. Dieser läuft dann, bis er wieder einen Breakpoint erreicht.
Stop: Debugger stoppen

Damit kannst Du jetzt also mit Step into schauen, was für Funktionen er aufruft und was er zurück gibt. Und das Problem, welches Du untersuchst, ist eine Null Pointer Exception (NPE), d.h. du versuchst auf einem null Wert etwas aufzurufen.

Sollte dieses step into zu schwer sein, dann kannst Du Dinge in mehrere Befehle aufteilen. Also z.B. ein

```
if (stringReturningFunction().equals("something")) { ... }
```
kannst Du umschreiben in

```
String returnedValue = stringReturningFunction();
if (returnedValue.equals("something")) { ... }
```
Wenn Du dann mit dem Debugger durchgehst, dann wird erst die Funktion aufgerufen und bist danach auf dem if. Und dann kannst Du im großen Bereich des Debuggers die Variable returnedValue ansehen....

Wenn Du dies machst: Erkennst Du, woher die NPE kommt? Wie kannst Du die verhindern?


----------



## Heyoka955 (18. Apr 2019)

kneitzel hat gesagt.:


> Also gut, dann wollen wir da mal dran gehen.
> 
> Du hast IntelliJ, also wollen wir jetzt mal zusammen den Fehler finden und ggf beheben.
> 
> ...


Try catch?


----------



## mihe7 (18. Apr 2019)

Heyoka955 hat gesagt.:


> Try catch?


Das Kommentar/Antwort-Verhältnis bezogen auf den Inhalt von @kneitzel / @Heyoka955 strebt irgendwie gegen @kneitzel. Wobei bezogen auf den Inhalt eher gegen Unendlich.


----------



## kneitzel (18. Apr 2019)

Ohh je. Java Grundlagen. Was eine Exception ist, sollte doch bekannt sein, gerade da doch in dem Code auch eine throw Anweisung enthalten war.

==> Stell bitte sicher, dass Du genau weisst, was welcher Befehl macht! Mach ein paar kleine Tests!

Falls Du kein gutes Java Buch hast, gibt es online einiges, was frei und in Deutsch ist. So empfehle ich regelmäßig:




__





						Inhaltsverzeichnis
					





					openbook.rheinwerk-verlag.de
				




Und ein Test den Du dringen machen solltest: Starte mal eine Applikation die in der main Funktion nur folgenden Code hat:

```
throw new RuntimeException("Meine erste eigene Exception");
```

Was siehst Du, wenn Du den Code ausführst?


----------



## Heyoka955 (18. Apr 2019)

kneitzel hat gesagt.:


> Ohh je. Java Grundlagen. Was eine Exception ist, sollte doch bekannt sein, gerade da doch in dem Code auch eine throw Anweisung enthan war.
> 
> ==> Stell bitte sicher, dass Du genau weisst, was welcher Befehl macht! Mach ein paar kleine Tests!
> 
> ...


Soll er ganz nach unten und das behebt doch immernoch nicht den Bug genau? Oder willst du darauf du aufbauen.


----------



## kneitzel (18. Apr 2019)

Heyoka955 hat gesagt.:


> Try catch?



Nein!

Warum rätst Du anstatt Dich ernsthaft mit dem auseinander zu setzen, was man Dir sagt?

Wenn man Exceptions bekommt, weil man im Code grobe Fehler hat, dann bringt ein Abfangen nichts. Die Fehler raus machen wäre wohl deutlich besser! Also muss man erkennen, wie es zu dem Fehler kommt um dann diese Fehlersituation zu vermeiden!


----------



## Heyoka955 (18. Apr 2019)

Heyoka955 hat gesagt.:


> Soll er ganz nach unten ner das behebt doch immernoch nicht den Bug genau?





kneitzel hat gesagt.:


> Nein!
> 
> Warum rätst Du anstatt Dich ernsthaft mit dem auseinander zu setzen, was man Dir sagt?
> 
> Wenn man Exceptions bekommt, weil man im Code grobe Fehler hat, dann bringt ein Abfangen nichts. Die Fehler raus machen wäre wohl deutlich besser! Also muss man erkennen, wie es zu dem Fehler kommt um dann diese Fehlersituation zu vermeiden!


ich mache das morgen aber leider bin ich gleich weg daher hab ich geraten.

Wird langsam Zeit mit Debuggen anzufangen...
Die haben uns das garnicht beigebracht.


----------



## kneitzel (18. Apr 2019)

Heyoka955 hat gesagt.:


> Soll er ganz nach unten und das behebt doch immernoch nicht den Bug genau? Oder willst du darauf du aufbauen.


Nein, vergiss den Rover. Als ersten Schritt musst Du Dein Halbwissen durch echtes Wissen ersetzen! So lange Dir Basiswissen fehlt wirst Du nicht weiter kommen, denn eine fertige Lösung dürftest Du von niemanden bekommen.

Du studierst! Das bedeutet, dass Du selbständig Dir Wissen aneignen musst. Fang endlich damit an! Es gibt keine schnellen Wege. Du bist am studieren und das bedeutet, sich Wissen anzueignen. Und diese Aufgaben dienen dazu, euch etwas an die Hand zu geben. Also fang endlich an, die erkannten Wissenslücken zu schließen!


----------



## Heyoka955 (18. Apr 2019)

kneitzel hat gesagt.:


> Nein, vergiss den Rover. Als ersten Schritt musst Du Dein Halbwissen durch echtes Wissen ersetzen! So lange Dir Basiswissen fehlt wirst Du nicht weiter kommen, denn eine fertige Lösung dürftest Du von niemanden bekommen.
> 
> Du studierst! Das bedeutet, dass Du selbständig Dir Wissen aneignen musst. Fang endlich damit an! Es gibt keine schnellen Wege. Du bist am studieren und das bedeutet, sich Wissen anzueignen. Und diese Aufgaben dienen dazu, euch etwas an die Hand zu geben. Also fang endlich an, die erkannten Wissenslücken zu schließen!


Jo ich lese mir das durch morgen und schaue das an.
Ich weiß ungefähr wie eine try catch Funktion und Throws funktionieren.


----------



## kneitzel (18. Apr 2019)

mihe7 hat gesagt.:


> Das Kommentar/Antwort-Verhältnis bezogen auf den Inhalt von @kneitzel / @Heyoka955 strebt irgendwie gegen @kneitzel. Wobei bezogen auf den Inhalt eher gegen Unendlich.


Tja, es hatte mal den Anschein, als ob da jetzt evtl. mal etwas von ihm kommt. Aber das war wohl nur eine Täuschung. Aber schauen wir mal, wie es dann weiter gehen wird. Aber mit seinen Versuchen "smart und schnell" zu sein, hat er wohl schon massiv Zeit vergeudet. Die Zeit von Anfang an richtig genutzt und er hätte deutlich mehr Wissen zu Java und er hätte dann wohl auch schon funktionierenden Code.



Heyoka955 hat gesagt.:


> Jo ich lese mir das durch morgen und schaue das an.
> Ich weiß ungefähr wie eine try catch Funktion und Throws funktionieren.



Es geht nicht darum, ungefähr zu wissen, wie die funktionieren. try/catch brauchst du erst einmal nicht. "Exceptions should only happen on exceptional behaviour.". Die kannst Du bei einer Uni-Aufgabe größtenteils ignorieren. Also wenn jemand eine Zahl eingeben soll, aber text eingibt und du dann diesen versuchst zu einem int zu parsen: Dann steigt die Applikation halt aus. Du willst ein Textfile lesen und das ist nicht da oder du hast keine Rechte? Scheiss drauf. Bei einer Applikation wäre das wichtig, denn natürlich soll z.B. Word nicht einfach abstürzen, nur weil du eine Datei nicht lesen kannst. Aber darum geht es hier ja nicht.

Also schau Dir an, woher die Exception kommt und dann behebe den Fehler. (Bei den obrigen Beispielen würdest du halt korrekten Input liefern, die Datei an der richtigen Stelle anlegen oder für die notwendigen Rechte sorgen ....) Bei Dir sind es aber halt Fehler im Code, die Du erkennen und dann beheben musst.

Übrigens ein sehr gutes Beispiel für ein BestPractice, auf das ich dann nach Behebung des Fehlers kurz eingehen werde. Erinnere mich, so ich das vergessen sollte.


----------



## Heyoka955 (18. Apr 2019)

kneitzel hat gesagt.:


> Tja, es hatte mal den Anschein, als ob da jetzt evtl. mal etwas von ihm kommt. Aber das war wohl nur eine Täuschung. Aber schauen wir mal, wie es dann weiter gehen wird. Aber mit seinen Versuchen "smart und schnell" zu sein, hat er wohl schon massiv Zeit vergeudet. Die Zeit von Anfang an richtig genutzt und er hätte deutlich mehr Wissen zu Java und er hätte dann wohl auch schon funktionierenden Code.
> 
> 
> 
> ...


Aber ich würde gerne wissen ob der Fehler an meiner if Bedingung liegt als Tipp.
Weil vom Prinzip her müsste das richtig sein?


----------



## kneitzel (18. Apr 2019)

Heyoka955 hat gesagt.:


> Aber ich würde gerne wissen ob der Fehler an meiner if Bedingung liegt als Tipp.
> Weil vom Prinzip her müsste das richtig sein?



Hast Du Dir die Zeile 111, in der die Exception geworfen wurde, einmal angesehen?
Wenn in der Zeile eine if Anweisung steht, dann wird es wohl daran liegen.
Die könnte man anpassen, aber man könnte sie auch so lassen und den Fehler woanders beheben (das wäre meine bevorzugte Lösung, aber zu best practices kommen wir später (So du das gelöst bekommst).


----------



## mihe7 (18. Apr 2019)

kneitzel hat gesagt.:


> Tja, es hatte mal den Anschein, als ob da jetzt evtl. mal etwas von ihm kommt.


Ach, Du hast nur das @Heyoka955-Prinzip noch nicht verstanden:


Heyoka955 hat gesagt.:


> Oder willst du darauf du aufbauen.


Die Kurzform: "Treibe die Massen an den Rande eines Nervenzusammenbruchs, dann wird die Lösung zu Dir kommen." (weil irgendjemand entnervt aufgibt und die Lösung postet )


----------



## AndiE (18. Apr 2019)

```
else if (get(mars, p).equals("s") && !get(mars, new int[] {p[0],p[1]+1}).equals("#"))
```
Das ist der Coode an besagter Stelle. Für mich ist das "worst practise", da eine anzahl Anweisungen in einer Zeile stehen. Das muss man schon umschreiben(können), um den Fehler zu finden(, dessen Ursache aber woanders liegt)


----------



## flopalko (18. Apr 2019)

Ich verstehe echt nicht wie ihr noch nicht die Geduld verloren habt. Die Antwort von @Heyoka955 auf @kneitzel s ausführliche und gute Hilfe ist eine Frechheit sondergleichen. So jemand hat keine Hilfe mehr verdient.

@Heyoka955 bezüglich der Frage ob du deinen Account löschen sollst. Ja bitte! Weiters steig aus dein Studium aus, das wird nix...


----------



## kneitzel (18. Apr 2019)

mihe7 hat gesagt.:


> Ach, Du hast nur das @Heyoka955-Prinzip noch nicht verstanden:
> 
> Die Kurzform: "Treibe die Massen an den Rande eines Nervenzusammenbruchs, dann wird die Lösung zu Dir kommen." (weil irgendjemand entnervt aufgibt und die Lösung postet )



LOL, ja, das Schlimme ist, dass es prinzipiell funktioniert.

Ich habe den Code von Ihm ja kurz getestet und den Fehler behoben. Und dann habe ich eben etwas Zeit investiert und einige Refactorings gemacht. Habe jetzt hier auch eine Lösung mit zwei Enums für Befehle und Feldinhalte ("Magic Constants" eliminieren. Ständig dieses 'f','b','n','e', .... schlimm. Vor allem änder das mal! Statt f für forward will ich ein v für vorwärts oder so... Und da ist dann auch die Umwandlung schöner, weil man keine switch/if Konstrukte mehr braucht...) Die Map ist nun eine eigene Klasse (ItemMap) die halt Position (eigene Klasse, ohne Setter für x und y, damit niemand die HashCodes zerhauen kann!) und FeldInhalt intern in einer HashMap speichert. Meine ItemMap hat paar 08/15 Funktionen (get, put, remove) und auch ein move (get + put mit neuer Position). Und dann natürlich viele nette Funktionen mit netten Namen, damit da nicht viele Ebenen vorkommen und so...
JavaDoc Kommentare muss ich nicht erst erwähnen, oder?
Und Variablennamen dürfen auch durchaus mehr wie ein Zeichen lang sein 

Aber ich warte erst einmal, bis er das Problem behoben hat, dann bringe ich ihm evtl. Ausschnitte. Wenn er es auch so haben will, dann müsste er sich die Grundlagen erarbeiten um z.B. die Map Klasse selbst zu schreiben. Aber ich bezweifle, dass es zu sowas kommen wird.


----------



## kneitzel (18. Apr 2019)

AndiE hat gesagt.:


> ```
> else if (get(mars, p).equals("s") && !get(mars, new int[] {p[0],p[1]+1}).equals("#"))
> ```
> Das ist der Coode an besagter Stelle. Für mich ist das "worst practise", da eine anzahl Anweisungen in einer Zeile stehen. Das muss man schon umschreiben(können), um den Fehler zu finden(, dessen Ursache aber woanders liegt)



Naja.... der ganze Code ist extrem mies. Ich habe jetzt einen direkten Vergleich zu einer ersten Lösung von mir, die aber auch noch nicht perfekt ist. Aber es reicht erst einmal 

Also diese ganzen ifs innerhalb einer Switch Anweisung .. krass ... und das kann relativ einfach sein. Also paar kleine Ausschnitte (die @Heyoka955 ignorieren sollte, da er da so ohne weiteres nicht hin kommt):

```
/**
     * Handles a given command.
     * @param command to handle.
     */
    public static void handleCommand(Command command) {
        FieldContent roverDirection = map.get(roverPosition);
        switch (command) {
            case FORWARD:
                roverPosition = move(roverPosition, true);
                break;

            case BACKWARD:
                roverPosition = move(roverPosition, false);
                break;

            case TURN_LEFT:
                roverDirection = turnLeft(roverDirection);
                map.put(roverPosition, roverDirection);
                break;

            case TURN_RIGHT:
                roverDirection = turnRight(roverDirection);
                map.put(roverPosition, roverDirection);
                break;

            default:
                System.out.println("Unknown command: " + command);
        }
    }
```
Die System.out.println nerven noch, da wäre eigentlich eine Exception fällig.

Um aus den Zeichen ein Command zu bekommen, braucht man auch keinerlei ifs/switches:

```
package rover;

/**
 * Commands the rover understands
 */
public enum Command {
    /**
     * Move rover forward.
     */
    FORWARD('f'),

    /**
     * Move rover backwards.
     */
    BACKWARD('b'),

    /**
     * Turn rover right.
     */
    TURN_RIGHT('r'),

    /**
     * Turn rover left.
     */
    TURN_LEFT('l');

    /**
     * Command character used when submitting a command.
     */
    private char commandChar;

    /**
     * Create a new instance of Command.
     * @param commandChar Character to use to transfer the command.
     */
    Command(char commandChar) {
        this.commandChar = commandChar;
    }

    /**
     * Gets the command character ot the command.
     * @return Character used to transfer command.
     */
    public char getCommandChar() { return commandChar; }

    /**
     * Get a Command instance from a command character.
     * @param c Command character
     * @return Command instance.
     * @throws IllegalArgumentException if character is not a valid command chaarcter.
     */
    public static Command fromChar(char c) {
        for (Command command: Command.values()) {
            if (command.getCommandChar() == c) return command;
        }

        throw new IllegalArgumentException("commandChar");
    }
}
```

Aber solche Dinge dürften hier ja schon bekannt sein, so dass ich euch nichts Neues schreibe.



flopalko hat gesagt.:


> Ich verstehe echt nicht wie ihr noch nicht die Geduld verloren habt. Die Antwort von @Heyoka955 auf @kneitzel s ausführliche und gute Hilfe ist eine Frechheit sondergleichen. So jemand hat keine Hilfe mehr verdient.
> 
> @Heyoka955 bezüglich der Frage ob du deinen Account löschen sollst. Ja bitte! Weiters steig aus dein Studium aus, das wird nix...


Na, das ist etwas krass. Ich kann ja verstehen, dass man da etwas genervt ist. Geht mir ja auch nicht wirklich anders. Aber wir sehen ja auch nur einen kleinen Ausschnitt. Software Entwicklung scheint nicht der Bereich zu sein, der ihn wirklich interessiert. Und er ist nicht wirklich jemand, der gut Kommunizieren kann. Und wenn er Antworten nicht versteht und nicht nachfragen kann weil es da auch schon etwas dran hapert, dann kann sowas dabei raus kommen. Aber da würde ich nicht zu viel hinein interpretieren. Ich denke er versucht einen schnellen Weg zu gehen und merkt nicht, was für Defizite er in Wirklichkeit hat. Er sieht nur diese erste Aufgabe und will nicht mehr Zeit investieren, als unbedingt notwendig. Nur das rächt sich sehr schnell, denn das ist ja erst der Anfang....

Schauen wir einfach mal, ob er es jetzt versteht und sich da mehr rein kniet. Und wenn nicht, dann ignorieren wir so Threads einfach zukünftig.... (Aber ich habe ein dickes Fell. Ich bin ja schon froh, wenn man mich nicht wild beschimpft  )


----------



## mrBrown (18. Apr 2019)

kneitzel hat gesagt.:


> Um aus den Zeichen ein Command zu bekommen, braucht man auch keinerlei ifs/switches:
> [...]
> `if (command.getCommandChar() == c) return command;`


----------



## kneitzel (18. Apr 2019)

mrBrown hat gesagt.:


>


Oh mann ... jetzt muss ich mir meinen eigenen Code um die Ohren hauen. c? Was ist c für eine Variable?
Musstest Du mir mit Deinem Quote meinen eigenen Code vor Augen führen?


Edit: Vor allem: In der Exception habe ich den Namen des Parameters so, wie ich ihn eigentlich nennen wollte. Also irgendwie muss ich da richtig gepennt haben.


----------



## flopalko (18. Apr 2019)

kneitzel hat gesagt.:


> Software Entwicklung scheint nicht der Bereich zu sein, der ihn wirklich interessiert.


Naja, da hat er ja schon anderes durchklingen lassen: Er will ja IT Projektleiter oder Consultant in der Software Entwicklung werden und da über 100k verdienen. Dieser Thread zeigt aber, dass es dazu niemals kommen wird.


----------



## kneitzel (18. Apr 2019)

Er hat von Consultant gesprochen, aber hat er das auf Software Entwicklung präzisiert? Ich meine nicht. Und damit ist dann das ganze Spektrum offen. Und ich denke nicht, dass Software Entwicklung etwas ist, dass ihn reizt. Ansonsten hätte er sich da bereits ein entsprechendes Vorwissen angeeignet und es wäre gewisses Interesse da....

Aber wie dem auch sei: Soll mir / sollte uns eigentlich egal sein.


----------



## flopalko (18. Apr 2019)

kneitzel hat gesagt.:


> Er hat von Consultant gesprochen, aber hat er das auf Software Entwicklung präzisiert? Ich meine nicht. Und damit ist dann das ganze Spektrum offen. Und ich denke nicht, dass Software Entwicklung etwas ist, dass ihn reizt. Ansonsten hätte er sich da bereits ein entsprechendes Vorwissen angeeignet und es wäre gewisses Interesse da....
> 
> Aber wie dem auch sei: Soll mir / sollte uns eigentlich egal sein.


Ich dachte schon. Ich meine er hat auch irgendwo davon gesprochen als Werkstudent nebenbei wo in der Software Entwicklung zu beginnen. Tut mir leid, falls ich das falsch in Erinnerung habe.
Prinzipiell hast du recht und es sollte uns egal sein, durch diesen Thread ist es mir das aber nicht. Wenn ich mir vorstelle, dass er mein Kollege ist kommt mir das Grauen.


----------



## kneitzel (18. Apr 2019)

flopalko hat gesagt.:


> Ich dachte schon. Ich meine er hat auch irgendwo davon gesprochen als Werkstudent nebenbei wo in der Software Entwicklung zu beginnen. Tut mir leid, falls ich das falsch in Erinnerung habe.
> Prinzipiell hast du recht und es sollte uns egal sein, durch diesen Thread ist es mir das aber nicht. Wenn ich mir vorstelle, dass er mein Kollege ist kommt mir das Grauen.


Ach du scheisse ... jetzt bekomme ich Alpträume: Ich werde jetzt bestimmt träumen, dass mein Chef zu mir kommt um mir den neuen Werkstudenten vorzustellen....

Also kann gut sein, dass ich da etwas verpasst habe ... aber die Leistungen hier würden dazu nicht wirklich passen....


----------



## Heyoka955 (19. Apr 2019)

flopalko hat gesagt.:


> Ich dachte schon. Ich meine er hat auch irgendwo davon gesprochen als Werkstudent nebenbei wo in der Software Entwicklung zu beginnen. Tut mir leid, falls ich das falsch in Erinnerung habe.
> Prinzipiell hast du recht und es sollte uns egal sein, durch diesen Thread ist es mir das aber nicht. Wenn ich mir vorstelle, dass er mein Kollege ist kommt mir das Grauen.


Web Entwicklung ?  Entweder hilf oder kommentiert nicht. Du verschwendest deine Energie..


----------



## flopalko (19. Apr 2019)

Heyoka955 hat gesagt.:


> Web Entwicklung ?  Entweder hilf oder kommentiert nicht. Du verschwendest deine Energie..


Ich bin hier nur zur Unterhaltung. Ihre Energie verschwenden hier nur die Leute die dir helfen wollen, da du einfach nichts von den Ratschlägen umsetzen kannst/willst.


----------



## Heyoka955 (19. Apr 2019)

flopalko hat gesagt.:


> Ich bin hier nur zur Unterhaltung. Ihre Energie verschwenden hier nur die Leute die dir helfen wollen, da du einfach nichts von den Ratschlägen umsetzen kannst/willst.


Lol, okay. Vllt habe ich die Ratschläge nicht verstanden ?


----------



## flopalko (19. Apr 2019)

Ich habe es ja bereits erwähnt: Antworten wie z.B.: "Try catch" auf die ausführliche Antwort von @kneitzel sind eine Frechheit gegenüber jenen, die dir hier ihre Hilfe anbieten. Dies ist ja nicht das erste Mal, sondern zieht sich konsequent durch den Thread: Dir gibt jemand eine gute Hilfestellung, deine Antwort ist ein simples "i". Was soll sowas? Das ist einfach an Dreistigkeit nicht zu überbieten. Wenn du genauso kommunizierst wird dich keine Firma je länger als die Probezeit behalten.


----------



## Heyoka955 (19. Apr 2019)

flopalko hat gesagt.:


> Ich habe es ja bereits erwähnt: Antworten wie z.B.: "Try catch" auf die ausführliche Antwort von @kneitzel sind eine Frechheit gegenüber jenen, die dir hier ihre Hilfe anbieten. Dies ist ja nicht das erste Mal, sondern zieht sich konsequent durch den Thread: Dir gibt jemand eine gute Hilfestellung, deine Antwort ist ein simples "i". Was soll sowas? Das ist einfach an Dreistigkeit nicht zu überbieten. Wenn du genauso kommunizierst wird dich keine Firma je länger als die Probezeit behalten.


Ich bin unterwegs, ich wollte ihn nicht ignorieren weil das respektloser wäre.


----------



## flopalko (19. Apr 2019)

Solche Antworten sind respektloser. Keiner ist dir böse wenn du nicht sofort antwortest, deine Antwort sollte aber auf das Vorherige eingehen, zeigen, dass du dich damit beschäftigt hast, eine konkrete Frage zu dem stellen was du nicht verstehst oder etwas sein wie "Danke, das hat mir geholfen. Es funktioniert jetzt, das ist der neue Code: //Code einfügen"
Sinnlose Antworten spare dir bitte.


----------



## Heyoka955 (19. Apr 2019)

Ok 


flopalko hat gesagt.:


> Solche Antworten sind respektloser. Keiner ist dir böse wenn du nicht sofort antwortest, deine Antwort sollte aber auf das Vorherige eingehen, zeigen, dass du dich damit beschäftigt hast, eine konkrete Frage zu dem stellen was du nicht verstehst oder etwas sein wie "Danke, das hat mir geholfen. Es funktioniert jetzt, das ist der neue Code: //Code einfügen"
> Sinnlose Antworten spare dir bitte.


dann hast du meinen Standpunkt gehört dann hoffe ich dass wir auf einen Nenner kommen werden.
Es war nicht meine Absicht
Ich werde sem
Kollegen schreiben direkt wenn ich daran sitze.
Aber nicht wegen der Aufgabe aondern wie man Debuggen.

Außerdem sollte alles hier nicht persönlich genommen werden!
Wenn ich respektlos wäre hätte ich längst beleidigt....


----------



## AndiE (19. Apr 2019)

Heyoka955 hat gesagt.:


> Lol, okay. Vllt habe ich die Ratschläge nicht verstanden ?



Ich habe weiter oben ganz konkret eine Codezeile zitiert, in der ein Fehler auftritt. Du musst diese Zeile umschreiben, auch das wurde hier schon sehr oft erwähnt. Nur so kannst du genau feststellen, wo der Fehler liegt. 

Übrigens muss das Debuggen nicht extra gelehrt werden, da jeder, der schon mal programmiert hat, weiß, dass die Fehlersuche eine wichtige Arbeit dabei ist. Das Debuggen usw. lernt man mit dem Programmieren parallel.


----------



## kneitzel (22. Apr 2019)

Hmm ... noch keine 500 Posts und schon Ende? Das ist jetzt aber sehr enttäuschend. Aber das Thema ist damit wohl für den TE erledigt und es ist Zeit, ein paar Dinge bezüglich Clean Code zu bringen.

Also paar Dinge sind tabu in Clean Code. Ein wichtiger Punkt ist etwas, das oft als "Magic Numbers" bezeichnet wird (Etwas irritierend, denn es betrifft nicht nur Zahlen):

Direkt im Code-Verlauf darf es keine Konstanten geben. Konstanten müssen immer in entsprechenden Konstrukten definiert werden.

Hier gibt es dann mehrere Arten von Lösungen:
a) Verwendung von Konstanten. Also statt ein Byte Array mit Größe 1024 zu definieren, definiert man an eine Konstante BUFFER_SIZE oder so und erstellt dann ein Byte Array it der Größe BUFFER_SIZE. Das hat den Vorteil, dass der Code lesbar ist. Und ein Refactoring ist einfacher, denn mal angenommen, das soll von 1024 auf 4096 erhöht werden. Nun muss man nach allen 1024 suchen, entscheiden, ob das eine Stelle ist, die geändert werden muss um dann ggf. die Stelle zu ändern oder nicht... Mit Konstanten ändert man dann einfach die Konstante an einer Stelle.

b) Oft gibt es Konstanten, die zusammen gehören. Ein Beispiel dafür ist z.B. die Liste der Befehle, die möglich sind. ('f','b','l' und 'r') oder aber auch die Feldinhalte die möglich sind ('#', 'v', '<', ....)
Hier kann man dann eine Enum verwenden. Der große Vorteil dabei ist dann auch, dass man damit teilweise switch Statements / if ketten und so vermeiden kann. Hintergrund ist dabei, dass man Enum Werten auch weitere Werte geben kann. Also bei den Beispielen bedeutet das, dass man jedem Befehl (FORWARD, LEFT, RIGHT, ...) auch die Befehl-Zeichen mitgeben kann ('f', 'l', 'r', ...) Und dann kann man z.B. zu einem Befehl einfach das Befehlszeichen bekommen oder eben in einer kleinen Schleife vom Befehlszeichen zu dem Befehl kommen...

c) Der letzte wichtige Part sind Ausgaben. Diese gehören auch nicht in den Code. Statt dessen sollten Ausgaben immer aus einer Ressource Datei kommen. Dies hat den großen Vorteil, dass die Ausgabe schnell angepasst werden kann. So können die Ressource-Dateien z.B. an einen Übersetzer gehen, der von Software Entwicklung keine Ahnung haben muss. Und Übersetzungen sollten sich ohne komplette Neuübersetzung einpflegen lassen.

Speziell zu b) sähe der Code für Befehle und FeldInhalte dann z.B. so aus:

```
package rover;

/**
 * Commands the rover understands
 */
public enum Command {
    /**
     * Move rover forward.
     */
    FORWARD('f'),

    /**
     * Move rover backwards.
     */
    BACKWARD('b'),

    /**
     * Turn rover right.
     */
    TURN_RIGHT('r'),

    /**
     * Turn rover left.
     */
    TURN_LEFT('l');

    /**
     * Command character used when submitting a command.
     */
    private char commandChar;

    /**
     * Create a new instance of Command.
     * @param commandChar Character to use to transfer the command.
     */
    Command(char commandChar) {
        this.commandChar = commandChar;
    }

    /**
     * Gets the command character ot the command.
     * @return Character used to transfer command.
     */
    public char getCommandChar() { return commandChar; }

    /**
     * Get a Command instance from a command character.
     * @param commandChar Command character
     * @return Command instance.
     * @throws IllegalArgumentException if character is not a valid command chaarcter.
     */
    public static Command fromChar(char commandChar) {
        for (Command command: Command.values()) {
            if (command.getCommandChar() == commandChar) return command;
        }

        throw new IllegalArgumentException("commandChar");
    }
}
```


```
package rover;

public enum FieldContent {

    EMPTY(" "),
    BLOCKED("#"),
    ROVER_NORTH("^"),
    ROVER_EAST(">"),
    ROVER_SOUTH("V"),
    ROVER_WEST("<");

    private String printChar;

    FieldContent(String printChar) {
        this.printChar = printChar;
    }

    public String getPrintChar() {
        return printChar;
    }
}
```

Und das kann dann auch entsprechend genutzt werden. Also um Befehle aus den Zeichen zu bekommen, könnte man in der main Methode folgenden Code verwenden:

```
String commands = args[0];
            for (char command: commands.toCharArray()) {
                printMap();
                handleCommand(Command.fromChar(command));
            }
```


----------



## kneitzel (22. Apr 2019)

Dann sollte eine Aufgabe in Java Objektorientiert aufgebaut werden. Und bei der Aufgabe sieht man direkt mehrere Dinge.

Zum einen die Position, welche einfach über ein int Array abgebildet wurde. Also ideal, um es als Klasse abzubilden:

```
package rover;

/**
 * Position inside the map
 */
public class Position {
    private int x;
    private int y;

    public Position (int x, int y) {
        this.x = x;
        this.y = y;
    }

    public boolean validate(int maxX, int maxY) {
        return (maxX > x) && (maxY > y) && (x>=0) && (y>=0);
    }

    public int getX() { return x; }
    public int getY() { return y; }

    @Override
    public int hashCode() {
        return x + (y<<16);
    }

    @Override
    public boolean equals(Object obj) {
        // Check if same reference
        if (obj == this) return true;

        if (obj instanceof Position) {
            Position other = (Position) obj;
            return
                    other.x == x &&
                    other.y == y;
        }

        return false;
    }
}
```

Das die Position auch als Key verwendet werden soll, ist natürlich klar, dass ein equals (und damit natürlich auch der hashCode) überschrieben werden muss. Ein Verändern eines Keys ist aber kritisch, so auch der Hashcode verwendet wird, daher wurden Setter explizit weggelassen. (Das Thema hatte ich ja schon vorab angesprochen....)

Und dann hat man natürlich eine Karte. Die kann man dann auch mit entsprechenden Funktionen implementieren. Hier kann man überlegen, ob man generics verwenden möchte, aber dann läuft es schnell auf eine schon vorhandene Klasse heraus. Somit kann man überlegen, ob diese Klasse notwendig ist. Aber ohne Generics ist das eine recht schöne Kapselung:

```
package rover;

import java.util.LinkedHashMap;

/**
 * ItemMap for rover solution
 */
public class ItemMap {

    private int height;
    private int width;
    private LinkedHashMap<Position, FieldContent> map;

    public ItemMap(int width, int height) {
        map = new LinkedHashMap<>();
        this.height = height;
        this.width = width;
    }

    public FieldContent get(Position position) {
        // Get result.
        FieldContent result = map.get(position);

        // return EMPTY when field is empty.
        if (result == null) return FieldContent.EMPTY;

        // return result
        return result;
    }

    public void put(Position position, FieldContent content) {
        // Validate
        if (!position.validate(width, height)) throw new IllegalArgumentException("position");

        map.put(position, content);
    }

    public FieldContent remove(Position position) {
        // Validate
        if (!position.validate(width, height)) throw new IllegalArgumentException("position");

        return map.remove(position);
    }

    public void move(Position oldPosition, Position newPosition) {
        // Validate
        if (!oldPosition.validate(width, height)) throw new IllegalArgumentException("oldPosition");
        if (!newPosition.validate(width, height)) throw new IllegalArgumentException("newPosition");

        FieldContent content = remove(oldPosition);
        if (content != null)
            put(newPosition, content);
    }

    public boolean isBlocked(Position position) {
        return get(position) != FieldContent.EMPTY;
    }
}
```

Dabei ist ein Punkt wichtig, ob den man in der Aufgabe auch mehrfach gestolpert ist: Rückgabe von NULL Werten! Das ist etwas, das leicht Probleme mit sich bringt. Es gibt hier ein paar Ansätze bei Java mit Annotations zu arbeiten (@null, @NotNull), aber andere Sprachen gehen hier noch deutlich weiter (z.B. Kotlin). Aber man kann hier sauber bleiben und z.B. bei get auf eine Rückgabe von null verzichten und da dann statt dessen ein EMPTY zurück geben.


----------



## kneitzel (22. Apr 2019)

Und dann hat man schon eine Grundlage für leserlichen Code, den man direkt nutzen kann. Die Funktionen könnten dann z.B. in der Form aufgebaut sein:

```
/**
     * Initialization of map.
     */
    public static void newInit() {
        map = new ItemMap(mapWidth, mapHeight);
        roverPosition = new Position(
                mapWidth / 2,
                mapHeight / 2);

        for (int x = 0; x < mapWidth; x++) {
            for (int y = 0; y < mapHeight; y++) {
                Position p = new Position(x, y);
                if (r.nextDouble() < 0.25 &&
                        !(roverPosition.getX() == x && roverPosition.getY() == y))
                    map.put(p, FieldContent.BLOCKED);
            }
        }

        map.put(roverPosition, FieldContent.ROVER_NORTH);
    }

    /**
     * Turn right from a given direction.
     * @param direction Current direction as FieldContent
     * @return New direction as FieldContent
     */
    public static FieldContent turnRight(FieldContent direction) {
        switch (direction) {
            case ROVER_NORTH:
                return FieldContent.ROVER_EAST;

            case ROVER_EAST:
                return FieldContent.ROVER_SOUTH;

            case ROVER_SOUTH:
                return FieldContent.ROVER_WEST;

            case ROVER_WEST:
                return FieldContent.ROVER_NORTH;

            default:
                throw new IllegalArgumentException("direction");
        }
    }

    /**
     * Turn left from a given direction.
     * @param direction Current direction as FieldContent
     * @return New direction as FieldContent
     */
    public static FieldContent turnLeft(FieldContent direction) {
        switch (direction) {
            case ROVER_NORTH:
                return FieldContent.ROVER_WEST;

            case ROVER_EAST:
                return FieldContent.ROVER_NORTH;

            case ROVER_SOUTH:
                return FieldContent.ROVER_EAST;

            case ROVER_WEST:
                return FieldContent.ROVER_SOUTH;

            default:
                throw new IllegalArgumentException("direction");
        }
    }

    /**
     * Moves an object that is at the given position. Must be a rover at the location.
     *
     * Checks that the map is not left and does not move on not empty fields.
     * @param position Position to check.
     * @param forward Should the rover move forward (true) or backwards (false)
     * @return New Position or ld position if new position was invalid (blocked, outside map)
     */
    public static Position move(Position position, boolean forward) {
        // Get new position when moving.
        Position newPosition = getNewPosition(position, forward);

        // Validate new position
        if (!newPosition.validate(mapWidth, mapHeight)) return position;

        // Check if new position is blocked
        if (map.isBlocked(newPosition)) return position;

        // Do move
        map.move(position, newPosition);

        // Return new position
        return newPosition;
    }

    /**
     * Gets a new position when moving into a direction.
     * @param position Current position
     * @param forward Moving forward or backwards
     * @return new Position.
     */
    private static Position getNewPosition(Position position, boolean forward) {
        FieldContent direction = map.get(position);

        switch (direction) {
            case ROVER_NORTH:
                return new Position(
                        position.getX(),
                        forward ? position.getY() - 1 : position.getY() + 1);

            case ROVER_EAST:
                return new Position(
                        forward ? position.getX() + 1 : position.getX() - 1,
                        position.getY());

            case ROVER_SOUTH:
                return new Position(
                        position.getX(),
                        forward ? position.getY() + 1 : position.getY() - 1);

            case ROVER_WEST:
                return new Position(
                        forward ? position.getX() - 1 : position.getX() + 1,
                        position.getY());

            default:
                throw new IllegalArgumentException("direction");
        }

    }

    /**
     * Handles a given command.
     * @param command to handle.
     */
    public static void handleCommand(Command command) {
        FieldContent roverDirection = map.get(roverPosition);
        switch (command) {
            case FORWARD:
                roverPosition = move(roverPosition, true);
                break;

            case BACKWARD:
                roverPosition = move(roverPosition, false);
                break;

            case TURN_LEFT:
                roverDirection = turnLeft(roverDirection);
                map.put(roverPosition, roverDirection);
                break;

            case TURN_RIGHT:
                roverDirection = turnRight(roverDirection);
                map.put(roverPosition, roverDirection);
                break;

            default:
                System.out.println("Unknown command: " + command);
        }
    }

    /**
     * Print out the map.
     */
    public static void printMap() {
        for (int y = 0; y < mapHeight; y++) {
            for (int x = 0; x < mapWidth; x++) {
                FieldContent content = map.get(new Position(x, y));
                System.out.print(content.getPrintChar());
            }
            System.out.println();
        }
        for (int x = 0; x < mapWidth; x++) {
            System.out.print("=");
        }
        System.out.println();
    }
```


----------



## kneitzel (22. Apr 2019)

Was ist noch offen?

Generell sollte man alle Funktionen und so dokumentieren. JavaDoc ist da die Lösung, die in erster Linie verwendet wird.
Bei dem letzten Code sieht man das relativ gut. Bei den vorherigen Code-Postings sind diese auch noch weggelassen.

Und natürlich sollten so Funktionen nicht statisch sein. Statt dessen sollte es auch noch eine Klasse geben, von der dann eine Instanz erstellt wird. Aus der init Funktion wird dann ein Konstruktor und so ....

Und noch eine Anmerkung: In meinem Code hatte ich den alten Code parallel in der Klasse behalten. Daher so Namen wie "newInit". Das ist natürlich auch schlecht. Code, den man nicht braucht, löscht man. Eine Source Verwaltung wie git sorgt dafür, dass man an den alten Stand auch wieder ran kommen kann. Und dann sind die Namen natürlich auch sauber und es gibt nur ein "init" oder so.


----------



## mihe7 (22. Apr 2019)

@kneitzel ich habe mir jetzt nicht alles im Detail durchgelesen (bin mir aber sicher, dass das passt) und wollte mal meine Anerkennung für die ganze Arbeit zum Ausdruck bringen. Das kann man einfach nicht unkommentiert stehen lassen.

Bleibt noch eine Frage: was machen wir jetzt mit den verbleibenden 37 Kommentaren?


----------



## Heyoka955 (22. Apr 2019)

mihe7 hat gesagt.:


> @kneitzel ich habe mir jetzt nicht alles im Detail durchgelesen (bin mir aber sicher, dass das passt) und wollte mal meine Anerkennung für die ganze Arbeit zum Ausdruck bringen. Das kann man einfach nicht unkommentiert stehen lassen.
> 
> Bleibt noch eine Frage: was machen wir jetzt mit den verbleibenden 37 Kommentaren?


Wir verschieben das und tuen das in mein anderen Thread


----------



## kneitzel (22. Apr 2019)

Also wir könnten den Thread für ein neues Thema entführen ...

Also mein Vorschlag für ein Thema wäre:
Da ein unter 18 Jähriger bestimmt nicht die Geduld hat, den Thread bis hier hin zu lesen, haben wir einen effektiven Jugendschutz.
So in den nächsten paar Antworten alle zustimmen, haben wir evtl. noch Platz für paar nicht Jugendfreie Witze?

Ich habe da jetzt vor kurzem erst einen Witz gehört bezüglich Punktrechnung vor Strichrechnung


----------



## Heyoka955 (22. Apr 2019)

kneitzel hat gesagt.:


> Also wir könnten den Thread für ein neues Thema entführen ...
> 
> Also mein Vorschlag für ein Thema wäre:
> Da ein unter 18 Jähriger bestimmt nicht die Geduld hat, den Thread bis hier hin zu lesen, haben wir einen effektiven Jugendschutz.
> ...


ahahahhhaahahahahahahahahahahahahahahahaaa


----------



## mihe7 (22. Apr 2019)

kneitzel hat gesagt.:


> So in den nächsten paar Antworten alle zustimmen, haben wir evtl. noch Platz für paar nicht Jugendfreie Witze?



Zwei Schokoladen fliegen zum Mond, welches ist die männliche?


Spoiler



Die mit den Nüssen.





kneitzel hat gesagt.:


> Ich habe da jetzt vor kurzem erst einen Witz gehört bezüglich Punktrechnung vor Strichrechnung


Erzähl.


----------



## kneitzel (22. Apr 2019)

Hab ja eigentlich schon zu viel Verraten ...

Du bekommst ein Bußgeld wegen zu schnellem Fahren .... 3 Punkte und 250€.
Und vom letzten Besuch eines Freudenhauses kommt auch noch eine Rechnung mit der Post: ebenfalls 250€!

Welche Rechnung musst Du zuerst bezahlen?


----------



## mihe7 (22. Apr 2019)

Ach so, das Bußgeld wegen Punkt vor Strich...

Sitzt eine Prostituierte beim Arbeitsamt. Fragt der Beamte nach dem Beruf. Sagt die Prostituierte: "Machen Sie einfach einen Strich rein".


----------



## Heyoka955 (22. Apr 2019)

kann mir einer helfen ahahahich, ich weiß nicht wie ich die if bedinung machen soll also ich muss wissen was frößer ist aber bei generischen klassen ist das bischen komplizierter.

```
public void sorting(){
        ListNode current = head;
        ListNode currentvor = current.next;
        
        for(int i= 1; i < size(); i++){
            for(int j = 0; i < size(); i++){
                if(current.value.compareTo(currentvor.value) < 0){
                    
                    
                    
                    
                }
                
                
                
            }
            
            
            
            
        }
        
        
        
        
    }

das buggt auch nicht merh aber leider fehlt mir den programmier ansatz wie ich die beiden listnodes vergleichen kann mit der compare methode.
```


----------



## kneitzel (22. Apr 2019)

Heyoka955 hat gesagt.:


> kann mir einer helfen ahahahich, ich weiß nicht wie ich die if bedinung machen soll also ich muss wissen was frößer ist aber bei generischen klassen ist das bischen komplizierter.
> 
> ```
> public void sorting(){
> ...


Hmm, den Witz habe ich jetzt nicht verstanden. Aber evtl. kannst Du den Witz ja für mich kurz erläutern.

Ansonsten hast Du ja einen Thread, in dem das Thema behandelt wird. Und da hattest Du ja auch schon eine erste Erwiederung bekommen.... Und nein, auch mit Generics wird das nicht wirklich komplizierter.


----------



## temi (22. Apr 2019)

kneitzel hat gesagt.:


> Erwiederung



Ist jetzt nur Füllmaterial, aber: Erwiederung = Entgegnung => gegen => wider => Erwiderung


----------



## mihe7 (22. Apr 2019)

Ja, irgendwie müssen wir ja auf 500 kommen.


----------



## kneitzel (22. Apr 2019)

temi hat gesagt.:


> Ist jetzt nur Füllmaterial, aber: Erwiederung = Entgegnung => gegen => wider => Erwiderung


Ja, wo Du Recht hast, hast Du durchaus Recht. Peinlich wird es dadurch, dass ich es am Computer geschrieben habe und der eine automatische Rechtschreibkontrolle drin hat. Da ist das Wort sogar rot unterstrichen....


----------



## mihe7 (22. Apr 2019)

Ich hätte gerne den Beweis, dass es für a³ + b³ = c³ für ganzzahlige a, b, c keine Lösung gibt


----------



## temi (22. Apr 2019)

http://norbert-suedland.info/Deutsch/Mathematik/Fermat.Deutsch.pdf

Da ich in Mathe eine Niete bin, kann ich das natürlich nicht prüfen, evtl. auch mal den Beweis von Herrn Wiley  Wiles suchen...


----------



## JCODA (22. Apr 2019)

mihe7 hat gesagt.:


> Ich hätte gerne den Beweis, dass es für a³ + b³ = c³ für ganzzahlige a, b, c keine Lösung gibt


Gegenbeweis durch Beispiel: a=b=c=0.


----------



## mihe7 (22. Apr 2019)

Verschärfen wir die Bedingung, a, b != 0.

Kommentar von @temi übersehen, aber wir kommen den 500 näher.


----------



## kneitzel (22. Apr 2019)

mihe7 hat gesagt.:


> Ich hätte gerne den Beweis, dass es für a³ + b³ = c³ für ganzzahlige a, b, c keine Lösung gibt



Das ist doch nun wirklich trivial und wurde doch schon 1770 von Euler bewiesen. Das ist doch nun wirklich Allgemeinwissen ....

Das ist ja fast peinlicher, als mein Rechtschreibfehler


----------



## JCODA (22. Apr 2019)

mihe7 hat gesagt.:


> Verschärfen wir die Bedingung, a, b != 0.
> 
> Kommentar von @temi übersehen, aber wir kommen den 500 näher.


a=1, b= -1, c=0. Typischerweise wird abc != 0 gefordert.


----------



## mihe7 (22. Apr 2019)

JCODA hat gesagt.:


> Typischerweise wird abc != 0 gefordert.


Da will man mal mit irgendeinem Blödsinn den Thread füllen und dann sowas. Frechheit


----------



## kneitzel (22. Apr 2019)

Ja, das Problem ist, dass er es auf Ganze Zahlen begrenzt hat. Beim Satz von Fermat geht es aber um die Natürlichen Zahlen.


----------



## kneitzel (22. Apr 2019)

mihe7 hat gesagt.:


> Da will man mal mit irgendeinem Blödsinn den Thread füllen und dann sowas. Frechheit


Ja, das zeigt unsere Respektlosigkeit Dir gegenüber....


----------



## temi (22. Apr 2019)

Gibt da ein spannendes (kein Witz!) Buch dazu:

Simon Singh: Fermats letzter Satz, *ISBN-13:* 978-3423330527


----------



## mihe7 (22. Apr 2019)

kneitzel hat gesagt.:


> Ja, das zeigt unsere Respektlosigkeit Dir gegenüber....


LOL, wenigstens einer, der es erkannt hat


----------



## kneitzel (22. Apr 2019)

kneitzel hat gesagt.:


> Ja, das Problem ist, dass er es auf Ganze Zahlen begrenzt hat. Beim Satz von Fermat geht es aber um die Natürlichen Zahlen.


Wobei man jetzt richtig Klugscheissen kann:

Natürliche Zahlen ist halt auch nicht eindeutig! Gehört da die 0 mit dazu, oder eben nicht?

Es gibt hier zwei Definitionen, einmal mit 0 und einmal ohne. Früher war es immer ohne 0, da war es also eindeutig. Ein Hr. Fermat oder Hr. Euler wird damit also keine Schmerzen gehabt haben. Aber gerade wir Informatiker haben es ja mit dem Herrn Neumann ... und dann gehört die Null auf jeden Fall mit dazu.....


----------



## kneitzel (22. Apr 2019)

BTW: Habt ihr wenigstens Respekt vor mir und lasst mir den 500ten Post in diesem Thread?


----------



## mihe7 (22. Apr 2019)

Können wir machen. Mal sehen, ob wir die Punktlandung hinbekommen


----------



## JCODA (22. Apr 2019)

kneitzel hat gesagt.:


> Es gibt hier zwei Definitionen, einmal mit 0 und einmal ohne. Früher war es immer ohne 0, da war es also eindeutig. Ein Hr. Fermat oder Hr. Euler wird damit also keine Schmerzen gehabt haben. Aber gerade wir Informatiker haben es ja mit dem Herrn Neumann ... und dann gehört die Null auf jeden Fall mit dazu.....


Genau so war es im ersten Semester bei mir: Alle Mathe-Vorlesungen hatten die Def. ohne 0 und alle Info-Vl. mit.


----------



## mihe7 (22. Apr 2019)

JCODA hat gesagt.:


> Alle Mathe-Vorlesungen hatten die Def. ohne 0 und alle Info-Vl. mit.


Aber auf meiner 0 rumreiten...


----------



## JCODA (22. Apr 2019)

mihe7 hat gesagt.:


> Aber auf meiner 0 rumreiten...


 Du hast ja von ganzen Zahlen gesprochen ...


----------



## kneitzel (22. Apr 2019)

mihe7 hat gesagt.:


> Aber auf meiner 0 rumreiten...



Ja, das Thema Respekt hatten wir doch schon .... egal was Du sagst: Wir reiten drauf rum 

Aber irgend was muss man ja machen, wenn man auf die 500 Beiträge im Thread kommen will ....


----------



## mihe7 (22. Apr 2019)

JCODA hat gesagt.:


> Du hast ja von ganzen Zahlen gesprochen ...


Wie Du aus Deiner Vorlesung weißt: alles Definitionssache...


----------



## mihe7 (22. Apr 2019)

kneitzel hat gesagt.:


> egal was Du sagst: Wir reiten drauf rum





temi hat gesagt.:


> Fermats letzter Satz, *ISBN-13:* 978-3423330527



mihe7's hoffentlich letzter Satz im Thread (https://www.java-forum.org/thema/java-erstes-projekt.184543/post-1181739): "das kenn ich."


----------



## Xyz1 (22. Apr 2019)

Ich will euch ja nicht den Spaß verderben, aber es is nicht abhängig von Mathe- oder Informatik-Vorlesungen, sondern von der Präferenz des Dozierenden, ob und wenn ja wie `0` dabei ist.


----------



## JCODA (22. Apr 2019)

Tobias-nrw hat gesagt.:


> Ich will euch ja nicht den Spaß verderben, aber es is nicht abhängig von Mathe- oder Informatik-Vorlesungen, sondern von der Präferenz des Dozierenden, ob und wenn ja wie `0` dabei ist.


Ja, natürlich, hab' ja nur speziell von meinen VL. berichtet und habe nichts verallgemeinert...


----------



## Xyz1 (22. Apr 2019)

Countdown bis 1: 10... 9... 8... 7... 6... 5... 4... *3...*


----------



## kneitzel (22. Apr 2019)

Tobias-nrw hat gesagt.:


> Countdown bis 1: 10... 9... 8... 7... 6... 5... 4... *3...*


*2*


----------



## kneitzel (22. Apr 2019)

kneitzel hat gesagt.:


> *2*


*1 .... *und jetzt darf jemand den Thread schließen ...


----------



## JCODA (22. Apr 2019)

mööp


----------



## jhjh (22. Apr 2019)

ich helfe mal mit

Ups wollte 499 sein


----------



## Xyz1 (22. Apr 2019)

Spielverderber ihr seid


----------

