x Schritte zählen

tfausw

Aktives Mitglied
Guten Morgen zusammen,

vorerst Entschuldigung für mögliche banale Fehler, ich bin noch am Anfang an meiner Java Karriere :eek:.

Folgendes: Wir lernen mit kara. Es soll quasi einfach jede 5 Schritte nun ein Blatt gelegt werden, d.h., dass ich eine Methode für das kara.putLeaf() (Methode zum Blatt legen) geschrieben habe, die wie folgt lautet:
Java:
public int put() {
      int ww = 20; // WorldWidth
    
      for (int step =0; step <= ww; step ++) {
        if (step % 5 == 0) {          
            kara.putLeaf();                    
        }
        else {
            kara.move();
      }
   }
   return ww;
  }
Also wenn ich meinen Code in deutsch "übersetzen" sollte, würde ich sagen, dass die Weltbreite 20 Felder beträgt, wir eine Schritt(step) Variable deklarieren die mit der Zahl 0 anfängt. Step darf nur kleiner gleich worldwidth sein und step summiert sich pro Durchlauf um +1. Wenn step durch 5 teilbar ist und der Rest 0 beträgt, wird kara.putLeaf() ausgeführt. Ansonsten wird ein Schritt gemacht.
Beim return ww; am Ende bin ich mir eher unsicher ob es überhaupt Sinn macht diesen Wert zurückzugeben (ich schätze mal eher nicht?)


Nun ist das Problem, dass wenn ich das Programm ausführe, nur nach 4 Schritten das Blatt gelegt wird, anstatt wie nach gewollten 5.

Für jeglichen Hinweis und Denkanstöße, damit ich daraus lerne, wäre ich sehr dankbar.

Schönen Tag und schönes Wochenende zusammen
 
Zuletzt bearbeitet:

Javinner

Top Contributor
@tfausw
Java:
int ww = 20;
(int step =0; step <= ww; step ++)
Hier läufst du aber einundzwanzig Schritte ;) Außerdem vergisst du einmal zu gehen, wenn der Schritt Modulo 5 Null ist. Scha u, Java-Hamster macht es richtig ;)
 

Anhänge

  • JavaHamsterKannEs.PNG
    JavaHamsterKannEs.PNG
    17,1 KB · Aufrufe: 66
Zuletzt bearbeitet:

Javinner

Top Contributor
@tfausw
Und wenn du schon dabei bist: an letzter Kachel, an der der Käfer den Blatt ablegt, sollte der Käfer auch stehen bleiben. Da baue ich ein Fehler ein und keiner merkt es :D
 

tfausw

Aktives Mitglied
Soweit so gut ... naja oder auch eher nicht. Nun wird jeder 5. Schritt in meiner Zeile ein Blatt gelegt, das ist ja auch ganz in Ordnung fürs erste. Nur wird es tatsächlich auch nur für eine Zeile ausgeführt, obwohl mein "Spielbrett" sozusagen 20x15 groß ist. Jetzt tüftel ich seit ca. 2 Stunden daran rum, warum aber es eben nur für eine Zeile ausgeführt wird, aber ich finde einfach nicht meinen Fehler weshalb entweder die Schleife ausbricht o.ä.

Der Zeilenwechsel funktioniert nicht, zudem soll weitergezählt werden, d.h. nicht einfach pro Zeile 5 Schritte, sondern mit Zeilenwechsel 5 Schritte. Ich war eben so weit, dass kara in jeder Zeile pro 5 Schritte ein Blatt gelegt hat, aber wie erwähnt soll es von oben links bis unten rechts durchzählen und jeden 5. Schritt ein Blatt legen. Nun habe ich meinen Code so verranzt, dass ich kaum noch durchblicke wo mein Fehler ist.

