Teil 3: Bedingte Anweisungen

Lösungen

LÖSUNG AUFGABE 3.01: Conditionals

a.

Nimmt den Stern weg, wenn es einen hat.

b.

Nimmt den Stern weg, wenn es einen hat und legt einen Stern hin, wenn es keinen hat (Invertieren).

c.

Nimmt den Stern weg, wenn links ein Baum steht.

LÖSUNG AUFGABE 3.02: Star Track

class MyPlayer extends Player {

  start() {
    while (canMove()) {
      if (!onStar()) {
        putStar();
      }
      move();
    }
    putStar();
  }
}

LÖSUNG AUFGABE 3.03: Star at Tree

class MyPlayer extends Player {

  start() {
    while (canMove()) {
      if (treeLeft() || treeRight()) {
        putStar();
      }
      move();
    }
  }
}

LÖSUNG AUFGABE 3.04: Around Tree II

class MyPlayer extends Player {

  start() {
    while (!onStar()) {
      if (treeFront()) {
        goAroundTree();
      } else {
        move();
      }
    }

    removeStar();
  }

  goAroundTree() {
    turnLeft();
    move();
    turnRight();
    move();
    move();
    turnRight();
    move();
    turnLeft();
  }
}

LÖSUNG AUFGABE 3.05: Round Trip

class MyPlayer extends Player {

  start() {
    while (!onStar()) {
      if (!treeFront()) {
        move();
      } else {
        if (!treeLeft()) {
          turnLeft();
          move();
        } else {
          turnRight();
          move();
        }
      }
    }

    removeStar();
  }
}

LÖSUNG AUFGABE 3.06: Around Tree III

class MyPlayer extends Player {

  start() {
    while (!onStar()) {
      if (treeFront()) {
        goAroundTree();
      } else {
        move();
      }
    }

    removeStar();
  }

  goAroundTree() {
    turnLeft();
    move();
    turnRight();
    move();

    while (treeRight()) {
      move();
    }

    turnRight();
    move();
    turnLeft();
  }
}

LÖSUNG AUFGABE 3.07: Follow the Trail

class MyPlayer extends Player {

  start() {
    while (!treeFront()) {
      removeStar();
      findNextStar();
    }

    removeStar();
  }

  /// Funktion, um den nächsten Stern zu finden.
  findNextStar() {
    // Erst mal vorne schauen.
    move();
    if (!onStar()) {

      // Kein Stern vorne, also zurück und links schauen.
      turnAndGoBack();
      turnRight();
      move();
      if (!onStar()) {

        // Links ist auch kein Stern; dann muss er rechts liegen.
        turnAndGoBack();
        move();
      }
    }
  }

  /// Funktion, um einen Schritt zurück zu gehen.
  turnAndGoBack() {
    turnLeft();
    turnLeft();
    move();
  }
}

LÖSUNG AUFGABE 3.08: Guard

class MyPlayer extends Player {

  start() {
    while (true) {
      makeOneStep();
    }
  }

  makeOneStep() {
    if (!treeRight()) {
      // Kein Baum rechts --> gehe nach rechts.
      turnRight();
      move();
    } else {
      // Baum rechts.
      if (!treeFront()) {
        // Kein Baum vorne --> ein Schritt vorwärts.
        move();
      } else {
        // Bäume rechts und vorne.
        if (!treeLeft()) {
          // Kein Baum links --> gehe nach links.
          turnLeft();
          move();
        } else {
          // Bäume rechts, vorne und links --> Sackgasse.
          turnLeft();
          turnLeft();
          move();
        }
      }
    }
  }
}