Hamstersimulator? SEW?

3 Antworten

Ein erster Tipp von mir für einen künftigen Programmierstil: Fasse Zeilen zusammen, bei denen es unnötig ist, sie aufzusplitten. Konkret meine ich Definitionen und Deklarationen:

// to looooonngg ...
int breite;
// ...
breite = 0;

// better
int breite = 0;

Eine Variable sollte nach Möglichkeit erst dann eingeführt werden, wenn sie spätestens benötigt wird. Damit reduziert sich die Zeilenanzahl und die Variable rutscht näher an ihren Einsatzort. Es ist einfacher zu lesen.

Ein zweiter Tipp: Vermeide Umlaute / Sonderzeichen in Bezeichnern. Statt höhe heißt es dann hoehe. So sparst du mögliche Encoding-Probleme aus. Nach Java-Konvention werden Bezeichner, die aus mehreren Wörtern bestehen, in kamelHoeckerSchreibweise geschrieben.

Ein dritter Tipp: Schreibe Kommentar in der Zeile über der Zeile, die du kommentieren möchtest. Dahinter verbreitert die Spaltenzahl und nötigt den Leser womöglich, horizontal scrollen zu müssen.

Damit ergibt sich erst einmal folgender Code:

void main() {
  int breite = liesZahl("Wie breit ist das Rechteck?");

  // Wenn der Benutzer eine zu große Breite eingibt dann korrigieren wir die Breite auf die des Territoriums
  if (breite > 10) {
    breite = 10;
  }

  int hoehe = liesZahl("Wie hoch ist das Rechteck?");

  // Wenn der Benutzer eine zu große Hoehe eingibt dann korrigieren wir die Hoehe auf die des Territoriums
  if (hoehe > 6) {
    hoehe = 6;
  }

  for (int reihen = 0; reihen < hoehe; ++reihen) {
    gib();
    vor();

    // Reihe erledigen = breite gehen mit Körner ablegen
  }

  linksUm();
  linksUm();

  while (vornFrei() == true) {
    vor();
  }

  for (int schritte = 2; schritte < breite; ++schritte) {
    linksUm();
    vor();
    linksUm();
  }
}                                                              

Hilfe bei der Logik:

So, deinem Bild nach würde der Hamster ja nun jede Reihe zweimal ablaufen. Einmal von links nach rechts und dann wieder zurück. Ich halte das für unnötigen Aufwand, am Ende einer Reihe könnte er doch gleich einen Schritt hinunter, in die nächste Reihe tun.

Neben der Schleife, mit der du die einzelnen Spalten abwanderst, wäre es zum einen praktisch, eine Schaltervariable zu haben, die je Reihe die Richtung beeinflusst. Bei einer ungeraden Zeile dreht sich er Hamster zuletzt nach rechts. Bei einer geraden Zeile dreht er sich am Ende nach links.

laufe bis zeilenende
wenn gerade zelle
  drehe nach links
sonst
  rechts
ein schritt vor (in die naechste reihe; sofern moeglich)

Nun besteht bei diesem Algorithmus jedoch noch das Problem, dass der Hamster an dieser Stelle erst einmal nur eine Reihe abwandern würde, obwohl noch andere auf ihn warten. Das heißt, dieser gesamte Ablauf müsste mehrmals wiederholt werden, mit Beschränkung auf die Höhe / Reihenanzahl, die der Nutzer zuvor festgelegt hat. Dieser Tipp sollte dir zunächst einmal reichen.

Du machst eine If-Abfrage... Falls der Wert zu groß ist, setzt du die Eigenschaft des Feldes... Z.b. Das Feld ist 6 breit, du als User gibts 120 ein und durch die if-Abfrage wird dann der Wert des Feldes, also 6, verwendet

Zeig, was du bisher hast und welcher Teil nicht funktioniert, dann kann man dir helfen. Keiner wird dir hier aber ein komplettes Programm schreiben. Das geht auch gar nicht, zumal du noch nicht mal angibst, in welcher Sprache du programmieren sollst, welches Framework du verwendest usw.


FinnFa 
Beitragsersteller
 14.11.2018, 11:44

void main() {

int breite;

int höhe;

int anzahlmal;

int schritte; 

int reihen;

reihen = 0;

breite = 0;

höhe = 0;

breite = liesZahl("Wie breit ist das Rechteck?");

höhe = liesZahl("Wie hoch ist das Rechteck?");

if(breite > 10) { //Wenn der Benutzer eine zu große breite eingibt dann korrigieren wir die breite auf die des Terretoriums

breite=10;

}

if(höhe > 6) { // //Wenn der Benutzer eine zu große höhe eingibt dann korrigieren wir die höhe auf die des Terretoriums

höhe=6;

}

  // schleife über die Höhe

  for(reihen=0;reihen<höhe;reihen++) {

   gib();

   vor();  

  //reihe erledigen = breite gehen mit Körner ablegen

}

linksUm();

linksUm();

while(vornFrei() == true) {

vor();

}

for(schritte=2;schritte<breite;schritte++) {

linksUm();

vor();

linksUm();

}

}

0