Java:
boolean leaf = false;
 
  public void put() {
      // jede 5 Schritte ein Blatt legen
      int ww = 20; // WorldWidth
  
      for (int step =0; step < ww; step ++) {
        if (step % 5 == 0) {        
         
            kara.putLeaf(); 
             kara.move();
    
      //  if (kara.treeFront()) {
        //    changeRow();
     // }
    }
        else {
          if (!kara.treeFront()) {
              kara.move();
        }
       }
   }
  }
 
 
  public void changeRow() {
     // Blickrichtung ändern
      if (kara.treeRight() && !kara.treeFront()) {
          kara.turnLeft();
      } else if (kara.treeFront() && kara.treeLeft()) {
          kara.turnRight();
      } else if (kara.treeFront() && kara.treeRight()) {
          kara.turnLeft();
          kara.turnLeft();
      }
  }

public void leafChess() {
  
// Schleife zum Ausführen
    while(true) {
        put();
        if (kara.treeFront()) {
            changeRow();
        }
        while (!kara.treeFront()) {
          put();
          }
    
        kara.turnRight();
        if (kara.treeFront()) {
            break;
        }
        put();
        kara.turnRight();
        while (!kara.treeFront()) {
        put();
        }
        kara.turnLeft();
        if (kara.treeFront()) {
            break;
        }
        put();
        kara.turnLeft();
  
      }
    }

Was da jetzt passiert ist, dass in meinem Spielfeld ( 20x15 ) quasi im Kreis blätter gelegt werden, also völlig am Ziel vorbei weil dieser Zeilenwechsel nicht funktioniert bzw. beim Zeilenwechsel nicht weitergezählt und weiter jeden 5. Schritt ein Blatt gelegt wird.

Ich hoffe, dass ich das hier nicht all zu verwirrend verfasst habe und über Ratschläge und Denkanstöße wäre ich unendlich dankbar.

Also nochmal kurz: anstatt einem Zeilenwechsel läuft das Programm im Kreis und ich finde den Fehler nicht
 
Zuletzt bearbeitet:

Javinner

Top Contributor
Wenn ich dich jetzt richtig verstanden habe, willst du ein Feld W x H ablaufen und jeweils links und rechts in die nächste mögliche Zeile wechseln, um auf jeder fünften Kachel ein Kleeblatt abzulegen und das solange, bis das Feld eben zu Ende ist.
Schauen wir die möglichen Grundbefehle, die der Käfer versteht.

  • kara.move() Kara läuft einen Schritt vorwärts
  • kara.turnRight() Kara dreht sich an Ort und Stelle nach rechts
  • kara.turnLeft() Kara dreht sich nach links
  • kara.putLeaf() Kara legt ein Kleeblatt ab (an der Stelle, wo Kara steht)
  • kara.removeLeaf() Kara nimmt ein Kleeblatt auf (an der Stelle, wo er steht)

In JavaKara gibt es Sensoren, mit denen die Umgebung überprüft werden kann:
  • kara.treeFront() Gibt es einen Baum auf dem Feld unmittelbar vor Kara?
  • kara.treeLeft() Gibt es einen Baum auf dem Feld links von Kara?
  • kara.treeRight() Gibt es einen Baum auf dem Feld rechts von Kara?
  • kara.mushroomFront() Gibt es einen Pilz auf dem Feld vor Kara?
  • kara.onLeaf() Steht Kara auf einem Kleeblatt?
Bewegung im Raum:
Gehen wir davon aus, dass Kara bereits in der linken oberen Ecke steht, Blickrichtung OST. Ein Feld W x H erstreckt sich vor dem Käfer nach Süden und Ost verlaufend. Was sind denn die Grenzen des Feldes? Der Befehlsliste entnehme ich, dass ein Baum oder eine Baumreihe eine mögliche Grenze bilden können. Also soll der Käfer bis zum Baum laufen. Wenn er dann vor dem Baum steht und rechts aber kein Baum steht, dann existiert ja eine weitere Reihe. Die selbe Vorgehensweise auf der anderen Seite: wenn der Käfer vor dem Baum steht, Blickrichtung WEST, und links von ihm kein Baum existiert, existiert eine weitere Reihe. Nun braucht es noch eins, zumindest denke ich, dass es hier notwendig ist und lasse mich gern des Anderen belehren, und zwar die Variable für die Blickrichtung, so dass der Käfer im Falle eines Wechsels in die nächste mögliche Reihe stets weiß, in welche Richtung er gerade blickt. Eventuell spielt die Variable bei der End-Bedingung eine wichtige Rolle..

