roboter steuerung

johannesK

Mitglied
Es geht um eine Robotersteuerung in einer Welt mit Hilfe einer RobotShell. Ich habe die Klasse Robot mit folgendem Konstruktor:

DIE KLASSE ROBOT
Java:
.............
//Konstruktor
public Robot() {
  x = 0;          //x-koordinate in der welt
  y = 0;          //y-koordinate in der welt
  orientation = NORTH;                     // richtung in die der roboter zeigt
  hasCargo = false;                          // true falls der robot etwas transportiert
  batteryStatus = FULL_BATTERY;      // batterie = voll
}
...............

DIE KLASSE WORLD
Java:
.....
//Konstruktor
public World(int x, int y, Robot r) {             
  xDimension = x;
  yDimension = y;
  setRobot(r);
  ......
}

public void setRobot(Robot r) {
  r = new Robot();  
}
........

DIE KLASSE RobotShell
Java:
.........
r = new Robot();
World shellWorld = new World(dimX, dimY, r);
.........


in der RobotShell werden zuvor die Dimensionen der Welt eingelesen und dann wird eine neue Welt mit genau einem Robot erzeugt. Ausserdem soll es möglich sein den robot über die Shell zu steuern. Die Methoden funktionieren soweit auch alle. Mein Problem ist nachdem ich die Welt und den robot in der RobotShell erstellt habe :
wie kann ich jetzt den robot r mit Hilfe der robotShell in der neu erzeugten shellWorld steuern ????
( mit r.Methode() komme ich leider nicht weiter ..... )


Ich bin für jede Hilfe dankbar. Vielen Dank.


Johannes
 
Zuletzt bearbeitet:

Ralph-Uwe

Bekanntes Mitglied
Hallo,

bitte für Codebeispiele die Java-Tags verwenden.

Aufgefallen ist mir, dass Du in der Klasse RobotShell einen Roboter erzeugst und diesen
gleich im Anschluss in der Klasse World nochmal neu erzeugst.

Sinnvoll erscheint es mir eine Klasse Roboter zu erstellen, die alle Funktionen und Zustände eines
Roboters beschreibt.
Eine Klasse World, die Deine Umgebung darstellt, ebenfalls mit allen Eigenschaften die nötig sind.

Und die Klasse Robotshell, in der zuerst eine Welt erstellt wird und im Anschluß einer oder mehrere
Roboter. Diese können dann von mit Robotername.Funktion gesteuert werden.

Gruß
 

johannesK

Mitglied
Vielen Dank für die schnelle Antwort,

ich habe mir die Aufgabenverteilung so nicht ausgedacht, sie ist in meiner Aufgabe vorgegben und da heisst es ich soll in der Klasse World eine methode namens setRobot (Robot r) haben und dann soll in der RobotShell die grösse der Welt einglesen werden und nachdem das passiert ist soll eine welt erzeugt werden mit genau einem robot. Ausserdem soll man aus der RobotShell dann der robot steuern können.

Leider funktioniert mein Ansatz so nicht .....:bahnhof:
 

Ralph-Uwe

Bekanntes Mitglied
Hast Du noch eine genauere Beschreibung für die Aufgabe?

...dann soll in der RobotShell die grösse der Welt einglesen werden...

...über die Tastatur oder aus der Klasse World, in der die Größe fest gelegt ist?

Poste mal den gesamten Quelltext, den Du schon hast.

Gruß
 

johannesK

