Wie kann ich bei Greenfoot ein 5x5 Gebiet komplett abfahren (mit Zählschleifen)?

2 Antworten

Zwei Schleifen sind gut. Damit du nun noch verstehst, wieso:

Eine Schleife läuft alle Spalten des Gitters ab.

for (int x = 0; x < width; ++x) {
}

Damit sie es für alle Reihen tut, muss sie öfter wiederholt werden. Es wird also eine Schleife drumherum gepackt:

for (int y = 0; y < height; ++y) {
  for (int x = 0; x < width; ++x) {
  }
}

Nun ist gesichert, dass jedes Feld durchlaufen werden kann.

for (int y = 0; y < height; ++y) {
  for (int x = 0; x < width; ++x) {
    System.out.println(x + " - " + y);
  }
}
JeminemT 
Fragesteller
 16.11.2018, 12:07

Ich hätte noch eine Frage dazu :)

Also wenn ich bei dem Programm die Breite und Höhe (5x5) eintrage und dann in der Schleife den Befehl 'fahre()' ausführe fährt er zwar 5 nach vorne, allerdings muss sich das Fahrzeug ja auch noch drehen, eins nach unten fahren und nochmal drehen und das soll ja nicht 5 mal wiederholt werden (ich hoffe ich konnte es einigermaßen verständlich ausdrücken). Dann kommt ja noch dazu, dass es sich mit jeder Spalte immer abwechselnd nach 2x nach rechts und dann 2x nach links drehen muss.

Dieser Code funktioniert zwar, ich weiß aber nicht wie 'sauber' es programmiert ist oder/bzw. ob es noch eine bessere Variante (wovon ich ausgehe) gibt.

 for (int y = 0; y < 2; ++y) {
      fahre();
      fahre();
      fahre();
      fahre();
      drehe("rechts");
      fahre();
      drehe("rechts");
      for (int x = 0; x < 1; ++x) {
        fahre();
        fahre();
        fahre();
        fahre();
        drehe("links");
        fahre();
        drehe("links");
      }
    }   
    fahre();
    fahre();
    fahre();
    fahre();

Ich hoffe es ist verständlich geworden, was mein/e Problem/Frage ist.

Danke schon mal im Voraus :)

0
regex9  16.11.2018, 17:26
@JeminemT

Du fährst etwas zu oft, wie es mir scheint. Bei der Koordinate 0/0 bspw. würde die Funktion fahre insgesamt zehnmal aufgerufen werden und sich das Fahrzeug insgesamt viermal drehen. Aber reicht es nicht, pro Feld nur einmal zu fahren?

for (int y = 0; y < hoehe; ++y) {
  for (int x = 0; x < breite; ++x) {
    fahre();
  }
}

Dem muss dann nur noch das Drehen beigefügt werden, sobald eine Reihe abgeschritten wurde. Der Wert, der an die Funktion drehe übergeben wird, kann zunächst einmal ausgegliedert werden, alles andere bleibt ja gleich.

for (int y = 0; y < hoehe; ++y) {
  for (int x = 0; x < breite; ++x) {
    fahre();
  }
  drehe(richtung);
  drehe(richtung);
}

Nun wäre dieser nur noch zu Wechseln.

String richtung = "rechts";

for (int y = 0; y < hoehe; ++y) {
  for (int x = 0; x < breite; ++x) {
    fahre();
  }
  drehe(richtung);
  drehe(richtung);

  if (richtung.equals("rechts")) {
    richtung = "links";
  }
  else {
    richtung = "rechts";
  }
}

Verkürzt zu if-else könnte man ebenso einen ternären Operator verwenden:

richtung = richtung.equals("rechts") ? "links" : "rechts";

Zu beachten ist, dass String-Vergleiche in Java mit der equals-Methode durchgeführt werden müssen, da der Gleichheitsoperator nicht nur auf Gleichheit (des Wertes) prüft, sondern auch schaut, ob die beiden String-Objekte identisch zueinander sind. Das sind sie nicht.

So startet das Programm also mit der Startrichtung rechts, führt diese bei der ersten Reihe aus und wechselt dann die Richtung auf links für das folgende Mal.

0

Ich kenne leider diese Programmiersprache bzw. Anwendung nicht, aber ich gehe mal davon aus, du hast bei dem Feld Koordinaten?

Also um das ganze Feld abzudecken, musst du eine Schleife in die andere packen, sodass es am Ende ungefähr so aussieht:

for (i = 0; i < 5; i++) { 
  for (j = 0; j < 5; j++) { 
   feld.istAbgefahren(i,j)
    }
  }

Wobei i und j die Koordinaten sind.

Woher ich das weiß:Berufserfahrung – Programmierer