Kleeblatt-Management:
Hier muss man nur letztendlich die Schritte beim Wechsel in die nächstmögliche Reihe mitzählen. Das haben wir ja schon besprochen.

Programmtest:
Hier wird es knifflig, denn dein Programm muss für
  • eine Kachel
  • eine eine Kachel weite horizontale Reihe
  • eine eine Kachel breite vertikale Reihe
  • ein Feld von W x H

all diese Felder funktionieren. Das gute dabei, all diese Felder haben das selbe Ende und der Käfer sollte erkennen, ob er sich am Ende eines Feldes befindet ;) Also könnte das Programm so lauten:
Java:
do{
    bearbeiteEineReihe;
    wenn(weitereReiheExistiert und Blickrichtung OST)
             wechelRechtsEin()
    wenn(weitereReiheExistiert und Blickrichtung WEST)
             wechselLinksEin()
} while(endeDesFeldesErreicht());
Anschließend prüfen, ob die letzte Kachel für ein Kleeblatt bestimmt ist ;)
Viel Erfolg!
 
Zuletzt bearbeitet:

Javinner

Top Contributor
kara.turnLeft();
kara.turnLeft();
Damit dein Code besser, kürzer und verständlicher wird, fasse doch die Bewegungsabläufe, die nicht zu dem Grundsatz der Befehle gehören, in deine eigene Methoden zusammen.
Hier würde ich eher so vorgehen:
Java:
public void turn180()
{
     kara.turnLeft();
     kara.turnLeft();
}

Dann die Mehtode:
Java:
public void leafChess() {
 
// Schleife zum Ausführen
    while(true) {
        put();
        if (kara.treeFront()) {
            changeRow();
        }
        while (!kara.treeFront()) {
          put();
          }
   
        kara.turnRight();
        if (kara.treeFront()) {
            break;
        }
        put();
        kara.turnRight();
        while (!kara.treeFront()) {
        put();
        }
        kara.turnLeft();
        if (kara.treeFront()) {
            break;
        }
        put();
        kara.turnLeft();
 
      }
    }
Hm... Gehe doch die Methode durch und schreibe dir sequentiell auf, was hier passiert..
 
X

Xyz1

Gast
Das legt ein wie ich finde interessantes Muster:
Java:
import javakara.JavaKaraProgram;
        
/* BEFEHLE:  kara.
 *   move()  turnRight()  turnLeft()
 *   putLeaf()  removeLeaf()
 *
 * SENSOREN: kara.
 *   treeFront()  treeLeft()  treeRight()
 *   mushroomFront()  onLeaf()
 */
public class KaraTest extends JavaKaraProgram {

  // hier können Sie eigene Methoden definieren

  public void myProgram() {
    // hier kommt das Hauptprogramm hin, zB:
    int steps = 0;
    while (true) {
      if (steps%5 == 0) {
          if (kara.onLeaf()) {
            kara.removeLeaf();
          if (kara.treeLeft())
            kara.turnRight();
          if (kara.treeRight())
            kara.turnLeft();
          } else {
            kara.putLeaf();
          }
      }
      while(kara.treeFront())
        kara.turnLeft();
      kara.move();
      steps++;
    }
  }
}
 

tfausw

Aktives Mitglied
Guten Morgen,

vorerst Entschuldigung falls mein letzter Post irgendwie ziemlich konfus war. Ich habe mir gestern viele Stunden den Kopf darüber zerbrochen, was für euch vermutlich unverständlich ist, aber ich möchte das gerne verstehen, vielleicht war es auch einfach zu spät oder was auch immer. :D nun ja, neuer Tag neues Glück. Ich bedanke mich schon mal für die Unterstützung und werde mich zeitnah damit befassen und werde es dann hoffentlich heute schaffen ;)
 

