java erstes projekt

  • Themenstarter Themenstarter Heyoka955
  • Beginndatum Beginndatum
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.
 
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?
 
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?
Java:
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
 
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
 
jungs meine Konzentration ist tot, ich weiß das klingt scheiße von mir, aber brauche lösungen. will weiter an aufgabe 2 arbeiten
 
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


Java:
        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?
 
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
Java:
        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("<");

            }
 
Zuletzt bearbeitet von einem Moderator:
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
Java:
//der code de rmethode
if(getRoverUndHindernisse(marsKarte, aktuellePosition).equals("#")){
            //marsKarte.put(aktuellePosition, "w|e|s|n");
            
        }
 
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:

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.
 
Ja, die Methode für die Bewegung funktioniert also.

Zu Deinem Kommentar #125:


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.
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
 
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?
 
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
 
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 ?
 
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
 
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.
 
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.
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?
 
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.
 
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.
 
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....
 
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....
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 ?
 
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.
 
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.
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.
 
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. "
 
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....


Das wurde dir hier auch schon gesagt 😉
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?
Java:
    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
        
        
        
    }
 
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




Java:
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");
    }

}


11688
 
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 ...
 
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
 
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....
 

Zurück
Oben