Mitglied
Implementieren Sie eine nicht-instanzierbare Klasse RobotShell, die eine
Benutzersteuerung fur einen Roboter enthalt. Diese Klasse soll auch die
main-Methode enthalten, welche die Shell startet.
Beim Start des Programms wird der Benutzer zunachst nach der Dimension
der Welt gefragt:
"World dimensions: \" Erwartet wird eine Benutzereingabe zweier durch Leerzeichen getrennter
Zahlen dimX und dimY , die die Groe der Welt festlegen. Sie konnen hier
davon ausgehen, dass nur Zahlen eingegeben werden. Allerdings darf Ihr
Programm nicht absturzen, wenn z.B. nur eine Zahl eingegeben wird. In
diesem Fall, sowie bei negativen Eingaben, soll Ihr Programm eine Fehlermeldung
(beginnend mit "Error! \) ausgeben und die Abfrage der Groeße wiederholen. Nach erfolgreicher Eingabe, wird die entsprechende Welt samt ihren Cargo-Objekten erzeugt, ein Roboter auf der Position (0; 0) platziert und es erscheint der Prompt "Robot> \. Hier sollen nun folgende Kommandos möglich sein ...

meine klassen haben insgesamt etwa 7-800 zeilen (ich kann das gerne zippen und schicken, inkl arbeitsblatt), hier die vielleicht wichtigsten stellen :

KLASSE ROBOT
Java:
public class Robot {
public static final int NORTH = 0;   
public static final int EAST = 1;  
public static final int SOUTH = 2;   
public static final int WEST = 3;  
int distance;
private int x, y;
private int orientation;
private boolean hasCargo;
private int batteryStatus;
private static final int FULL_BATTERY = 200;
private static final int STEP_COST_EMPTY = 1;
private static final int STEP_COST_WITH_CARGO = STEP_COST_EMPTY * 2;

  public Robot() {
    x = 0;
    y = 0;
    orientation = NORTH;
    hasCargo = false;
    batteryStatus = FULL_BATTERY;
  }
 

  public void walk(int distance) {
    if (batteryStatus >= batteryConsumption() * distance) {
      int steps = distance;
      switch (orientation) {
        
      case 0 : y = y + steps;
      break;
        
      case 1 : x = x + steps;
      break;
      
      case 2 : y = y - steps;
      break;
        
      case 3 : x = x - steps;
      break;
    
      default : break;
      }
      batteryStatus = batteryStatus - steps * batteryConsumption();
  }

..... // weiter methoden um den robot zu drehen und status abzufragen usw ...

KLASSE WORLD
Java:
public class World {

private final int xDIMENSION = 1000;
private final int yDIMENSION = 1000;  
public int xDimension, yDimension, x, y;
public int numberOfCargoObjects;
public int randomX0, randomY0, randomX, randomY, entry;
boolean alreadyWritten;                
                        

    public World(int x, int y, Robot r) {
      
      xDimension = x;
      yDimension = y;
      setRobot(r);
      .......
    }

  public void setRobot(Robot r) {
    r = new Robot();  
  }

// weiter methoden

Java:
public class RobotShell {
    
  /**
   * Main methode
   * 
   * @param args     (command line)     
   */         
  public static void main(String[] args) {

    int dIMX = 1000;
    int dIMY = 1000;
    int dimX = 0;
    int dimY = 0;
    boolean correctInput = false;
    String dimensions;
    Robot r;

  
    while (correctInput == false) {
      dimensions = Terminal.askString("World dimensions: ");    // klasse terminal wurde uns gestellt zum      
      String[] temp1 = dimensions.split(" ");                          // zeichen einlesen   
      if (temp1.length == 2) {
        dimX = Integer.parseInt(temp1[0]);
        dimY = Integer.parseInt(temp1[1]);
        if (dimX > 0 && dimX < dIMX && dimY > 0 && dimY < dIMY) { 
          correctInput = true;
          }
          else {
            System.out.println("Error! dimesions x must be between (0,1000) and y (0,1000)!");
            correctInput = false;      
          }
      }
      else {
        System.out.println("Error! 2 dimensions needed!");
        correctInput = false;    
      }
    }

      r = new Robot();
      World shellWorld = new World(dimX, dimY, r);
      
     // danach geht es weiter mit der eingabeaufforderung robot> ...
 

Ralph-Uwe

Bekanntes Mitglied
Du instanzierst in der RobotShell eine Roboter r und erzeugst im Anschluß eine Welt, mit den zuvor
eingegebenen Dimensionen.
Dieser Welt übergibst Du den Roboter r, ruftst die Methode
Code:
setRobot(r);
auf und erstellst eine neue Instanz
von Roboter ...? Warum?
Ich kann mir vorstellen, dass die Methode
Code:
setRobot(r);
den Roboter r innerhalb der Welt platzieren soll.
Java:
  public void setRobot(Robot r) {
    r.setX = 50;   // hier kannst Du die Methoden vom Roboter aufrufen, vorausgesetzt, es gibt eine Methode setX bzw. setY
    r.setY = 125; // in der Roboter Klasse.
  }

Der Rest sieht schon ganz gut aus.

Nachdem Du Deine Welt und den Roboter in der WorldShell erzeugt hast,
müsstes Du eine Endlosschleife (vorzugsweise mit Abbuchbedingung zB. exit) implementieren.
Innerhalb dieser Schleife wartest Du aus Eingaben vom Benutzer.
Erfolgt eine richtige Eingabe, kannst Du anhand des Befehles den Roboter auf die Reise schicken, in dem Du
die entsprechenen Metoden der Roboterklasse aufrufst.
 

johannesK

Mitglied
Vielen Dank. Soweit habe ich das verstanden und ich habe jetzt die methode setRobot(Robot r) angepasst:

Java:
public void setRobot(Robot r) {
  r.setX(0);
  r.setY(0);
}

jetzt kann ich aber innerhalb der Klasse World nicht mehr mit r.Methode() auf den robot zugreifen (das muss ich aber, da die Klasse World eine toString Methode besitzt in der die Welt ausgegeben werden soll:
" . " an leeren stellen und eben auch der robot und dazu muss ich seine position erfragen (r.getXPos(); r.getYPos(); ).

Wie kann ich denn die Welt mit dem robot "bekannt machen" ???


Johannes
 

Ralph-Uwe

Bekanntes Mitglied
so wäre es möglich:

Java:
public class World {
 
private final int xDIMENSION = 1000;
private final int yDIMENSION = 1000;  
public int xDimension, yDimension, x, y;
public int numberOfCargoObjects;
public int randomX0, randomY0, randomX, randomY, entry;
boolean alreadyWritten;                

private Roboter r;    // die Klasse World um die  Variabel r erweitern                   
 
    public World(int x, int y, Robot r) {
      
      xDimension = x;
      yDimension = y;
      this.r = r;        // hier wird der lokalen Variabel r die übergebene Variabel r zugewiesen (this.r bezieht sich auf die lokale Variable)
      setRobot(r);
      .......
    }
 
  public void setRobot(Robot r) {
    r = new Robot();  
  }
 
// weiter methoden
 

johannesK

Mitglied
Leider musste ich das Programm noch einmal umstellen : in der RobotShell sieht es jetzt wie folgt aus :

RobotShell
Java:
.........
World shellWorld = new World(dimX, dimY);
r = new Robot(shellWorld);                           //der roboter soll die welt kennen in der er sich bewegt
shellWorld.setRobot(r);
.............

Robot
Java:
........
  public Robot(World w) {
    this.w = w;
    x = 0;
    y = 0;
    orientation = NORTH;
    hasCargo = false;
    batteryStatus = FULL_BATTERY;
  }
.........


in der Klasse World soll aber in der toString() die Welt ausgegeben werden in der Form :
Java:
..........
private Robot r;
..........
public World(int x, int y) {
   xDimension = x;
   yDimension = y;
..........
public void setRobot(Robot r) {
  r.setX(0);
  r.setY(0);
}
..........
public String toString() {
  String worldRep = "";
    for (int y = 0; y < yDimension; y++) {
      for (int x = 0; x < xDimension; x++) {
      alreadyWritten = false;
        if (r.getXPos() == x && r.getYPos() == y) {
          switch (r.direction()) {
            case 0 : worldRep = worldRep + " ^ ";
            break;
            case 1 : worldRep = worldRep + " > ";
            break;
            case 2 : worldRep = worldRep + " v ";
            break;
            case 3 : worldRep = worldRep + " < ";
            break;
            default : ;
         }

an der stelle r.Methode() bekomme ich jetzt aber eine NullPointerException... wie kann ich hier auf den robot, den ich mit new robot und set robot gesetzt habe zugreifen ???

vielen Dank

Johannes
 

Ralph-Uwe

Bekanntes Mitglied
Vorher hast Du der Klasse World eine Referenz von Roboter mitgegeben:
Java:
public World(int x, int y, Robot r) {

...

}

das sieht jetzt so aus:

Java:
public World(int x, int y) {

...

}


Du deklarierst zwar in der Klasse World eine Variabel r, weißt ihr jetzt aber einen Wert zu.
Dadurch ist sie null. Was zur Folge hat, dass beim aufrufen von r.methode() eine Nullpointer Exception
gewurfen wird.

Gruß
 

johannesK

Mitglied
aber ich weise doch hier eigentlich dem robot der shellWorld einen Wert zu :

in der ShellWorld...
Java:
shellWorld.setRobot(r);

und dann in World
Java:
public void setRobot(Robot r) {
    r.setX(0);
    r.setY(0);
}

damit müsste doch der Robot der Shellworld nicht mehr mit null initialisiert sein sondern mit den werten x=0 und y=0 .... ???:L

vielen Dank

Johannes
 

jgh

Top Contributor
aber ich weise doch hier eigentlich dem robot der shellWorld einen Wert zu :

in der ShellWorld...
Java:
shellWorld.setRobot(r);

und dann in World
Java:
public void setRobot(Robot r) {
    r.setX(0);
    r.setY(0);
}
damit müsste doch der Robot der Shellworld nicht mehr mit null initialisiert sein sondern mit den werten x=0 und y=0 .... ???:L

vielen Dank

Johannes

versuche es mal den robot zu setzen:
Java:
public void setRobot(Robot r) {
    this.r = r; // Damit setzt du den Robot in der Klasse Welt, mit dem Rest weist du nur x und y neue Werte zu
    r.setX(0);
    r.setY(0);
}
 

Ähnliche Java Themen

Neue Themen


Oben