Javinner

Top Contributor
Für die Nachwelt:
Bezogen auf mein Post Nr.: #8 kommt jetzt eine Lösung des Problems nach beschriebener Strategie, welche für alle Territorien funktioniert (siehe Bilder). Zu beachten ist: es wurde mit dem Java-Hamster umgesetzt, will heißen, ich habe die Grundbefehle des Hamsters an die des Käfers angepasst.
Java:
/** zeilenWechsel
Blickrichtung OST = false
Blickrichtung WEST = true
*/
boolean zeilenWechsel = false;
/** Schrittzaehler */
int schritt = 0;
/** Kornabstand */
int modulo = 5;
void main() {
 
   do{
       bearbeiteEineReihe();
       if(!zeilenWechsel && ! treeRight() && treeFront())
       {
           zeilenWechselRechts();
       }
       if(zeilenWechsel && !treeLeft() && treeFront())
       {
           zeilenWechselLinks();
       }
   } while(!feldBearbeitet());
   /**
   Wenn das Feld nur aus einer Kachel besteht oder es sich
   um das letzte Feld, welches zu belegen ist, handelt
   */
   if(placeToLeaf())
   {
         putLeaf();
   }
 
}


public boolean feldBearbeitet()
{
    return !zeilenWechsel && treeRight() && treeFront()
            ||
            zeilenWechsel && treeLeft() && treeFront();
}

public void bearbeiteEineReihe()
{
    while(!treeFront())
    {
        moveAndPut();
    }
}

public void moveAndPut()
{
    if(placeToLeaf())
    {
        putLeaf();
        move();
        schritt++;
    } else {
        move();
        schritt++;
    }
}

public boolean placeToLeaf()
{
    return schritt % modulo == 0;
}

public void zeilenWechselRechts()
{
    turnRight();
    moveAndPut();
    turnRight();
    zeilenWechsel = true;
}

public void zeilenWechselLinks()
{
    turnLeft();
    moveAndPut();
    turnLeft();
    zeilenWechsel = false;
}
//-------------------------------------------------------------------------Translated to Java-Hamster
public void move()
{
    vor();
}

public void turnRight()
{
    linksUm();
    linksUm();
    linksUm();
}

public void turnLeft()
{
    linksUm();
}

public void putLeaf()
{
   gib();
}

public void removeLeaf()
{
    nimm();
}

public boolean treeFront()
{
    return !vornFrei();
}

public boolean treeLeft()
{
    turnLeft();
    boolean value = treeFront();
    turnRight();
    return value;
}

public boolean treeRight()
{
    turnRight();
    boolean value = treeFront();
    turnLeft();
    return value;
}


public boolean onLeaf()
{
    return kornDa();
}
Viel Spaß :)
 

Anhänge

  • a.png
    a.png
    62,6 KB · Aufrufe: 28
  • b.png
    b.png
    29,2 KB · Aufrufe: 42
  • c.png
    c.png
    46,2 KB · Aufrufe: 32
  • d.png
    d.png
    15,3 KB · Aufrufe: 32
  • e.png
    e.png
    108,9 KB · Aufrufe: 23
Ähnliche Java Themen
  Titel Forum Antworten Datum
K OOP Die ersten Schritte bei der Programierung Java Basics - Anfänger-Themen 1
T Anzahl der Schritte berechnen Java Basics - Anfänger-Themen 6
G Anfängerbuch geschafft - nächste Schritte? Java Basics - Anfänger-Themen 14
H Datenbank suche in kleine Schritte Java Basics - Anfänger-Themen 6
X SAX die ersten Schritte Java Basics - Anfänger-Themen 5
G erste Schritte in Fenster und Grafik-Programmierung Java Basics - Anfänger-Themen 2
R Erste Schritte,erste Class,Korrekturlesen und Verbesserungen Java Basics - Anfänger-Themen 3
T Erste Schritte (SEHR mühsam); Grafiktest Java Basics - Anfänger-Themen 5
S ersten schritte in Java lernen! Java Basics - Anfänger-Themen 3
A erste Schritte auf dem Weg eine XML-Datei zu parsen Java Basics - Anfänger-Themen 2
F Erste Schritte in Java - Wo finde ich Antworten? Referenzbib Java Basics - Anfänger-Themen 3
E Erste Schritte - warum läuft nur das eine? Java Basics - Anfänger-Themen 2
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
M Häufigkeit von Wörtern zählen Java Basics - Anfänger-Themen 6
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
D spezifische Knoten in einem Baum zählen Java Basics - Anfänger-Themen 9
F Werte in einer Arraylist Zählen Java Basics - Anfänger-Themen 2
S Java Methodenaufrufe zählen Java Basics - Anfänger-Themen 4
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
J Methoden Positive Werte zählen Java Basics - Anfänger-Themen 3
H Buchstaben zählen Java Basics - Anfänger-Themen 9
Poppigescorn Häufigkeit einer zahl zählen Java Basics - Anfänger-Themen 5
HighLife Bestimmte Werte aus Array zählen Java Basics - Anfänger-Themen 15
O Attribute die Methoden zählen Java Basics - Anfänger-Themen 5
X Game of Life Nachbarn zählen Java Basics - Anfänger-Themen 20
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
S Binärbäume knoten zählen Java Basics - Anfänger-Themen 16
K Counts zählen Java Basics - Anfänger-Themen 23
Kirby.exe Anzahl vorkommender Elemente im Array zählen Java Basics - Anfänger-Themen 9
J Zeichen im String zählen Java Basics - Anfänger-Themen 3
G Binärer Suchbaum Knoten zählen Java Basics - Anfänger-Themen 1
N Zeichen in einem Textfeld zählen und hinterlegen Java Basics - Anfänger-Themen 6
E Knoten eines Baumes unter Bedinung zählen Java Basics - Anfänger-Themen 2
P Schlüsselworte Zählen und Zuweisen von eingelesenen Zahlen Java Basics - Anfänger-Themen 1
A In einem String alle Eigennamen zählen Java Basics - Anfänger-Themen 6
L Baum Knoten zählen Java Basics - Anfänger-Themen 6
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
S Zählen der Zeiger auf Objekte Java Basics - Anfänger-Themen 35
S Zeichen zählen kopierter Text Java Basics - Anfänger-Themen 6
B Array - die Häufigkeit der Zahl zählen Java Basics - Anfänger-Themen 9
L Vorherige Objekte zählen und ausgeben Java Basics - Anfänger-Themen 11
L Diphthonge zählen... Java Basics - Anfänger-Themen 5
O ELOPS Zählen Java Basics - Anfänger-Themen 1
S Rekursives Zählen einer Zahl Java Basics - Anfänger-Themen 8
X Quick Sort - Vergleichsoperationen zählen Java Basics - Anfänger-Themen 0
K alle Vorkommen einer bestimmten Ziffer in einer Zahl zählen Java Basics - Anfänger-Themen 2
B Collections Java Wörter in String zählen und geordnet ausgeben Java Basics - Anfänger-Themen 10
O Großbuchstaben im Satz zählen Java Basics - Anfänger-Themen 6
S zahl hoch und runter zählen per button Java Basics - Anfänger-Themen 25
N Zählen von Rationalen Werten eines Arrays Java Basics - Anfänger-Themen 10
Y for-Schleife zählen Java Basics - Anfänger-Themen 6
K Probleme mit Sortieren und dem Zählen Java Basics - Anfänger-Themen 13
S Vererbung Objekte von Ober - und Unterklassen zählen Java Basics - Anfänger-Themen 3
F SubString in String zählen Java Basics - Anfänger-Themen 3
C Im Array zählen und verändern Java Basics - Anfänger-Themen 5
O Zählen der while-Scheife Java Basics - Anfänger-Themen 3
P bytes aus einem InputStream zählen Java Basics - Anfänger-Themen 2
A Text teilen und Wörter zählen Java Basics - Anfänger-Themen 7
G Erste Schritte Einen Array absuchen und Buchstaben zählen Java Basics - Anfänger-Themen 17
F Problem mit Tabulatoren bei Zeilen zählen einer Textdatei Java Basics - Anfänger-Themen 17
F Textdatei einlesen und Zeilen zählen Java Basics - Anfänger-Themen 10
D Groß/KleinBuchstaben zählen Java Basics - Anfänger-Themen 21
D Buchstabe zählen/mappen Java Basics - Anfänger-Themen 3
S Anzahl unterschiedlicher Elemente zählen Java Basics - Anfänger-Themen 4
M Hilfe bei Zählen von Farben? Java Basics - Anfänger-Themen 7
R Input/Output Tastenschläge einer Taste zählen Java Basics - Anfänger-Themen 14
J Schleifendurchläufe zählen Java Basics - Anfänger-Themen 4
B Zweidimensionales Array Elemente jeder Spalte zählen Java Basics - Anfänger-Themen 9
E Methoden Methodenaufrufe zählen Java Basics - Anfänger-Themen 11
T Leerzeichen zählen mit Rekursion Java Basics - Anfänger-Themen 17
H Programm zum Zählen von Zeichen Java Basics - Anfänger-Themen 5
K Kommandozeile zählen Java Basics - Anfänger-Themen 5
J Bits zusammen zählen Java Basics - Anfänger-Themen 4
P Hashtabelle-Häufigkeit von String zählen Java Basics - Anfänger-Themen 2
J Array; Vorkommen zählen Java Basics - Anfänger-Themen 10
T durchlaufene while-Schleifen zählen Java Basics - Anfänger-Themen 3
P Replace zählen Java Basics - Anfänger-Themen 4
A Methoden Gedanken Anstöße zur Realisierung zweier Ideen (Grafisch Sekunden zählen und Frameaufteilung) Java Basics - Anfänger-Themen 18
E Zeichen von Kommandozeilenparameter zählen Java Basics - Anfänger-Themen 6
L Objekte zählen mehrerer Unterklassen Java Basics - Anfänger-Themen 3
J Buchstaben aus String einzeln Zählen Java Basics - Anfänger-Themen 12
J Enum zählen Java Basics - Anfänger-Themen 8
M Automatisch hoch zählen Java Basics - Anfänger-Themen 8
S Zählen Java Basics - Anfänger-Themen 9
V Arraylist: Zählen welcher String am Häufigsten vorkommt Java Basics - Anfänger-Themen 5
A Erste Schritte Datei einlesen und Buchstaben zählen Java Basics - Anfänger-Themen 13
M Von File lesen Buchstaben lesen und zählen - scheitert an der Eingabe Java Basics - Anfänger-Themen 4
B Zählen bestimmter Zeilen einer .txt Java Basics - Anfänger-Themen 7
A Satzeingabe - Vokale zählen Java Basics - Anfänger-Themen 5
G Gleiche Elemente in Feld zählen Java Basics - Anfänger-Themen 13
B Input/Output Wörter zählen & sortieren Java Basics - Anfänger-Themen 9
S Buchstaben/Wörter im String zählen Java Basics - Anfänger-Themen 6
K apache poi - Spalten zählen Java Basics - Anfänger-Themen 4
T Methodenaufrufe zählen Java Basics - Anfänger-Themen 24
L Array Sequent Zählen Java Basics - Anfänger-Themen 8
N Bestimmte Zeichen aus Strings zählen Java Basics - Anfänger-Themen 11
C Boolean Wahrheitswert zählen Java Basics - Anfänger-Themen 15
C Vorkommen eines Zeichens zählen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben