<iframe src="https://drive.google.com/file/d/1_IzzIagrLUwN22fVd_xYwWAZh0J9VFQE/preview" width="640" height="480" allow="autoplay"></iframe>
<center>
<div id="grosserLinkKachel"> [[Los Gehts ->Einleitung AB1]]</div>
[[Springe zu Level... ->Levelsprung]]
<div id="saveLink">
(link: "saved games ")[(if: (saved-games:) contains "Slot A")[(load-game:"Slot A")](else:)[SLOT A IS EMPTY]]
</div>
</center>## Einleitung Einsatz 1
{<figure>
<iframe src="https://drive.google.com/file/d/1-eP4qKap3LIiYlML_IWQ5ZuBjgKklUe7/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Dall-E, Prompt: An realistic oil painting of an nuclear accident</figcaption></figure>
<!-- Set the text to show -->
(set: $typewriterText to "In einer Welt, die stark von der Nutzung atomarer Energie abhängig ist, gibt es eine unsichtbare Bedrohung, die ständig in der Dunkelheit lauert: die Gefahr eines Atomunfalls.
Willkommen in der Welt des Reaktor Roboters.
Unser Protagonist in dieser heldenhaften Geschichte ist kein geringerer als ... DU, ein(e) junge(r) und überaus talentierte(r) Programmierer(in) mit acht Händen voller Ideen. Die Stadtregierung hat dich beauftragt, ein spezielles Projekt zu leiten, codiert als 'Rescue-Robo'.
Deine Mission? Den Rescue-Robo so zu programmieren, dass er die gefährlichen Aufgaben in einem Atomkraftwerk übernehmen kann.
Deine Geschichte beginnt tief im Inneren eines geheimen Labors, wo du das erste Mal auf den beeindruckenden Rescue-Robo triffst. Deine erste Aufgabe ist es, den Roboter durch die verwinkelten Korridore des Robo-Trainingsgebäudes zu navigieren. Anfangs sind die Herausforderungen harmlos: Schrauben und kleinere Hindernisse. Aber das wird sich bald ändern.
Es eine Geschichte voller Spannung, Humor und heldenhafter Momente. Bereite deinen Roboter darauf vor, immer kompliziertere Aufgaben zu übernehmen und die Gefahren der Atomkraft zu bewältigen.")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Einrichtung der Programmieroberfläche]]
</div>
(stop:)
]
]
}
}
[[Überspringen -> Einrichtung der Programmieroberfläche]]
##Einrichtung der Programmierumgebung
Bevor es losgeht, musst du dir deine Arbeitsumgebung einrichten:
* Erstelle eine Kopie der Rohfassung des Roboter-Projekts (***ReaktorRobot-Szenario-Roh***, *du findest das Projekt im Moodle oder erhältst es von deiner Lehrer:in*)
* **Benenne den Ordner um** (z.B. in ***ReaktorRobot-Arbeitsfassung***).
* Starte das Szenario nun in Greenfoot (Szenario → Öffnen).
* Deine Oberfläche sollte nun so aussehen:
<iframe src="https://drive.google.com/file/d/1rs9JLp4nHrf3YCXlZosEpCh7xMs13rQA/preview" width="640" height="480" allow="autoplay"></iframe>
[[Weiter -> Aufgaben AB1-1]]
[[Ich brauche Hilfe -> Hilfe Programmierumgebung]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
<script type="text/javascript">
document.twine.update_one = function(element){
element.style.color = "white";
if (element.value.toLowerCase() === "int 4" || element.value.toLowerCase() === "4" ) {
// Display the hidden link.
$('#naechsteAufgabe').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
document.twine.boul_one_update = function(element){
element.style.color = "white";
document.twine.boul_one = element.value;
if (document.twine.boul_one === "true" || document.twine.boul_one === "false") {
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
if ((document.twine.boul_one === "true" && document.twine.boul_two === "false") ||
(document.twine.boul_two === "true" && document.twine.boul_one === "false")) {
// Display the hidden link.
$('#link').show();
}
}
document.twine.boul_two_update = function(element){
element.style.color = "white";
document.twine.boul_two = element.value;
if (document.twine.boul_two === "true" || document.twine.boul_two === "false") {
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
if ((document.twine.boul_one === "true" && document.twine.boul_two === "false") ||
(document.twine.boul_two === "true" && document.twine.boul_one === "false")) {
// Display the hidden link.
$('#link').show();
}
}
</script>
{
## Die ersten Schritte
<!-- Workaround damit der Beginn der Seite angezeigt wird, ansonsten ist das erste Input-Tag fokussiert und es wird dorthin gescrollt -->
<input type="hidden" autofocus="true" />
<iframe src="https://drive.google.com/file/d/110KHUSh2Xov2xRo-Xrr_DdCXpHk7sQY5/preview" width="540" height="420" allow="autoplay"></iframe>
<div style="display: flex; align-items: flex-start;"><div><ol><li>Steuere den Roboter AB1 mit passenden Befehlen aus dem Kontextmenu (Rechtsklick auf den Roboter) so, dass er gegen eine Wand läuft.
Steuere den Roboter AB1 nun so, dass er alle drei Schrauben im Raum links oben aufnimmt. Sorge dafür, dass der Roboter anschließend eine dieser Schrauben wieder ablegt.</li> </div>
</ol></div> <div style="display: flex; align-items: flex-start;"><div>
<ol start="2"> <li>Erzeuge nun einen zweiten Roboter vom Typ AB1
(siehe Bild rechts: Rechte Maustaste auf AB1, dann <span class="method-call">new AB1()</span> ). Setze ihn in den Raum unten links und lasse ihn die dort abgelegten Schrauben aufnehmen. Rufe anschließend bei beiden Robotern nacheinander jeweils die Anweisung <span class="method-call">getAnzahlSchrauben()</span> auf.
Welches Resultat liefert die Methode für den gerade von dir erstellten Roboter?<br>
<input type="text" onchange="document.twine.update_one(this)"/>
</li>
</ol>
</div>
<div>
<iframe src="https://drive.google.com/file/d/14qjKf5gclvTUMULuuE70b130GkoouyB4/preview" width="200" height="300" allow="autoplay"></iframe>
</div>
</div>
<div><span id="naechsteAufgabe" style="display: none;"><ol start="3"><li>Rufe den Befehl <span class="method-call">istAufSchraube()</span> an jedem Roboter auf. Welche Antworten sind möglich?<br>
Mögliche Antwort 1:<br>
<input type="text" onchange="document.twine.boul_one_update(this)" /><br>
Mögliche Antwort 2:<br>
<input type="text" onchange="document.twine.boul_two_update(this)" />
</li></ol></span></div><br>
}
<span id="link" style="display: none;"> [[Gut gemacht =) Weiter gehts! -> Aufgaben AB1-2]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
*Bearbeite nun die folgenden drei Aufgaben und notiere deine Lösungen in einem Microsoft Word / libreOffice Writer Dokument.
Am besten du legst dir für die gesamte Rescue-Robo-Einheit einen Ordner an indem du deine Erkentnisse und Erarbeitungen speicherst.*
<div>
<ol start="4">
<li>Was geschieht, wenn du einen Roboter aufforderst, eine Schraube abzulegen, obwohl er keine bei sich hat oder eine Schraube abzulegen, wenn schon eine da liegt?</li>
<li>Wie kannst du neue Wände erzeugen und in die Welt legen? (Was passiert, wenn du nach dem Ablegen die Shift-Taste drückst?) Kannst du sie überall hinbauen?.</li>
<li>Erprobe alle Fähigkeiten der Roboter.
Was musst du tun, damit ein Roboter auf die Anfrage <span class="method-call">istVorratLeer()</span> die Antwort false liefert?
</li></ol></div>
[[Erledigt ! -> Geschichte AB1 Teil 2]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
<!-- Set the text to show -->
(set: $typewriterText to "Nach den ersten Warmmachübungen stehst du nun endlich kurz davor, die erste Abschlussaufgabe deines Roboter-Projekts zu bewältigen. Doch bevor dein metallischer Freund autonom handeln kann, musst du ihn noch einmal mit nervigem Geklicke durch die Gegend bewegen. Es ist eine kleine Hürde, bevor ihr gemeinsam in die Welt der Automatisierung starten könnt. Das Portal in der Ferne blinkt verheißungsvoll, doch der Weg dorthin wird kein Kinderspiel. Es ist Zeit, die wahre Stärke deines Roboterfreundes zu beweisen!")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Zur Abschlussaufgabe-> Abschlussaufgabe AB-1]]
</div>
(stop:)
]
]
}
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>Drücke auf (text-color: #B06B00)[„Reset“], um das Level neu zu starten.
Nimm mit dem rechten Roboter durch Aufruf der richtigen Befehle im Kontextmenü **zwei** der vier Schrauben auf und laufe zum Portal.
Da es ein weiter Weg ist, wird deine Energie nicht reichen. Sammle deswegen auch Akkus unterwegs auf und benutze sie.
<center>
<iframe src="https://drive.google.com/file/d/1-GEt_zavvEMJScIgp27DeG_Q5qT1AThi/preview" width="640" height="480" allow="autoplay"></iframe>
[[Das Portal wurde erreicht -> Abschluss AB1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
</center<script type="text/javascript">
document.twine.checkCheckbox = function() {
var checkboxes = document.querySelectorAll('input[type="checkbox"][id^="AB1-punkt"]');
var allChecked = true;
checkboxes.forEach(function(checkbox) {
if (!checkbox.checked) {
allChecked = false;
}
});
if (allChecked) {
$('#link').show();
} else {
$('#link').hide();
}
}
</script>
<h2>Zusammenfassung Level 1</h2>
<fieldset class="level-fieldset"><legend>Du kannst jetzt</legend>
<div class="level-checkbox">
<input type="checkbox" id="AB1-punkt1" name="AB1-punkt1" onchange="document.twine.checkCheckbox(this)"/> <label for="AB1-punkt1">Greenfoot starten</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB1-punkt2" name="AB1-punkt2" onchange="document.twine.checkCheckbox(this)"/> <label for="AB1-punkt2">ein Szenario laden</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB1-punkt3" name="AB1-punkt3" onchange="document.twine.checkCheckbox(this)"/> <label for="AB1-punkt3">Objekte erzeugen (z.B. *Roboter AB1*) und nutzen (z.B. *Akku*)</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB1-punkt4" name="AB1-punkt4" onchange="document.twine.checkCheckbox(this)"/> <label for="AB1-punkt4">einem Roboter über sein Kontextmenü Befehle geben</label>
</div>
</fieldset>
<span id="link" style="display: none;">
<div> Gut gemacht =) Du hast nun das zweite Level erreicht. Möchtest du direkt dorthin springen, benötigst du das folgende Codewort:
<center>(color: white )[**befehlsMeister**]</center>
</div>
[[Weiter gehts! ->Einleitung AB2]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>Frage deine Lehrkraft, ob sie dir helfen kann die Programmierumgebung einzurichten.
[[Zurück -> Einrichtung der Programmieroberfläche]]## Einleitung Einsatz 2
{<figure>
<iframe src="https://drive.google.com/file/d/1WS5gH5uXPHtKSN5pLHQ2-1bDWreKikCM/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Dall-E, Prompt: 3d render of a nuclear Robot moving around</figcaption></figure><!-- Set the text to show -->
(set: $typewriterText to "Willkommen in Kapitel 2, dem Aufbruch in eine neue Ära. Du hast die Aufwärmübungen gemeistert und dein Roboter hat den ersten Test bestanden. Doch nun ist es Zeit, mit der Programmierung des Roboters zu starten.
Gerade eben hast du deinen ersten Einsatz erlebt. Aber willst du wirklich deinen Roboter von Hand durch ein verseuchtes Kernkraftwerk navigieren?
SICHER NICHT.
Deshalb steht das Ziel fest: Dein Roboter muss eigenständig agieren können. In diesem Kapitel lernst du, wie du Quelltexte ergänzt und erweiterst. Denn jedes Manöver, das dein Roboter ausführt, ist im Quelltext notiert. Beginne also mit der Erkundung")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Aufgaben AB2-1]]
</div>
(stop:)
]
]
}
}
[[Überspringen -> Aufgaben AB2-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.update_two = function(element){
element.style.color = "white";
if (element.value.toLowerCase() === "4" || element.value.toLowerCase() === "vier") {
// Display the hidden link.
$('#Aufgabe2-3').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
document.twine.checkCheckboxOne = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#Aufgabe4-5').show();
document.getElementById('label-AB2-Aufgabe3').style.color = "#108300";
} else {
$('#Aufgabe4-5').hide();
document.getElementById('label-AB2-Aufgabe3').style.color = ""; // Setze die Farbe des Labels zurück auf die Standardfarbe
}
}
document.twine.checkCheckboxTwo = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#Aufgabe6').show();
document.getElementById('label-AB2-Aufgabe5').style.color = "#108300";
} else {
$('#Aufgabe6').hide();
}
}
document.twine.checkCheckboxThree = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB2-Aufgabe6-7').style.color = "#108300";
} else {
$('#link').hide();
}
}
</script>
## Quelltext erkunden und erweitern
{
<!-- Aufgabe 1 -->
<div class="aufgabe">
<div style="display: flex; align-items: flex-start;"><div><ol><li>Welche Befehle bietet dir ein **AB2**-Roboter in seinem Kontextmenü direkt an? Öffne nun den Quelltext. Du kannst ihn dir mit einem Rechtsklick auf die **AB2-Klasse** im rechten Fenster mit *„Editor öffnen“ *(oder alternativ Doppelklick auf die <u> **Klasse**</u> AB2) anzeigen lassen. Jede Fähigkeit ist in einer sogenannten <u>**Methode**</u> im Quelltext beschrieben. Findest du die Befehle des AB2-Roboters? Wieviele Methoden gibt es in der AB2-Klasse?<br>
<input type="text" onchange="document.twine.update_two(this)" />
</li></ol></div>
<div>
<iframe src="https://drive.google.com/file/d/1jTmoioWNHRsc6R2AryYGcGvv6_xIDWDH/preview" width="200" height="300" allow="autoplay"></iframe>
</div>
</div>
<!-- Aufgabe 2 & 3 --><div><span id="Aufgabe2-3" style="display: none;"><ol start="2"><li>Steuere den Roboter noch ein letztes Mal von Hand durch einzelne Befehle so, dass er eine Runde dreht wie im Bild (siehe unten). Die bekannten Befehle findest du jetzt im Kontextmenu unter *„geerbt von Roboter“*.
<div style="display: flex;">
<div style="flex: 1; padding: 10px;">
<iframe src="https://drive.google.com/file/d/1CRi75H-NpObpNN7pO_UryFw6bV3brgzw/preview" width="400" height="300"></iframe>
</div>
<div style="flex: 1; padding: 10px;">
<iframe src="https://drive.google.com/file/d/1bkuLBHe3NsokRxKlM8mVJbyBHDefVZ8d/preview" width="400" height="300"></iframe>
</div></div></li><br>
<li>**Drehe Runde im Raum:** Öffne den Quelltext der Klasse AB2. Ergänze die Anweisungen in <span class="method-call">dreheRunde()</span>, damit es eine vollständige Runde wird. Es wird danach auch möglich sein, mehrmals nacheinander den Befehl "dreheRunde" aufzurufen. Nach jedem Befehl musst du einen Strichpunkt setzen.<br>
*<u>Hinweis:</u> in (text-color: #FF33F0)[rosa] und (text-color: #C0C0C0)[grau] findest du sogenannte Kommentare. Das sind Hinweise für dich und haben für den Roboter keine Bedeutung*<br>
<input type="checkbox" id="AB2-Aufgabe3" name="AB2-Aufgabe3" onchange="document.twine.checkCheckboxOne(this)"/><label id="label-AB2-Aufgabe3" style="color:#B9021C;" for="AB2-Aufgabe3">**Kompiliere und erprobe deine Methode**</label></li></ol></span></div><br>
<!-- Aufgabe 4 --><div>
<span id="Aufgabe4-5" style="display: none;"><ol start="4"><li>**Drehe um:** Schreibe im Quelltext die Anweisungen für <span class="method-call">dreheUm()</span></li><br>
<!-- Aufgabe 5 -->
<li>**Sammle 3 Schrauben:**Bringe dem AB2 bei, drei Dinge aufzusammeln, die direkt hintereinander liegen. Wir üben wieder im Testgelände mit Schrauben, aber im Kernkraftwerk werden es herumliegende Brennstäbe sein. Mit dem Befehl <span class="method-call">aufnehmen();</span> kannst du beliebige Dinge einsammeln (sofern sie sich tragen lassen). Dafür ist im Quelltext schon einiges vorbereitet. Ergänze die Zeilen für <span class="method-call">sammle3()</span> an der passenden Stelle. Teste die neue Methode, indem du beim Roboter vor den drei Schrauben die Methode aufrufst.<br>
<input type="checkbox" id="AB2-Aufgabe5" name="AB2-Aufgabe5" onchange="document.twine.checkCheckboxTwo(this)"/><label id="label-AB2-Aufgabe5" style="color:#B9021C;" for="AB2-Aufgabe5">**Mein AB2 Roboter kann jetzt drei Gegenstände hintereinander aufnehmen**</label></li></ol></span></div><br>
<!-- Aufgabe 6 --><div style="display: flex; align-items: flex-start; display: none" id="Aufgabe6"><ol start="6"><li><div>**Haken schlagen:** Sorge dafür, dass die AB2-Roboter auch frei stehende Wände umlaufen können (s. Bild unten). Wie nennst du diese Fähigkeit deines AB2-Roboters? Das wird auch der Name der Methode, die du imQuelltext beschreibst. Der Methodenname sollte mit einem Kleinbuchstaben beginnen. Neue Methoden müssen immer mit **public void ***methodenname()* beginnen. Die Befehle der Methode werden dann in geschweiften-Klammern eingeschlossen. Schaue dieses Konzept bei den bestehenden Methoden ab. Wenn ein AB2-Roboter genau vor einer Wand steht und einen Haken schlagen möchte, muss er sich z.B. nach links drehen, einen Schritt vor gehen, nach... Ach, das kriegst du selbst raus.</div><br>
<div>
<iframe src="https://drive.google.com/file/d/166qOS55MErnAe8mr3-aHitgZNLTw7ZTs/preview" width="300" height="200" allow="autoplay"></iframe></div>
</li><br>
<li>**Vier sammeln:** Bringe den AB2-Robotern bei, eine Reihe von vier beliebigen Gegenständen aufzusammeln. Erprobe deine Methode am Roboter oben rechts. Verändere Deine Methode ggf. so, dass sie den Befehl <span class="method-call">sammle3();</span> verwendet.
</li><br>
<input type="checkbox" id="AB2-Aufgabe6-7" name="AB2-Aufgabe6-7" onchange="document.twine.checkCheckboxThree(this)"/><label id="label-AB2-Aufgabe6-7" style="color:#B9021C;" for="AB2-Aufgabe6-7">**Mein AB2 Roboter kann jetzt Haken schlagen und vier Gegenstände in einer Reihe sammeln**</label>
</ol></div>
</div>
}
<span id="link" style="display: none;"> [[Gut gemacht =) Weiter gehts! -> Aufgaben AB2-2]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.update_learningApp1 = function(element){
element.style.color = "white";
if (element.value == "camelCaseNotation") {
// Display the hidden link.
$('#link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
$('#link').hide();
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
</script>
###Regeln und Best Practices für methodenNamen in Java:
<div class="aufgabe"><ul>
<li>Methodennamen sollten: Aussagekräftig konsistent und beschreibend sein.</li>
<li>Beim ReaktorRoboter verwenden wir die <a href="https://en.wikipedia.org/wiki/Camel_case" target="blank">CamelCase</a>(*das ist ein Link ;-)*) Namenskonventionen.</li>
<li>Beginne mit einem kleinen Buchstaben.</li>
<li>Vermeide zu starke Abkürzungen</li>
<li>Präzise Bezeichnungen verbessern die Codeverständlichkeit.</li>
<li>Folge den Java-Namenskonventionen für eine konsistente und lesbare Codebasis.</li></ul></div>
<iframe src="https://learningapps.org/watch?v=pmgjnchx323" style="border:0px;width:100%;height:500px" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true"></iframe>
<div>Wenn du die Multiple Choice Aufgaben in der Learning App richtig beantwortet hast, erhältst du das Passwort um weiter zu machen.</div>
<div>Gib hier das Lösungswort ein:</div>
<input type="text" onchange="document.twine.update_learningApp1(this)" />
<span id="link" style="display: none;"> [[Gut gemacht =) Weiter gehts! -> Geschichte AB2 Teil 2]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## EINSATZ 2:
###NOTFALL IM KERNKRAFTWERK, ATOMARE VERSEUCHUNG BEFÜRCHTET!
(set: $typewriterText to "Zum Glück haben wir in diesem Kapitel schon ein paar Methoden definiert, die uns im Ernstfall helfen können. Die Sirenen heulen auf und überall leuchten die Notfallanzeigen. Der Roboter steht bereit, und seine Sensoren sind scharf gestellt. Das Training im Robo-Trainingsgebäude hat ihn auf solche Situationen vorbereitet, und die Quelltexte, die du zuvor erstellt und erweitert hast, werden jetzt seine Hauptantriebskraft sein.")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Abschlussaufgabe AB2]]
</div>
(stop:)
]
]
}
[[Überspringen -> Abschlussaufgabe AB2]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><div style="display: flex; align-items: flex-start;">
<!-- Text -->
<div>Der Kraftwerksarbeiter, der als letztes das Kraftwerk verlassen hat, beschreibt die Situation wie folgt:
*"Vom Eingang muss man drei Schritte vorgehen. Dann dreht man sich nach links und geht nochmals drei Schritte, glaube ich. Dann steht man in einem Raum und direkt vor einer Säule. Vor der Säule liegt ein Akku. Hinter der Säule liegen in einer Reihe ein Akku und zwei Brennstäbe. Aber ich kann mich nicht mehr erinnern in welcher Reihenfolge. Wenn man sich dann nach rechts dreht und zwei Schritte geht, kommt man zum Notausgang. Glaube ich zumindest... Bitte helfen Sie mir. **Die Brennstäbe müssen unbedingt eingesammelt werden!!!"**
</div><div><iframe src="https://drive.google.com/file/d/1fmpJTSGHKg_mUak2jkKsKT_4pUNIxHRM/preview" width="300" height="450"></iframe>
</div>
</div>
<div>Implementiere für diesen Einsatz die Methode <span class="method-call"> einsatz2()</span> im Quelltext.
Rufe dazu die zuvor erstellten Methoden in der richtigen Reihenfolge auf. Um innerhalb einer Methode eine andere (bereits implementierte Methode) aufzurufen, musst du nur den Namen der Methode die du aufrufen möchtest mit der ()-Klammer dahinter hinschreiben (z.B. <span class="method-call"> dreheUm();</span>) Ergänze ggf. weitere Befehle (z.B. <span class="method-call"> einsVor();</span>).
*<u>Hinweis:</u> Du brauchst insgesamt mindestens 11 Befehle!*
Um den Einsatz durchzuführen,musst du in der Roboter-Welt mit der rechten Maustaste auf einem beliebigen Gangfeld (grauer Hintergrund) die Methode <span class="method-call"> einsatz_02()</span> aufrufen (nicht direkt beim Roboter!).
<div style="color:#B9021C; background-color: black; padding-left: 20px;">ACHTUNG: Bevor du mit dem Programmieren anfängst, lies unbedingt [[HIER -> Fehler Greenfoot]] nach, wie du schwerwiegende Fehler in deinem Reaktor Roboter Projekt vermeiden kannst. </div>
Ich bin mal gespannt, ob du deinen ersten richtigen Einsatz bewältigst!</div>
[[Das Portal wurde erreicht -> Abschluss AB2]]
[[Ich brauche Hilfe -> Hilfe Abschluss AB2]]
Frage deine Lehrkraft, ob sie dir helfen kann.
[[Zurück -> Abschlussaufgabe AB2]]<script type="text/javascript">
document.twine.checkCheckbox = function() {
var checkboxes = document.querySelectorAll('input[type="checkbox"][id^="AB2-punkt"]');
var allChecked = true;
checkboxes.forEach(function(checkbox) {
if (!checkbox.checked) {
allChecked = false;
}
});
if (allChecked) {
$('#link').show();
} else {
$('#link').hide();
}
}
</script>
<h2>Zusammenfassung Level 2</h2>
<fieldset class="level-fieldset"><legend>Du kannst jetzt</legend>
<div class="level-checkbox">
<input type="checkbox" id="AB2-punkt1" name="AB2-punkt1" onchange="document.twine.checkCheckbox(this)"/> <label for="AB2-punkt1">Methoden mit Anweisungen füllen.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB2-punkt2" name="AB2-punkt2" onchange="document.twine.checkCheckbox(this)"/> <label for="AB2-punkt2">dir sinnvolle und zulässigeMethodennamen überlegen.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB2-punkt3" name="AB2-punkt3" onchange="document.twine.checkCheckbox(this)"/> <label for="AB2-punkt3">eigene, neue Methoden implementieren.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB2-punkt4" name="AB2-punkt4" onchange="document.twine.checkCheckbox(this)"/> <label for="AB2-punkt4">Roboter sich selbstständig bewegen lassen.</label>
</div>
</fieldset>
<span id="link" style="display: none;">
<div> Gut gemacht =) Du hast nun das dritte Level erreicht. Möchtest du direkt dorthin springen, benötigst du das folgende Codewort:
<center>(color:white )[**methodenMonster**]</center>
</div>
[[Weiter gehts! ->Einleitung AB3]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><div style="color:#B9021C;">Wenn du mal angefangen hast die Methode <span class="method-call">einsatz2()</span> zu implementieren, wirst du sie irgendwann testen müssen.
Angenommen, sie ist noch nicht korrekt und dein Roboter steuert gegen eine Wand oder produziert irgendeinen anderen Fehler erhältst du eine Fehlermeldung wie auf dem Bild unten links.
Greenfoot springt dann automatisch zurück in den Code-Editor.
**Es wird allerdings die Klasse Roboter geöffnet.** Siehe unteres rechtes Bild.
**Den Code in dieser Klasse darfst du nicht verändern, sonst kommt es zu schwerwiegenden Fehlern in deinem Projekt!!! Öffnet sich der Roboter-Code-Tab, schließe ihn also sofort wieder und programmiere in dem AB2-Tab weiter.** </div>
<div style="display: flex; align-items: flex-start;">
<div style="flex-basis: 50%;">
<iframe src="https://drive.google.com/file/d/1dXR-z-Hku87QCG8nuYTZ121Zt_RtxzLS/preview" width="100%" height="400px"></iframe>
</div>
<div style="flex-basis: 50%;">
<iframe src="https://drive.google.com/file/d/1O0MdeD6rx3tdJO3WCRKGY5dHH0RrRzhu/preview" width="100%" height="400px"></iframe>
</div>
</div>
[[Zurück -> Abschlussaufgabe AB2]]## Einleitung Einsatz 3:
{<figure>
<iframe src="https://drive.google.com/file/d/10piQikVU5ijaz4UKZGQCuWTNT7A21yTQ/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Stable Diffusion, Prompt: Fire inside a nuclear factory - realistic photo</figcaption></figure>
<!-- Set the text to show -->
(set: $typewriterText to "Gerade als du dachtest, der größte Schrecken sei vorbei, erreicht dich ein dringender Notruf. In einem benachbarten Kraftwerk wütet ein gewaltiges Feuer.
Aufgrund deiner jüngsten Erfolge wird deine RoboRescue-Firma um Hilfe gebeten. Ohne zu zögern, machst du dich auf den Weg.
Doch wie geht man gegen diese neue Herausforderung vor?
Wie genau löscht man ein Feuer?
Deine Roboter sind Meister der Wiederholung und dieses Prinzip könnte hier den Unterschied ausmachen. Ziel ist es, die wiederkehrenden Handlungsschritte zu erkennen und als SOLANGE-Schleife zu formulieren. Außerdem lernst du Methoden mit Parametern zu benutzen. ")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Aufgaben AB3-1]]
</div>
(stop:)
]
]
}
}
[[Überspringen -> Aufgaben AB3-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.checkCheckboxAb3a1 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#AB3Aufgabe2').show();
document.getElementById('label-AB3-Aufgabe1').style.color = "#108300";
} else {
$('#AB3Aufgabe2').hide();
document.getElementById('label-AB3-Aufgabe1').style.color = "#FD2C4A";
}
}
document.twine.showErklaerungAB3a2 = function() {
$('#AB3-Aufgabe2-Lösung').show();
}
document.twine.checkCheckboxAb3a2 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#AB3Aufgabe3').show();
document.getElementById('label-AB3-Aufgabe2').style.color = "#108300";
} else {
$('#AB3Aufgabe3').hide();
document.getElementById('label-AB3-Aufgabe2').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAb3a3 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#Aufgabe4').show();
document.getElementById('label-AB3-Aufgabe3').style.color = "#108300";
} else {
$('#Aufgabe4').hide();
document.getElementById('label-AB3-Aufgabe3').style.color = "#FD2C4A";
}
}
</script>
{
## Schleifen
<!-- Workaround damit der Beginn der Seite angezeigt wird, ansonsten ist das erste Input-Tag fokussiert und es wird dorthin gescrollt -->
<input type="hidden" autofocus="true" />
###Die Roboter machen vieles immer wieder ...
<!-- Aufgabe 1 -->
<div style="display: flex; align-items: flex-start;"><div class="aufgabe"><ol><li>**Löschen:** Der Roboter AB3 ganz oben links soll den vor ihm stehenden Feuerlöscher aufnehmen, damit auf das Feld vor dem Feuer (nicht auf das Feuer!!!) gehen und es löschen. Führe dies zunächst von Hand durch. Via Rechtsklick unter *„geerbt von Roboter“* findest du auch die Methode "benutze", um den Feuerlöscher zu benutzen.</span> </li></ol></div>
<div><br><iframe src="https://drive.google.com/file/d/1bvRmyZcsQ9rlFnYfk9uO_XR7lNBHWf9z/preview" width="300" height="200" allow="autoplay"></iframe>
</div></div><div class="aufgabe"><ol><li style="list-style-type: none;">*<u>Hinweis:</u> Es gibt Methoden, die eine Zusatzinformation (einen sogenannten* ***Parameter****) benötigen, um korrekt arbeiten zu können. Die Methode „<span class="method-call">benutze(String name)</span>“ ist so eine. Es wird also der Name des Gegenstandes erwartet, der benutzt werden soll. Dieser ist ein String (=Text). Strings müssen in Anführungszeichen gesetzt werden. Um den Feuerlöscher zu benutzen, muss man also* <span class="method-call">benutze("Feuerloescher");</span> *schreiben.*
Vervollständige dann die Methode <span class="method-call">loesche()</span> im Quelltext, die dies alles automatisch für den oberen Roboter machen soll.<br>
<input type="checkbox" id="AB3-Aufgabe1" name="AB3-Aufgabe1" onchange="document.twine.checkCheckboxAb3a1(this)"/><label id="label-AB3-Aufgabe1" style="color:#FD2C4A;" for="AB3-Aufgabe1">**Mein linker oberer AB3 Roboter kann jetzt automatisch den Feuerlöscher aufnehmen, zu dem Feuer gehen und es löschen.**</label>
</li></ol>
</div><br>
<!-- Aufgabe 2-->
<div id="AB3Aufgabe2" style="display: none;">
<div class="aufgabe">
<ol start="2">
<li>
Die weiteren Roboter darunter sollen ihre ersten Feuer in der Reihe auch mit dem Befehl <span class="method-call">loesche()</span> löschen können. Diese Feuer sind aber in einer anderen Entfernung platziert. Überlege dir, welche Zeilen deines Programms überarbeitet werden müssen. Worauf muss der Roboter reagieren können?<br><br>
<button onclick="document.twine.showErklaerungAB3a2()">Erklärung anzeigen</button>
<div id="AB3-Aufgabe2-Lösung" style="display: none;">(color:orange)[Es muss die Anzahl an <span class="method-call">einsVor();</span> Befehlen angepasst werden. Die Roboter müssen also erkennen, wann sie vor einem Feuer stehen.]<br><br>
<input type="checkbox" id="checkAB3Aufgabe2" onchange="document.twine.checkCheckboxAb3a2(this)"/>
<label id="label-AB3-Aufgabe2" for="checkAB3Aufgabe2" style="color:#FD2C4A;">**Verstanden.**</label>
</label></div>
</li>
</ol>
</div>
</div>
<div class="aufgabe"><span id="AB3Aufgabe3" style="display: none;"><ol start="3">
<li>**VorBisFeuer:** Gib jedem Roboter den Auftrag: <span class="method-call">vorBisFeuer()</span> und beobachte, was sie tun. Lies danach im Quelltext bei der Methode <span class="method-call">vorBisFeuer()</span> die Anweisungen und versuche sie zu verstehen. <br>
*<u>Hinweis:</u> das Ausrufezeichen bedeutet „nicht“.*
Setze diese Methode sinnvoll in der <span class="method-call">loesche()</span>-Methode ein, indem du einige Zeilen deines Quelltextes durch den Befehl <span class="method-call">vorBisFeuer();</span> ersetzt. Teste nun die neue <span class="method-call">loesche()</span>-Methode an allen vier Löschrobotern.<br>
<input type="checkbox" id="AB3-Aufgabe3" name="AB3-Aufgabe3" onchange="document.twine.checkCheckboxAb3a3(this)"/><label id="label-AB3-Aufgabe3" style="color:#FD2C4A;" for="AB3-Aufgabe3">**Die Lösche Methode funktioniert bei allen vier Robotern.**</label></li></ol></span></div><br>
<span id="Aufgabe4" style="display: none;"><div class="aufgabe"><ol start="4"><li>Ergänze testweise die Methode <span class="method-call">vorBisFeuer()</span> so, dass die Roboter danach noch einen Schritt ins Feuer hinein machen. Was passiert dann? Was passiert, wenn du innerhalb der (text-color: #FA2CFD)[lila Farbhinterlegung] des Quelltextes (also innerhalb der { }-Klammern) noch ein zweites <span class="method-call">einsVor();</span> einfügst? Entferne die Veränderungen wieder.</li>
</ol></div><br><br>
Du hast den ersten Teil des dritten Levels erfolgreich absolviert. Auf der nächsten Seite lernst du Grundlagen zum Thema Schleifen.<br>
[[Zum Input! -> Input Schleifen]]
</span>
}
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.checkCheckboxAb3Input1 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB3-Input1').style.color = "#108300";
} else {
$('#SchleifenText2').hide();
document.getElementById('label-AB3-Input1').style.color = "#FD2C4A";
}
}
</script>
### Schleifen:
<!-- Set the text to show -->
(set: $typewriterText to "Der Auftrag vorBisFeuer() muss korrekt ausgeführt werden, egal wie weit das Feuer entfernt ist.
Daher muss der Roboter prüfen, wie lange er vorwärts gehen muss.
Auf die Anfrage: istVorne(''Feuer'') liefert er die Antwort true bzw. false. Damit können wir diese bedingte Wiederholung so formulieren:")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
(stop:)
]
]
}
{
(live: 15s)[
(stop:)
<iframe src="https://drive.google.com/file/d/1A04qYCz-RYQgP0dYFX_MaovoOfAX7asy/preview" width="600" height="200" allow="autoplay"></iframe>
<input type="checkbox" id="AB3-Input1" name="AB3-Input1" onchange="document.twine.checkCheckboxAb3Input1(this)"/><label id="label-AB3-Input1" style="color:#FD2C4A;" for="AB3-Input1">**Ich habe mir die drei Diagramme angeschaut und sie verstanden.**</label>
]
}
<span id="link" style="display: none;">
[[Weiter -> Input Schleifen 2]]
</span>
[[Überspringen -> Input Schleifen 2]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.checkCheckboxAb3Input2 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB3-Input2').style.color = "#108300";
} else {
$('#SchleifenText2').hide();
document.getElementById('label-AB3-Input2').style.color = "#FD2C4A";
}
}
</script>
### Schleifen:
Der Auftrag vorBisFeuer() muss korrekt ausgeführt werden, egal wie weit das Feuer entfernt ist.
Daher muss der Roboter prüfen, wie lange er vorwärts gehen muss.
Auf die Anfrage: istVorne(''Feuer'') liefert er die Antwort true bzw. false. Damit können wir diese bedingte Wiederholung so formulieren:
<iframe src="https://drive.google.com/file/d/1A04qYCz-RYQgP0dYFX_MaovoOfAX7asy/preview" width="600" height="200" allow="autoplay"></iframe>
<input type="checkbox" id="AB3-Input1" name="AB3-Input1" checked disabled/><label id="label-AB3-Input1" style="color:#108300;" for="AB3-Input1">**Ich habe mir die drei Diagramme angeschaut und sie verstanden.**</label>
Genau so steht es auch im Quelltext.
(set: $typewriterText to "Im runden Klammerpaar hinter dem Schlüsselwort while (...) steht die Bedingung, welche die Wiederholungen steuert. Solange diese Ausführungsbedingung gilt, werden alle Anweisungen im Schleifenblock zwischen { und } wiederholt.
Oder anders ausgedrückt:
--> Die Ausführungsbedingung wird überprüft.
--> Ist sie wahr, so wird jede Anweisung in der Blockklammer zwischen { und } ausgeführt.
--> Es wird wieder überprüft, ob die Ausführungsbedingung immer noch wahr ist.
--> Die Anweisungen innerhalb der Blockklammer werden wieder ausgeführt. ---> Und so weiter und so fort.
--> Erst wenn die Ausführungsbedingung falsch ist, wird die Schleife beendet und die Befehle hinter der schließenden Klammer } ausgeführt.
Wichtig: Innerhalb des wiederholten Vorgangs muss sich die Ausführungsbedingung verändern, damit die Wiederholungen schließlich aufhören und nicht endlos laufen.")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
(stop:)<br>
<input type="checkbox" id="AB3-Input2" name="AB3-Input2" onchange="document.twine.checkCheckboxAb3Input2(this)"/><label id="label-AB3-Input2" style="color:#FD2C4A;" for="AB3-Input2">**Ich habe vom Prinzip verstanden, wie eine while/solange-Schleife funktioniert.**</label>
]
]
}
<span id="link" style="display: none;">
Super, jetzt wollen wir das noch ein bisschen üben.
[[Weiter mit der Programmierung-> Aufgaben AB3-2]]
</span>
[[Überspringen -> Aufgaben AB3-2]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.checkAufgabenStatus = function() {
if (document.twine.aufgabe8Erreicht) {
// Zeige die Aufgaben 6, 7, 8 an, da sie bereits erledigt wurden
$('#Aufgabe6').show();
document.getElementById('label-AB3-Aufgabe5').style.color = "#108300";
document.getElementById('AB3-Aufgabe5').checked = true;
$('#Aufgabe7').show();
document.getElementById('input-AB3-Aufgabe6').style.background = "rgba(30, 200, 30, 0.8)";
document.getElementById('input-AB3-Aufgabe6').value = "5"
$('#Aufgabe8').show();
document.getElementById('label-AB3-Aufgabe7').style.color = "#108300";
document.getElementById('AB3-Aufgabe7').checked = true;
}
}
document.twine.updateAb3a6 = function(element){
element.style.color = "white";
if (element.value.toLowerCase() === "5" || element.value.toLowerCase() === "fünf" || element.value.toLowerCase() === "fuenf") {
// Display the hidden link.
$('#Aufgabe7').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
$('#Aufgabe7').hide();
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
document.twine.checkCheckboxAb3a5 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#Aufgabe6').show();
document.getElementById('label-AB3-Aufgabe5').style.color = "#108300";
} else {
$('#Aufgabe6').hide();
document.getElementById('label-AB3-Aufgabe5').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAb3a7 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#Aufgabe8').show();
document.getElementById('label-AB3-Aufgabe7').style.color = "#108300";
} else {
$('#Aufgabe8').hide();
document.getElementById('label-AB3-Aufgabe7').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAb3a8 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB3-Aufgabe8').style.color = "#108300";
} else {
$('#link').hide();
document.getElementById('label-AB3-Aufgabe8').style.color = "#FD2C4A";
}
}
document.twine.checkAufgabenStatus();
</script>
{
## Schleifen
###Die Roboter machen vieles immer wieder ...
<!-- Workaround damit der Beginn der Seite angezeigt wird, ansonsten ist das erste Input-Tag fokussiert und es wird dorthin gescrollt -->
<input type="hidden" autofocus="true" />
<!-- Aufgabe 5 -->
<div style="display: flex; align-items: flex-start;"><div class="aufgabe"><ol start="5"><li>**Feuersbrunst löschen:** Die Feuer des 3. und 4. Roboters
bestehen aus mehreren Flammen hintereinander (ohne Lücke
dazwischen). Um diese zu löschen. muss man immer wieder löschen, dann einen Schritt gehen, dann wieder löschen usw..</span> </li></ol></div>
<div>
<iframe src="https://drive.google.com/file/d/19YtDnhtp7z7o9vzwb35ooLQvJh26v7r2/preview" width="200" height="140" allow="autoplay"></iframe>
</div></div><div class="aufgabe"><ol><li style="list-style-type: none;">Das wiederholt man so lange, wie nach dem Schritt noch ein Feuer vor dem Roboter ist.
Gehe davon aus, dass der Roboter schon einen Feuerlöscher hat und vor dem ersten Feuer steht. Implementiere eine Methode <span class="method-call">loescheReihe()</span>, die dann alle Feuer löscht. Verwende dazu eine <span class="method-call">While</span>-Schleife. Teste die Methode, indem du von Hand den Feuerlöscher aufhebst und zum Feuer läufst. Rufe dann die Methode <span class="method-call">loescheReihe()</span> auf.
Ersetze anschließend in deiner loesche-Methode das Benutzen des Feuerlöschers durch die neue Methode <span class="method-call">loescheReihe()</span>.<br>
<input type="checkbox" id="AB3-Aufgabe5" name="AB3-Aufgabe5" onchange="document.twine.checkCheckboxAb3a5(this)"/><label id="label-AB3-Aufgabe5" style="color:#FD2C4A;" for="AB3-Aufgabe5">**Ich habe die Veränderungen in der loesche-Methode vorgenommen und getestet.**</label>
</li></ol>
</div>
<!-- Aufgabe 6 -->
<div class="aufgabe"><span id="Aufgabe6" style="display: none;"><ol start="6"><li>**Reichweite testen:** Mit einem Feuerlöscher kommt man nicht weit. Die sind recht schnell leer. Schreibe eine Methode testeReichweite(), bei der der Roboter unten links, den ersten Feuerlöscher einsammelt, zur Feuerspur darunter geht und dort so viel Feuer wie möglich löscht.
Verwende eine while-Schleife, um zuüberprüfen, ob der Feuerlöscher noch nicht leer ist.
<iframe src="https://drive.google.com/file/d/1Y3J_5J0rjwmyoGlFDo-K-M7_cO2lSA6t/preview" width="400" height="200" allow="autoplay"></iframe>
*<u>Hinweis:</u> Die Bedingung (getAnzahl("Feuerloescher")>=1) testet, ob der Roboter noch mind. 1 Löscher hat. Dies testet automatisch, ob er leer ist, da er einfach aus dem Inventar des Roboters verschwindet, wenn er verbraucht ist.*<br>
Wieviele Feuer können mit einem Feuerlöscher gelöscht werden?<br>
<input id="input-AB3-Aufgabe6" type="text" onchange="document.twine.updateAb3a6(this)" /></li></ol></span></div>
<!-- Aufgabe 7 -->
<span id="Aufgabe7" style="display: none;"><div style="display: flex; align-items: flex-start;"><div class="aufgabe"><ol start="7"><li>**Feuerlöscher einsammeln:** Für ein großes Feuer braucht man mehrere Feuerlöscher. Vor dem Roboter unten links ist ein Gang mit vielen Feuerlöschern in den Nischen (drücke ggf. unten auf den Reset-Knopf). Er soll nach vorne bis zur Wand laufen und dabei alle Löscher einsammeln. Das soll funktionieren, egal auf welchem orangenen Feld er startet. Er muss aber nur die Löscher einsammeln, die sich nach seiner Startposition befinden.</span> </li></ol></div>
<div><br><br>
<iframe src="https://drive.google.com/file/d/17lvB3kIBvEdiHMOVd3iqR2S0bJMnkv-Q/preview" width="200" height="140" allow="autoplay"></iframe>
</div></div><div class="aufgabe"><ol><li style="list-style-type: none;">Implementiere eine Methode <span class="method-call">sammleLoescher()</span>, die zunächst den Roboter bis zur Wand laufen lässt, ohne die Löscher einzusammeln. (Die Methode <span class="method-call">istVorneFrei()</span> testet, ob vor dem Roboter keine Wand ist). Ergänze die Methode dann so, dass er die Löscher einsammelt. Teste verschiedene Startpositionen (irgendwo auf einem roten Feld), indem du neue AB3-Roboter erzeugst und auf einem der roten Startfelder platzierst.<br>
*Tipp: über den Geschwindigkeitsregler unten rechts kannst du die Ausführungs- geschwindigkeit anpassen!*<br>
<input type="checkbox" id="AB3-Aufgabe7" name="AB3-Aufgabe7" onchange="document.twine.checkCheckboxAb3a7(this)"/><label id="label-AB3-Aufgabe7" style="color:#FD2C4A;" for="AB3-Aufgabe7">**Ich habe die Methode sammleLoescher() implementiert und sie mit verschiedenen Startpositionen getestet.**</label></li></ol></div></span>
<!-- Aufgabe 8 -->
<script>
document.twine.aufgabe8Erreicht = true;
</script>
<span id="Aufgabe8" style="display: none;"><div class="aufgabe"><ol start="8">
<li>**Homerun:** Lasse den Roboter rechts unten in die Sackgasse („Schneckenhaus“) laufen.
<ol type="a">
<li>Implementiere dazu zunächst die Methode <span class="method-call">laufeBisWand()</span>, die den Roboter bis zur nächsten Wand bewegt.
*Tipp: Verwende eine While-Schleife mit istVorneFrei() als Bedingung.*
</li>
<li>Implementiere <span class="method-call">laufeBisSackgasse()</span>, indem du zunächst laufeBisWand() aufrufst und dann eine while-Schleife verwendest, um zu testen, ob du noch mal bis zur Wand laufen musst oder schon in der Sackgasse angekommen bist. Dies erkennst du, indem du testest, ob links keine Wand ist (!istWandLinks() - das ! steht für „nicht“ - [[Hier -> Hilfe Not Operator]] findest du eine genauere Erklärung dieser Bedingung ).<br>
[[Ich brauche Hilfe -> Hilfe Homerun]]
</li>
</ol>
<input type="checkbox" id="AB3-Aufgabe8" name="AB3-Aufgabe8" onchange="document.twine.checkCheckboxAb3a8(this)"/><label id="label-AB3-Aufgabe8" style="color:#FD2C4A;" for="AB3-Aufgabe8">**Aufgabe 8 erledigt.**</label></li></ol></div></span>
}
<span id="link" style="display: none;">
[[Oh Gott... Schon wieder ein Einsatz! ->Geschichte AB3 Teil 2]]
</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einsatz 3:
###Feuerlöschen im Kernkraftwerk
(set: $typewriterText to "Oh mein Gott, in Kernkraftwerk Fessenheim ist ein Feuer ausgebrochen. Sie müssen unbedingt helfen. Wenn das Feuer nicht schnell gelöscht wird, gibt es eine Katastrophe. Unsere Arbeiter können wir nicht mehr rein schicken. Die Gefahr ist einfach zu groß.
Ein Kollege neben dir flüstert dir ins Ohr:
''Weißt du noch, wie die Ghostbusters gerufen wurden, wenn es spukt? Jetzt werden wir gerufen, wenn es brennt!''
Er kichert. ''RoboBusters im Einsatz! GoGo Robo!''
Ein anderer Kollege rollt mit den Augen und entgegnet: ''Jetzt ist nicht die Zeit für Witze, Peter... ")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Abschlussaufgabe AB3]]
</div>
(stop:)
]
]
}
[[Überspringen -> Abschlussaufgabe AB3]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>### Hilfe zu !istWandLinks()
<div class="aufgabe">In Bezug auf den ReaktorRoboter ist <code>!istWandLinks()</code> eine Bedingung, die den boolschen NOT-Operator (!) verwendet. Dieser Ausdruck bedeutet "nicht istWandLinks()" und hat folgende Bedeutung:
Die Methode istWandLinks() wird im Kontext des ReaktorRoboters verwendet, um zu überprüfen, ob sich links vom Roboter eine Wand befindet. Diese Methode gibt true zurück, wenn eine Wand links vom Roboter ist, und false, wenn keine Wand vorhanden ist.
Der boolsche NOT-Operator (!) negiert den Wert einer booleschen Aussage. Wenn die ursprüngliche Aussage true ist, wird sie durch ! in false umgekehrt, und wenn die ursprüngliche Aussage false ist, wird sie durch ! in true umgekehrt.
</div>
Zusammenfassend bedeutet <code>!istWandLinks()</code>, dass keine Wand links vom Roboter vorhanden ist.
[[Zurück -> Aufgaben AB3-2]]### Hilfe für Aufgabe 8:
Die Bedingung !istWandLinks() wird oft in Zusammenhang mit einer while-Schleife verwendet, um eine Aktion so lange auszuführen, bis keine Wand mehr links vom Roboter vorhanden ist.
Hier ist ein Beispiel, wie du dies im Zusammenhang mit einer while-Schleife im Kontext des ReaktorRoboters verwendet werden könntest:
<pre>
while (!istWandLinks()) / Solange keine Wand links vom Roboter ist, führe diese Aktionen aus {
dreheLinks(); / Drehe den Roboter nach links
einsVor(); / Bewege den Roboter ein Feld nach vorne
}
</pre>
[[Zurück -> Aufgaben AB3-2]]## Einsatz 3:
###Feuerlöschen im Kernkraftwerk
<div style="display: flex; align-items: flex-start;">
<!-- Text -->
<div class="aufgabe">Wenn man reinkommt, gibt es gleich links eine Reihe von Nischen, in der die Feuerlöscher hängen. Sammel am besten alle ein. Wir wissen nicht, wie groß das Feuer schon ist. Gehe dann in die große Halle. Lösche dort das Feuer. Es ist in der linken unteren Ecke ausgebrochen. Wie weit es sich inzwischen ausgebreitet hat, musst du selbst herausfinden.
</div><div><iframe src="https://drive.google.com/file/d/1n0HWZZkjmMx4Hpll0s2IL0ZjgWUMpiqV/preview" width="430" height="310"></iframe>
</div></div><div class=aufgabe> *<u>Hinweis:</u> In jeder Zeile ist direkt vor der Wand mindestens eine Flamme und es gibt keine Lücken im Feuer).*
Rechts unten befindet sich einSchutzraum (mit Portal), in das sich der Roboter am Ende begeben muss. Schafft dein Roboter das?
Ach so, der Weg ist übrigens weit – nutze die Akkus, die der Roboter für die Mission bei sich hat! Und denke daran, die neuen Fertigkeiten die der Roboter erlernt hat zu nutzen!
[[Tipp 1 -> Tipp1 Abschluss AB3]]
[[Tipp 2 -> Tipp2 Abschluss AB3]]
</div>
[[Das Portal wurde erreicht -> Abschluss AB3]]
<script type="text/javascript">
document.twine.checkCheckbox = function() {
var checkboxes = document.querySelectorAll('input[type="checkbox"][id^="AB3-punkt"]');
var allChecked = true;
checkboxes.forEach(function(checkbox) {
if (!checkbox.checked) {
allChecked = false;
}
});
if (allChecked) {
$('#link').show();
} else {
$('#link').hide();
}
}
</script>
<h2>Zusammenfassung Level 3</h2>
<fieldset class="level-fieldset"><legend>Du kannst jetzt / Du weißt, dass</legend>
<div class="level-checkbox">
<input type="checkbox" id="AB3-punkt1" name="AB3-punkt1" onchange="document.twine.checkCheckbox(this)"/> <label for="AB3-punkt1">Algorithmen formulieren und im Quelltext notieren, die eine oder mehrere Anweisungen solange wiederholen, wie eine Ausführungsbedingung gilt..</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB3-punkt2" name="AB3-punkt2" onchange="document.twine.checkCheckbox(this)"/> <label for="AB3-punkt2">als Bedingung alles verwenden, was wahr oder falsch sein kann. Du weißt, dass ein Fragebefehl wie istVorneFrei(), dessen Ja/Nein-Antwort die Wiederholung steuert gut dafür geeignet ist.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB3-punkt3" name="AB3-punkt3" onchange="document.twine.checkCheckbox(this)"/> <label for="AB3-punkt3">mit dem Schlüsselwort <span class="method-call">while</span> umgehen und bist mit der nötigen Syntax im **Schleifenkopf** und **Schleifenrumpf** vertraut .</label>
<iframe src="https://drive.google.com/file/d/1_f2VqKiYaAQO6K_79EDhNB4JFHSQJNFg/preview" width="400" height="200"></iframe>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB3-punkt4" name="AB3-punkt4" onchange="document.twine.checkCheckbox(this)"/> <label for="AB3-punkt4">die Ausführungsbedingung im Laufe der Wiederholungen einmal falsch werden muss, damit es keine Endlosschleife gibt.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB3-punkt5" name="AB3-punkt5" onchange="document.twine.checkCheckbox(this)"/> <label for="AB3-punkt5">falls es dennoch mal eine Endlosschleife gibt, man diese mit dem Reset-Knopf unten rechts unterbrechen kann.</label>
</div>
</fieldset>
<span id="link" style="display: none;">
<div> Gut gemacht =) Du hast nun das vierte Level erreicht. Möchtest du direkt dorthin springen, benötigst du das folgende Codewort:
<center>**schleifenMeister**</center>
</div>
[[Weiter -> Beförderung]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>Versuche zunächst, nur die oberste Reihe Flammen zu löschen und danach wieder nach rechts zur Wand zu laufen. Drehe den Roboter wieder so, dass er nach unten blickt (Ausgangsstellung).
[[Zurück -> Abschlussaufgabe AB3]]Welche der benutzen Befehle müssen wiederholt werden, damit der Roboter die nächste Zeile löscht? Wiederhole diese mit einer While-Schleife, solange das Protal noch nicht erreicht ist (warum erreicht man es automatisch?).
[[Zurück -> Abschlussaufgabe AB3]]## Einleitung Einsatz 4:
{
<figure>
<iframe src="https://drive.google.com/file/d/1G6gAMKz5QyBu37ZWbCjqpxgUHRkzFwkP/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Stable Diffusion, Prompt: A water color painting of a nuclear power station under the earth with working robots </figcaption></figure>
<!-- Set the text to show -->
(set: $typewriterText to "Einlasskontrollen: Bisher hatten Sie Glück. Die Mitarbeiter konnten die Wege recht genau beschreiben. Der Roboter wusste immer, was zu tun ist. So ist das aber nicht immer.
Manche Türen gehen von allein auf. Andere müssen mit einem Schlüssel aufgeschlossen werden. Oder es ist gar eine Strombarriere im Weg, die durch einen Schalter deaktiviert werden muss. Gänge knicken unvorhergesehen nach links oder rechts ab. Da muss der Roboter selbstständig Entscheidungen treffen können.
Sie müssen also Alternativen in Handlungen erkennen und als FALLS-DANN-SONST-Entscheidungen formulieren und in Programmiersprache umsetzen können.")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Input Verzweigungen]]
</div>
(stop:)
]
]
}
}
[[Überspringen -> Input Verzweigungen]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><!-- Set the text to show -->
(set: $typewriterText to "Herzlichen Glückwunsch! Nach deinen bisherigen Leistungen und deinem unermüdlichen Einsatz für die Sicherheit von Kernkraftwerken sind sie hiermit befördert.
Ab sofort sind sie nicht mehr der/die Programmierer*in im Hintergrund, sondern der/die Chef*in der Rescue-Robo Firma! Mit dieser Verantwortung werden sie nun die Zukunft der Robo-Rettungstechnik gestalten. Möge ihre Vision und Führung die Welt zu einem sichereren Ort machen!")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 60ms seconds per loop -->
(live: 20)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
(stop:)
]
]
}
{
(live: 15s)[
(stop:)
<iframe src="https://drive.google.com/file/d/1Tksa8X-MTkTSVKzINzNvU243IZjo-Al4/preview" width="600" height="300" allow="autoplay"></iframe>
[[Gut gemacht =) Gönnen sie sich ruhig erstmal ein paar Minuten Pause und feiern ihre Beförderung mit einem Kaltgetränk ->Einleitung AB4]]
]
}
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
<script type="text/javascript">
document.twine.checkCheckboxAb4Input1 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB4-Input1').style.color = "#108300";
} else {
$('#SchleifenText2').hide();
document.getElementById('label-AB4-Input1').style.color = "#FD2C4A";
}
}
</script>
### Verzweigungen:
#### Die Roboter treffen Entscheidungen<!-- Set the text to show -->
(set: $typewriterText to "In vielen Situationen sind Anweisungen nur unter bestimmten Bedingungen auszuführen. Um z.B. ein Muster zu invertierten, muss ein Roboter dort, wo eine Schraube liegt, diese aufheben und dort, wo keine liegt, eine ablegen. Dazu muss er prüfen, ob eine Schraube da liegt oder nicht und jeweils passend handeln. Die Prüfung erfolgt in einer Prüfbedingung, die nur wahr oder falsch sein kann. Das ganze geht dann so.........")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
(stop:)
<iframe src="https://drive.google.com/file/d/19tu4fQajc1HeAFCKoB9auPutnOBkDdeK/preview" width="600" height="250" allow="autoplay"></iframe>
<div>
Vorsicht: statt '<span class="method-call">if (Prüfbedingung) then {... </span>' steht nur: '<span class="method-call">if (Prüfbedingung) {... </span>' . Man nennt solche Entscheidungen in der Programmierung auch **Verzweigungen. **</div>
<input type="checkbox" id="AB4-Input1" name="AB4-Input1" onchange="document.twine.checkCheckboxAb4Input1(this)"/><label id="label-AB4-Input1" style="color:#FD2C4A;" for="AB4-Input1">**Ich habe mir die drei Diagramme angeschaut und sie verstanden.**</label>
]
]
}
<span id="link" style="display: none;">
[[Zu den Aufgaben -> Aufgaben AB4-1]]
</span>
[[Überspringen -> Aufgaben AB4-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.checkCheckboxAb4a2 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#Ab4-Aufgabe3').show();
document.getElementById('label-AB4-Aufgabe2').style.color = "#108300";
} else {
$('#Ab4-Aufgabe3').hide();
document.getElementById('label-AB4-Aufgabe2').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAb4a3 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#Ab4-Aufgabe4').show();
document.getElementById('label-AB4-Aufgabe3').style.color = "#108300";
} else {
$('#Ab4-Aufgabe4').hide();
document.getElementById('label-AB4-Aufgabe3').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAb4a4 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#Ab4-Aufgabe5').show();
document.getElementById('label-AB4-Aufgabe4').style.color = "#108300";
} else {
$('#Ab4-Aufgabe5').hide();
document.getElementById('label-AB4-Aufgabe4').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAb4a5 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB4-Aufgabe5').style.color = "#108300";
} else {
$('#link').hide();
document.getElementById('label-AB4-Aufgabe5').style.color = "#FD2C4A";
}
}
</script>
{
## Verzweigungen
###Die Roboter treffen Entscheidungen ...
<!-- Workaround damit der Beginn der Seite angezeigt wird, ansonsten ist das erste Input-Tag fokussiert und es wird dorthin gescrollt -->
<input type="hidden" autofocus="true" />
<!-- Aufgabe 1 -->
<div class="aufgabe"><ol><li>**Invertierer:** Der Roboter links unten steht in einer Reihe mit vielen Schrauben. *(Zur Sicherheit üben wir erst mal wieder mit Schrauben, wer weiß, was der Roboter anstellt...)*. Analysiere die beiden Methoden <span class="method-call">tausche()</span> und <span class="method-call">tauscheUndVor()</span>: <ul>
<li>Wie verhält sich der Roboter, falls er auf einer Schraube steht? </li>
<li>Wie verhält er sich, falls er auf einem leeren Feld steht? </li>
<li>Wozu ist in <span class="method-call">tauscheUndVor()</span> die Entscheidung <span class="method-call">if(istVorneFrei())...</span> verwendet worden?</li>
<li>Wie unterscheidet sich die Form der Entscheidung in den beiden Methoden?</li></ul></li><br>
<!-- Aufgabe 2 -->
<li> Wiederholung der while-Schleife: Jedes Mal, wenn du auf „Reset“ drückst, entsteht eine neue Schraubenreihe. Implementiere eine Methode <span class="method-call">tauscheBisWand()</span>, die in einer while- Schleife so lange tauscheUndVor aufruft, wie die Wand noch nicht erreicht ist. Versichere dich, dass auch direkt vor der Wand getauscht wird.<br><br>
<input type="checkbox" id="AB4-Aufgabe2" name="AB4-Aufgabe2" onchange="document.twine.checkCheckboxAb4a2(this)"/><label id="label-AB4-Aufgabe2" style="color:#FD2C4A;" for="AB4-Aufgabe2">**Der AB4 Roboter kann jetzt die Schraubenreihe invertieren**</label>
</li></ol><br>
</div>
<!-- Aufgabe 3 -->
<div class="aufgabe"><span id="Ab4-Aufgabe3" style="display: none;"><ol start="3"><li>**Fleckenfrei:** Ölflecken schaden den Robotern. Sie verlieren die Haftung auf dem Boden. Dadurch verlieren sie Energie. Der Roboter soll um die Ölflecken herum laufen. Mit <span class="method-call">istVorne("Oelfleck")</span> kann er überprüfen, ob vor ihm ein Ölfleck ist.
<ul><li>Implementiere eine Methode <span class="method-call">umgeheOelfleck()</span>, die den Roboter einen Schritt nach vorne gehen lässt, falls kein Ölfleck vor ihm ist. Ansonsten läuft er um den Ölfleck drumherum. </li>
<li>Erweitere diese Methode so, dass der Roboter bis zur Wand läuft.</li></ul><br>
<input type="checkbox" id="AB4-Aufgabe3" name="AB4-Aufgabe3" onchange="document.twine.checkCheckboxAb4a3(this)"/><label id="label-AB4-Aufgabe3" style="color:#FD2C4A;" for="AB4-Aufgabe3">**Mein Roboter kann Ölflecken umgehen und läuft danach bis zur nächsten Wand**</label></li></ol></span></div><br>
<!-- Aufgabe 4 -->
<span id="Ab4-Aufgabe4" style="display: none;"><div class="aufgabe"><ol start="4"><li>**Schlüssel aufheben:** Schreibe eine Methode <span class="method-call">sammleSchluessel()</span>, die einen Schlüssel aufnimmt, falls der Roboter auf einem steht. Falls nicht, soll er nichts machen. <br><br>
<input type="checkbox" id="AB4-Aufgabe4" name="AB4-Aufgabe4" onchange="document.twine.checkCheckboxAb4a4(this)"/><label id="label-AB4-Aufgabe4" style="color:#FD2C4A;" for="AB4-Aufgabe4">**Ich habe die Methode an den beiden Robotern oben links getestet.**</label>
</li></ol></div></span><br>
<!-- Aufgabe 5 -->
<span id="Ab4-Aufgabe5" style="display: none;"><div class="aufgabe"><ol start="5"><li>**Sesam öffne dich:** Implementiere eine Methode <span class="method-call">oeffneTuer()</span>, die die beiden Roboter oben links aus ihren Gängen heraus führt.
<ul><li>Der Roboter soll einen Schlüssel aufheben, falls er an der Startposition liegt. </li>
<li>Danach soll er drei Schritte vor gehen, und sich nach links drehen. </li>
<li>Falls er vor einem Schloss steht (<span class="method-call">istVorne(''Schloss'')</span>), soll er den Schlüssel benutzen (<span class="method-call">benutze(''Schluessel'')</span>), andernfalls den Schalter benutzen ( <span class="method-call">benutze(''Schalter'')</span>). Dann sollte sich die Tür bzw. die Elektrobarriere öffnen. </li>
<li>Anschließend soll der Roboter zwei Schritte vor gehen, um hinaus zu treten.</li></ul><br>
<input type="checkbox" id="AB4-Aufgabe5" name="AB4-Aufgabe5" onchange="document.twine.checkCheckboxAb4a5(this)"/><label id="label-AB4-Aufgabe5" style="color:#FD2C4A;" for="AB4-Aufgabe5">**Ich habe die Methode an den beiden Robotern oben links getestet.**</label>
</li></ol></div></span><br>
}
<!-- Link zur nächsten Passage --><span id="link" style="display: none;">
[[Weiter -> Aufgaben AB4-2]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script>
document.twine.auflösungab4a7 = function() {
var button = document.getElementById('auflösungButtonAb4a7');
$('#Aufgabe8').show();
}
document.twine.pruefeAb4a8b = function(element){
element.style.color = "white";
if (element.value == "if(sindFerien()){keinWecker();}") {
// Display the hidden link.
$('#Ab4-Aufgabe9').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
$('#Ab4-Aufgabe9').hide();
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
document.twine.checkCheckboxAb4a9 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB4-Aufgabe9').style.color = "#108300";
} else {
$('#link').hide();
document.getElementById('label-AB4-Aufgabe9').style.color = "#FD2C4A";
}
}
</script>
## Verzweigungen
###Die Roboter treffen Entscheidungen ...
<!-- Aufgabe 6 -->
<div class="aufgabe"><ol start=6><li>Bearbeite die Übungsaufgabe zum Thema Syntax und Schreibfehler:
<iframe src="https://jwalther.hopp-its.de/wp-admin/admin-ajax.php?action=h5p_embed&id=2" width="1198" height="421" frameborder="0" allowfullscreen="allowfullscreen" title="RR_AB4_A6"></iframe><script src="https://jwalther.hopp-its.de/wp-content/plugins/h5p/h5p-php-library/js/h5p-resizer.js" charset="UTF-8"></script>
</li>
<!-- Aufgabe 7 -->
<li>Zeichne für jeden der vier AB4-Roboter ein, wie sie sich be- wegen, wenn sie diese Anweisungen ausführen. Mache dazu ein Screenshot von dem untenstehenden Bild und kopiere es in das Dokument indem du die Ergebnisse der ReaktorRoboter Einheit festhältst. Dort solltest du in der Lage sein, das Bild entsprechend zu bearbeiten. Halte auch fest, in welche Richtung die Roboter nach Ausführung der Anweisungen schauen.
<iframe src="https://drive.google.com/file/d/1Q2MQcO417MqJsXNvcgHQ9zq5DOArSUjW/preview" width="600" height="250" allow="autoplay"></iframe>
<button id="auflösungButtonAb4a7" onclick="document.twine.auflösungab4a7()">Auflösung anzeigen</button>
</li></ol></div>
<!-- Auflösung & Aufgabe 8 --><span id="Aufgabe8" style="display: none;"><div class="aufgabe"><center>Nach Ausführung der Anweisungen stehen die Roboter so:</center>
<iframe src="https://drive.google.com/file/d/1K3Gvb4VQ5PsYZRf0L0omXaz1mGcXdAXM/preview" width="600" height="250" allow="autoplay"></iframe>
<ol start="8"> <li> Aufgabe:<ol type="a">
<li>Notiere zwei Bewegungsbefehle, die ein Roboter ausführen kann und zwei Fragebefehle, die er beantworten kann.
</li><li><iframe src="https://learningapps.org/watch?v=pmdfxot3n23" style="border:0px;width:100%;height:500px" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true"></iframe>
</li></ol>
Gib das Lösungswort von Aufgabe 8b ein und drücke dann die Enter-Taste:
<input type="text" onchange="document.twine.pruefeAb4a8b(this)"/>
</li></ol></div></span>
<!-- Aufgabe 9 -->
<span id="Ab4-Aufgabe9" style="display: none;"><div class="aufgabe"><ol start="9"><li>**Labyrinth:** Der Roboter in der Mitte soll sich in einem Gang alleine zurecht finden. Der Gang hat keine Verzweigungen, knickt aber immer wieder nach links oder nach rechts ab. Implementiere eine Methode, die den Roboter bis zur Sackgasse laufen lässt: <ul>
<li>Stelle den Roboter zunächst vor eine Wand. Sorge dafür, dass er sich nach links dreht, falls links frei ist. Falls rechts frei ist, nach rechts. Sonst soll er einfach stehen bleiben. </li>
<li>Erweitere deine Methode, indem du den Roboter an einer beliebigen Stelle vor der Wand starten lässt und dann die Methode <span class="method-call">laufeBisWand()</span> benutzt. </li>
<li>Wozu ist in <span class="method-call">tauscheUndVor()</span> die Entscheidung <span class="method-call">if(istVorneFrei())...</span> verwendet worden?</li>
<li> Lasse diese beiden Schritte solange wiederholen, wie die Sackgasse noch nicht erreicht ist.</li></ul>
*<u>Hinweis:</u> Um eine Sackgasse zu erkennen, benötigst du komplexere Bedingungen (siehe dazu auch Präsentation 2-Ablauf-von-Schleifen.odp und dort die letzte Folie). Du kannst mehrere Bedingungen mit „und“ (in Java &&) bzw. „oder“ (in Java ||) verbinden. So kannst du beispielsweise mit istWandVorne() && istWandLinks() && istWandRechts() überprüfen, ob dein Roboter in einer Sackgasse steht. Das Gegenteil – also „keine Sackgasse“ – erreicht man, indem man die ganze Bedingung einklammert und ein „nicht“ davor setzt.*
<input type="checkbox" id="AB4-Aufgabe9" name="AB4-Aufgabe9" onchange="document.twine.checkCheckboxAb4a9(this)"/><label id="label-AB4-Aufgabe9" style="color:#FD2C4A;" for="AB4-Aufgabe9">**Der AB4 Roboter kann jetzt eigenständig durch das Labyrinth laufen**</label>
</li></div></span>
<!-- Link zur nächsten Passage --><span id="link" style="display: none;">
[[Weiter -> Abschlussaufgabe AB4]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einsatz 4:
###Gelangen Sie in den Kontrollraum und schalten Sie das Kernkraftwerk ab.
<div class="aufgabe">Die Mannschaft hat das Kernkraftwerk fluchtartig verlassen und leider die elementaren Sicherheitsvorkehrungen vernachlässigt.
Sie haben vergessen, das Kernkraftwerk herunterzufahren. Dazu müssen im Kontrollraum
alle Schalter umgelegt werden. Der Kontrollraum befindet sich irgendwo versteckt am Ende eines langen Ganges, der durch drei Türen gesichert ist. Jede Tür ist durch einen Schalter oder ein Schloss direkt links neben der Tür zu bedienen. Hier haben Sie die nötigen Schlüssel. Im Kontrollraum gibt es an der Wand links neben dem Eingang zahlreiche Schaltern. Wie viele es sind und wo genau sie sich befinden, weiß ich nicht. Schalten Sie alle aus, dann haben Sie Ihren Auftrag erfüllt.
</div>
<iframe src="https://drive.google.com/file/d/1eb2Zql6NPLubEYcEpyWlEQ8GLnphQwAs/preview" width="430" height="310"></iframe>
<div class=aufgabe>
[[Tipps -> Tipp1 Abschluss AB4]]
</div>
[[Das Portal wurde erreicht -> Abschluss AB4]]
<ul><li>Nutze die Labyrinth-Methode aus Aufgabe 9, um zu der Tür 1 zu gelangen. Öffne diese.</li>
<li> Es sind genau drei Türen. Daher kannst du die Befehle einfach 3x kopieren.</li>
<li>Die letzte Tür ist immer genau vor dem Eingang in den Raum. Da reicht ein <span class="method-call">einsVor()</span>-Befehl.</li>
<li>Für die Schalter brauchst du wieder eine Schleife, da nicht klar ist, wie breit die Wand ist.</li>
[[Zurück -> Abschlussaufgabe AB4]]<script type="text/javascript">
document.twine.checkCheckbox = function() {
var checkboxes = document.querySelectorAll('input[type="checkbox"][id^="AB4-punkt"]');
var allChecked = true;
checkboxes.forEach(function(checkbox) {
if (!checkbox.checked) {
allChecked = false;
}
});
if (allChecked) {
$('#link').show();
} else {
$('#link').hide();
}
}
</script>
<h2>Zusammenfassung Level 4</h2>
<fieldset class="level-fieldset"><legend>You are awesome, because...</legend>
<div class="level-checkbox">
<input type="checkbox" id="AB4-punkt1" name="AB4-punkt1" onchange="document.twine.checkCheckbox(this)"/> <label for="AB4-punkt1">Du kannst Verzweigungen in Algorithmen nutzen, im Quelltext erkennen und formulieren.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB4-punkt2" name="AB4-punkt2" onchange="document.twine.checkCheckbox(this)"/> <label for="AB4-punkt2">Du kennst die Schreibweise dieser Entscheidungs-Anweisung mit dem Schlüsselwort if und der Prüfbedingung im runden Klammerpaar dahinter. Manchmal ist im SONST-Fall nichts zu tun. Dann entfällt <span class="method-call">else{...}</span></label>
<iframe src="https://drive.google.com/file/d/1XVVi_w80PPGNvGnLiXaXciYYzDP0SIJJ/preview" width="400" height="200"></iframe>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB4-punkt3" name="AB4-punkt3" onchange="document.twine.checkCheckbox(this)"/> <label for="AB4-punkt3">Du kannst die Antworten der Ja/Nein-Abfragen wie <span class="method-call">istVorneFrei()</span> als Prüfbedingung in einer Entscheidung nutzen, auch in ihrer negierten Form wie bei: <span class="method-call">if (!istVorneFrei()) {...}</span>. Dies wird gelesen als: „Falls NICHT vorne frei ist...“ oder „Falls vorne frei falsch ist...“ oder „Falls vorne nicht frei ist...“. Die Verneinung NICHT wird durch das Ausrufezeichen ! geschrieben.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB4-punkt4" name="AB4-punkt4" onchange="document.twine.checkCheckbox(this)"/> <label for="AB4-punkt4">Du weißt, dass die Begriffe **Verzweigung**, **Entscheidungsanweisung** und auch **Alternative** gleichwertig genutzt werden.</label>
</div>
</fieldset>
<span id="link" style="display: none;">
<div> Gut gemacht =) Du hast nun das fünfte Level erreicht. Möchtest du direkt dorthin springen, benötigst du das folgende Codewort:
<center>**verzweigungsProfi**</center>
</div>
[[Weiter ->Einleitung AB5]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einleitung Einsatz 5:
{
<figure>
<iframe src="https://drive.google.com/file/d/1tiKFMeUgATtRszm-qFZ6J7n3NawEFf6F/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Dall-E, Prompt: An pencil and water color painting of a research center under the earth with working robots </figcaption></figure>
<!-- Set the text to show -->
(set: $typewriterText to "Puh, das war knapp! Gut, dass die Roboter schon recht selbständig Ihren Weg finden. Der kommende Einsatz wird ein wenig ''anstrengender''. Ein Upgrade wird benötigt ...
Unsere Roboter haben nur eine beschränkte Anzahl von Methoden, die die Umwelt des Roboters wahrnehmen (z.B. istVorneFrei(), istVorne(''Schraube'')). Für die zukünftigen Aufgaben werden aber komplexere Sensoren benötigt.
Damit wir sie weiter beschäftigen können, müssen sie lernen Methoden mit boolschen Rückgabewerten zu erstellen.")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Aufgaben AB5-1]]
</div>
(stop:)
]
]
}
}
[[Überspringen -> Aufgaben AB5-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div> <script type="text/javascript">
document.twine.updateAb5A1_1 = function(element){
element.style.color = "white";
document.twine.ab5A1bool_one = element.value;
if (document.twine.ab5A1bool_one === "true" || document.twine.ab5A1bool_one === "false") {
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
if ((document.twine.ab5A1bool_one === "true" && document.twine.ab5A1bool_two === "false") ||
(document.twine.ab5A1bool_two === "true" && document.twine.ab5A1bool_one === "false")) {
// Display the hidden link.
$('#Ab5Aufgabe1b').show();
$('#Ab5Aufgabe2').show();
}
}
document.twine.updateAb5A1_2 = function(element){
element.style.color = "white";
document.twine.ab5A1bool_two = element.value;
if (document.twine.ab5A1bool_two === "true" || document.twine.ab5A1bool_two === "false") {
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
if ((document.twine.ab5A1bool_one === "true" && document.twine.ab5A1bool_two === "false") ||
(document.twine.ab5A1bool_two === "true" && document.twine.ab5A1bool_one === "false")) {
// Display the hidden link.
$('#Ab5Aufgabe1b').show();
$('#Ab5Aufgabe2').show();
}
}
document.twine.updateAb5a2 = function(element){
element.style.color = "white";
if (element.value.toLowerCase() === "return") {
// Display the hidden link.
$('#Ab5Input1').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
</script>
{
<!-- Workaround damit der Beginn der Seite angezeigt wird, ansonsten ist das erste Input-Tag fokussiert und es wird dorthin gescrollt -->
<input type="hidden" autofocus="true" />
## Übungen und Unterklassen
###Neue Sensoren ...
Die Roboter aus dem ersten Übungsblatt hatten Sensoren wie <span class="method-call">aufSchraube()</span>, die die darauffolgenden Roboter nicht mehr hatten, da man das Gleiche auch mit <span class="method-call">aufGegenstand(''Schraube'')</span> erreichen kann. Trotzdem kann es sinnvoll sein, aus den vorhandenen Sensoren neue zu erschaffen. Schauen dir dazu die Methode <span class="method-call">istFassVorne()</span> des AB5-Roboters an. Im Gegensatz zu den Methoden, die du bisher implementiert hast, gibt diese eine Antwort zurück.
<!-- Aufgabe 1 --><div class="aufgabe">
<ol> <li> Aufgabe:<ol type="a">
<li>Teste die Methode <span class="method-call">istFassVorne()</span> in Greenfoot. Wie beantwortet ein Roboter diese Anfrage? Welche Antwortmöglichkeiten gibt es?<br>
Mögliche Antwort 1: <br>
<input type="text" onchange="document.twine.updateAb5A1_1(this)" /> <br>
Mögliche Antwort 2: <br>
<input type="text" onchange="document.twine.updateAb5A1_2(this)" /> <br>
</li><span id="Ab5Aufgabe1b" style="display: none;"> <li>Ein Roboter erkennt ein Atommüllfass (noch) nicht als Fass. Teste dies an dem Roboter vor dem gelben Fass.
</li></span></ol>
</li>
</ol></div>
<!-- Aufgabe 2 -->
<span id="Ab5Aufgabe2" style="display: none;"> <div class="aufgabe">
<ol start="2"><li>Analysiere nun den Quelltext zur Methode <span class="method-call">istFassVorne()</span>:
Wo tauchen die Antwortmöglichkeiten (true und false) im Quelltext auf? Welcher Befehl sorgt dafür, dass überhaupt eine Antwort zurückgegeben wird? <br>
<input type="text" onchange="document.twine.updateAb5a2(this)" /></li>
</ol></div></span><br>
<!-- Input -->
<span id="Ab5Input1" style="display: none;"> <div>
Alle bisherigen Methoden wurden mit <span class="method-call">public void methodenName() {...}</span> programmiert. **Void** steht dabei für leer/nichts. Void steht an der Stelle, an der der sogenannte **Rückgabetyp** steht. Es wird also nichts zurückgegeben. Möchte man nun mit true/false antworten, muss man den Rückgabetyp als <a href="https://de.wikipedia.org/wiki/Boolesche_Algebra" target="_blank">boolean</a> deklarieren:
<iframe src="https://drive.google.com/file/d/1Uw5xjk8wDorHimVwAndQ4uppmMIExNFv/preview" width="700" height="300" allow="autoplay"></iframe>
Mit <span class="method-call">return true/false;</span> kann man dann den gewünschten Wert zurückgeben. **Return beendet außerdem das Unterprogramm. Es werden also keine Befehle mehr nach dem Ausführen eines Return ausgeführt.**
</div>
}
<!-- Link zur nächsten Passage -->
[[Weiter -> Aufgaben AB5-2]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>Nach George Boole, der sich mit dem mathematischen Teilbereich Logik beschäftigt hat. Die Logik beschäftigt sich u.A. mit Aussagen, die nur die Wahrheitswerte wahr oder falsch annehmen können.
<a href="https://de.wikipedia.org/wiki/Boolesche_Algebra" target="_blank">Hier</a> kannst du mehr über die Boolesche Algebra nachlesen.
[[Zurück -> Aufgaben AB5-1]]<script type="text/javascript">
document.twine.update_AB5_A3 = function(element){
element.style.color = "white";
if (element.value.toLowerCase() === "rückgabewert") {
// Display the hidden link.
$('#Ab5-Aufgabe4').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
document.twine.checkCheckboxAb5a4 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#Ab5-Aufgabe5-6').show();
document.getElementById('label-AB5-Aufgabe4').style.color = "#108300";
} else {
$('#Ab5-Aufgabe5-6').hide();
document.getElementById('label-AB5-Aufgabe4').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAb5a5_6 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB5-Aufgabe5-6').style.color = "#108300";
} else {
$('#link').hide();
document.getElementById('label-AB5-Aufgabe5-6').style.color = "#FD2C4A";
}
}
</script>
{
<!-- Workaround damit der Beginn der Seite angezeigt wird, ansonsten ist das erste Input-Tag fokussiert und es wird dorthin gescrollt -->
<input type="hidden" autofocus="true" />
## Übungen und Unterklassen
###Neue Sensoren ...
<!-- Aufgabe 3 --><div class="aufgabe">
<ol start="3"> <li>Bearbeite die folgende interaktive Übungsaufgabe.<br>
<iframe src="https://jwalther.hopp-its.de/wp-admin/admin-ajax.php?action=h5p_embed&id=1" width="958" height="492" frameborder="0" allowfullscreen="allowfullscreen" title="RR_AB5_A3"></iframe><script src="https://jwalther.hopp-its.de/wp-content/plugins/h5p/h5p-php-library/js/h5p-resizer.js" charset="UTF-8"></script><br>
Gib das Lösungswort ein und drücke dann die Enter-Taste. Du erhältst das Lösungswort wenn du alle Fragen in der Übungsaufgabe richtig beantwortest.<br>
<input type="text" onchange="document.twine.update_AB5_A3(this)" />
</li></ol></div>
<!-- Aufgabe 4 -->
<span id="Ab5-Aufgabe4" style="display: none;"> <div class="aufgabe">
<ol start="4"><li>**Rückspiegel:** Vervollständige die Methode <span class="method-call">istFassHinten()</span>. Diese soll testen, ob hinter dem Roboter ein Fass steht. Dazu muss er sich natürlich kurzfristig umdrehen. Am Ende soll er aber wieder so stehen wie am Anfang.<br>
<input type="checkbox" id="AB5-Aufgabe4" name="AB5-Aufgabe4" onchange="document.twine.checkCheckboxAb5a4(this)"/><label id="label-AB5-Aufgabe4" style="color:#FD2C4A;" for="AB5-Aufgabe4">**Der AB5 Roboter kann jetzt überprüfen ob hinter ihm ein Fass steht**</label>
</li></ol></div></span><br>
<!-- Aufgabe 5 & 6-->
<span id="Ab5-Aufgabe5-6" style="display: none;"> <div class="aufgabe">
<ol start="5"><li>**Out of Power:** Implementiere eine Methode <span class="method-call">istEnergieSchwach()</span>. Diese soll **true** zurückgeben, falls der Roboter nur noch weniger als 20 Energiepunkte hat (Überprüfung mit *getEnergie()<20*). Ansonsten gibt sie false zurück.
Teste deine Methode an den drei Robotern im Raum unten links. Welcher der Drei Roboter hat einen Schwachen Ladezustand?</li>
<li>**Heavy Duty:** Implementiere eine Methode <span class="method-call">istSchwerBeladen()</span>, die testet, ob der Roboter fünf oder mehr Gegenstände herumträgt (benutze <span class="method-call">getAnzahl()</span>). Teste deine Methode an verschiedenen Robotern.</li>
</ol><br>
<input type="checkbox" id="AB5-Aufgabe5-6" name="AB5-Aufgabe5-6" onchange="document.twine.checkCheckboxAb5a5_6(this)"/><label id="label-AB5-Aufgabe5-6" style="color:#FD2C4A;" for="AB5-Aufgabe5-6">**Der AB5 Roboter kann nun überprüfen ob seine Energie schwach ist und ob er schwer beladen ist**</label></div></span><br>
}
<!-- Link zur nächsten Passage --><span id="link" style="display: none;">
[[Fässer schieben -> Aufgaben AB5-3]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
<script type="text/javascript">
document.twine.checkCheckboxAb5a8 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB5-Aufgabe8').style.color = "#108300";
} else {
$('#link').hide();
document.getElementById('label-AB5-Aufgabe8').style.color = "#FD2C4A";
}
}
</script>
{
<!-- Workaround damit der Beginn der Seite angezeigt wird, ansonsten ist das erste Input-Tag fokussiert und es wird dorthin gescrollt -->
<input type="hidden" autofocus="true" />
### Fässer schieben
<div> Fässer kann man schieben. Aber nur, wenn vor dem Fass Platz ist. Daher ist es hilfreich zu wissen, ob vor dem Fass frei ist oder nicht. Probiere die Methode <span class="method-call">einsVor()</span>, wenn der Roboter vor einem Fass steht.</div><br>
<!-- Aufgabe 7 --><div class="aufgabe">
<ol start="7"> <li>**Look Ahead:** Implementiere eine Methode <span class="method-call">istVorFassFrei()</span>. Diese soll false zurückgeben, falls vor dem Fass eine Wand ist. Dabei können die folgenden Fälle auftreten:<br>
<iframe src="https://drive.google.com/file/d/1ivjD3p0mkWDO0z0YbNMz0ylsGLuXTwq_/preview" width="600" height="200" allow="autoplay"></iframe>
Der Roboter muss rechts um das Fass herumlaufen (dort ist immer Platz) und nachschauen, ob vor dem Fass frei ist. Falls ja, gibt er true zurück, sonst false.
Trifft er schon vorher auf die Wand (Fall 1), dann gibt er auch false zurück.
In allen Fällen ist er am Ende wieder an seinen Ausgangspunkt.</li><br>
<!-- Aufgabe 8 -->
<li>**Aufräumen:** Implementiere eine Methode <span class="method-call">schiebeFassBisWand()</span>, die ein Fass bis zur nächsten Wand schiebt. Teste deine Methode an dem Roboter unten rechts.
*<u>Hinweis:</u> Da man <span class="method-call">istVorFassFrei()</span> als Bedingung für eine while-Schleife verwenden kann, ist der Quelltext dieser Methode nur 3 Zeilen lang. Der Roboter rennt dann aber ganz schön wild durch die Gegend.*
</li></ol><br>
<input type="checkbox" id="AB5-Aufgabe5-6" name="AB5-Aufgabe5-6" onchange="document.twine.checkCheckboxAb5a8(this)"/><label id="label-AB5-Aufgabe8" style="color:#FD2C4A;" for="AB5-Aufgabe8">**Der AB5 Roboter kann kann jetzt Fässer bis zu einer Wand schieben.**</label></div>
}
<!-- Link zur nächsten Passage --><span id="link" style="display: none;">
[[Logik-Operatoren -> Aufgaben AB5-4]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.update_AB5_logikOperatoren = function(element){
element.style.color = "white";
if (element.value.toLowerCase() === "wahrheitstabelle") {
// Display the hidden link.
$('#Ab5-Aufgabe9').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
</script>
<script type="text/javascript">
document.twine.checkCheckboxAb5a9 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB5-Aufgabe9').style.color = "#108300";
} else {
$('#link').hide();
document.getElementById('label-AB5-Aufgabe9').style.color = "#FD2C4A";
}
}
</script>
### logische Operatoren
Geschickt ist es auch, wenn man zwei Sensoren A und B miteinander verbindet. In Java gibt es dazu die Operatoren
<center>
<table>
<tr>
<td>A || B</td>
<td>A oder B</td>
</tr>
<tr>
<td>A && B</td>
<td>A und B</td>
</tr>
<tr>
<td>!(A)</td>
<td>nicht A</td>
</tr>
</table>
</center>
Man kann also beispielsweise mit
<span class="method-call">(!(istWandVorne()) && !(istWandLinks()) && !(istWandRechts()))</span>
testen, ob in allen drei Richtung keine Wand ist.
</li></ol></div>
Löse nun das folgende Memory. Zwei der Kacheln gehören immer zusammen. Wenn du es dir nicht selbst erschließen kannst, google mal nach dem Begriff "Wahrheitstabelle".:
<iframe src="https://jwalther.hopp-its.de/wp-admin/admin-ajax.php?action=h5p_embed&id=3" width="1198" height="997" frameborder="0" allowfullscreen="allowfullscreen" title="Zuordnung Wahrheitstabellen"></iframe><script src="https://jwalther.hopp-its.de/wp-content/plugins/h5p/h5p-php-library/js/h5p-resizer.js" charset="UTF-8"></script>
Gib das Lösungswort ein und drücke dann die Enter-Taste. Du erhältst das Lösungswort wenn du das obige Memory gelöst hast.
<input type="text" onchange="document.twine.update_AB5_logikOperatoren(this)" />
<!-- Aufgabe 9 -->
<span id="Ab5-Aufgabe9" style="display: none;"> <div class="aufgabe">
<ol start="9"><li>**Führerschein:** Implementiere eine Methode <span class="method-call">istKreuzung()</span>, die testet, ob der Roboter auf einer Kreuzung steht, d.h. ob vorne, links und rechts frei ist.
Implementiere eine Methode <span class="method-call">geheBisKreuzung()</span> und teste sie am Roboter oben links.
<input type="checkbox" id="AB5-Aufgabe9" name="AB5-Aufgabe9" onchange="document.twine.checkCheckboxAb5a9(this)"/><label id="label-AB5-Aufgabe9" style="color:#FD2C4A;" for="AB5-Aufgabe9">**Der AB5 Robo kann jetzt bis zu einer Kreuzung laufen und wartet dann dort.**</label>
</li></ol></div></span>
<!-- Link zur nächsten Passage --><span id="link" style="display: none;">
[[... -> Aufgaben AB5-5]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.checkCheckboxAb5a12 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB5-Aufgabe8').style.color = "#108300";
} else {
$('#link').hide();
document.getElementById('label-AB5-Aufgabe8').style.color = "#FD2C4A";
}
}
</script>
### ... schon wieder Fässer schieben
<!-- Aufgabe 10 --><div class="aufgabe">
<ol start="10"> <li>**Upgrade 1: **Erweitere die Methode <span class="method-call">istFassVorne()</span> so, dass nicht nur die Übungsfässer erkannt werden, sondern auch Atommüllfässer (benutze dazu <span class="method-call">istVorne(**"Atommuell"**)</span>). Teste deine Methode an den beiden Robotern im rechten Raum.</li>
<li>**Upgrade 2:** Erweitere die Methode <span class="method-call">istVorFassFrei()</span> so, dass nicht nur Wände erkannt werden, die vor dem Fass sind, sondern auch andere Fässer (normale und Atommüll). Jetzt müsste <span class="method-call">schiebeFassBisWand()</span> auch für den Roboter rechts oben funktionieren.
</li>
<li>**Aufräumen:** Implementiere eine Methode, die den Roboter rechts unten das Fass auf das gelbe Feld in der Ecke schieben lässt. Verwende einen sinnvollen Methodennamen.</li></ol>
<input type="checkbox" id="AB5-Aufgabe12" name="AB5-Aufgabe12" onchange="document.twine.checkCheckboxAb5a12(this)"/><label id="label-AB5-Aufgabe12" style="color:#FD2C4A;" for="AB5-Aufgabe12">**Der AB5 Roboter kann kann jetzt alle Sorten Fässer verräumen.**</label></div>
<!-- Link zur nächsten Passage --><span id="link" style="display: none;">
[[Weiter -> Geschichte AB 5]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einsatz 5
(set: $typewriterText to "Nachdem Sie ihren Roboter nun fein säuberlich aufgemotzt haben, könnten sie mal ihren Arbeitsplatz wieder aufräumen.
Doch genau in dem Moment klingelt das Notruftelefon. ''Hallo? Rescue-Robo-Firma? Das Atommüllzwischenlager ist voller herumliegender Fässer! Wir brauchen eure Hilfe!''
Und du weißt...
Mit deinen High-Tech-Robotern, die jetzt noch besser aufräumen können als du selbst, ist das der perfekte Einsatz!")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Abschlussaufgabe AB5]]
</div>
(stop:)
]
]
}
[[Überspringen -> Abschlussaufgabe AB5]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einsatz 5:
###Schaffen Sie Ordnung im Atommüllzwischenlager
<div class="aufgabe">Die Arbeiter haben die Atommüllfässer einfach willkürlich in die zwei Räume gestellt. Der Eingang zu den Räumen ist an der Kreuzung. Geht man geradeaus weiter, liegt dort eine Reihe von Akkus. Im Raum links stehen zwei Fässer.
</div>
<iframe src="https://drive.google.com/file/d/1gOGkGsLAWhpF8B_2I111cZ5MT-URWW6T/preview" width="500" height="500"></iframe>
<div class=aufgabe> Wir wissen nicht genau, wie viele Fässer im anderen Raum stehen. Die Fässer können an den mit den Pfeilen gekennzeichneten Stellen stehen. Sorgen Sie für Ordnung. Schieben Sie dazu die Fässer in die gekennzeichneten gelben Bereiche.
[[Tipp 1 -> Tipp1 Abschluss AB5]]
[[Tipp 2 -> Tipp2 Abschluss AB5]]
</div>
[[Endlich wieder Ordnung -> Abschluss AB5]]
### Tipp 1:
Kopieren Sie die Methode <span class="method-call">laufeBisWand()</span> von AB3. Sie kann ihnen gute Dienste leisten.
[[Zurück -> Abschlussaufgabe AB5]]### Tipp 2:
Bauemn Sie in die Methode <span class="method-call">istVorFassFrei()</span> eine Energiekontrolle ein, da sonst die Energie ausgehen kann.
Testen Sie dazu am Anfang der Methode mit <span class="method-call">istEnergieSchwach()</span>, ob der Roboter mit <span class="method-call">benutze(''Akku'')</span> aufgeladen werden muss.
[[Zurück -> Abschlussaufgabe AB5]]<script type="text/javascript">
document.twine.checkCheckbox = function() {
var checkboxes = document.querySelectorAll('input[type="checkbox"][id^="AB5-punkt"]');
var allChecked = true;
checkboxes.forEach(function(checkbox) {
if (!checkbox.checked) {
allChecked = false;
}
});
if (allChecked) {
$('#link').show();
} else {
$('#link').hide();
}
}
</script>
<h2>Zusammenfassung Level 5</h2>
<fieldset class="level-fieldset"><legend>Du kannst jetzt...</legend>
<div class="level-checkbox">
<input type="checkbox" id="AB5-punkt1" name="AB5-punkt1" onchange="document.twine.checkCheckbox(this)"/> <label for="AB5-punkt1">eigene Methoden mit Rückgabewerten unter Verwendung des Schlüsselwortes **return** implementieren. </label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB5-punkt2" name="AB5-punkt2" onchange="document.twine.checkCheckbox(this)"/> <label for="AB5-punkt2">die **boolschen Operatoren *und*, *oder*, *nicht* **verwenden, um mehrere Bedingungen miteinander zu verknüpfen.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB5-punkt3" name="AB5-punkt3" onchange="document.twine.checkCheckbox(this)"/> <label for="AB5-punkt3">von dir behaupten, dass du über ein gutes Durchhaltevermögen verfügst, da du es bis hierhin geschafft hast =).</label>
</div>
</fieldset>
<span id="link" style="display: none;">
<div> Gut gemacht =) Du hast nun das sechste Level erreicht. Möchtest du direkt dorthin springen, benötigst du das folgende Codewort:
<center>**unterklasseHeld**</center>
</div>
[[Weiter ->Einleitung AB6]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einleitung Einsatz 6:
{
<figure>
<iframe src="https://drive.google.com/file/d/1GJNWIbpcE7qE5nu8vQUX1ucVppYFSF9K/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Stable Diffusion, Prompt: A water color painting of a nuclear power station under the earth with working robots </figcaption></figure>
<!-- Set the text to show -->
(set: $typewriterText to "Ein Notfallprogramm für den Roboter...
Wir haben Millionen in die Hardware des Roboters und unendlich viel Zeit in die Implementierung der Software und seiner Verbesserungen gesteckt. Daher soll der Roboter ein Notfallprogramm bekommen mit dem er jederzeit den Ausgang wiederfinden kann, wenn er sich in einem zerstörten Kraftwerk befindet und der normale Rückweg plötzlich versperrt ist...")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Input AB6-1]]
</div>
(stop:)
]
]
}
}
[[Überspringen -> Input AB6-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>### Die Roboter lernen zu zählen ...
Unser Ziel ist es jetzt **Variablen als Speicher für jeweils einen Wert** zu kennen und einsetzen zu können. Außerdem werden wir Variablen verwenden, um Robotern das Zählen beizubringen.
[[Input zu Variablen-> Input AB6-2]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
### Attribute beschreiben Eigenschaften und Zustände
<div>
Wir sehen die Roboter in ihrer Welt agieren. Wir sehen auch, wie viel Energie sie noch haben. Mit <span class="method-call">getEnergie()</span> können wir das auch abfragen. Dann erhalten wir von ihm eine Zahl als Antwort.
Woher weiß dieser Roboter aber, wie viel Energie er noch hat?
Wie merkt er sich diese Zahl?
Wenn mehrere Roboter auf der Welt herum laufen, dann gibt jeder auf Nachfrage die für ihn richtige Antwort. Jeder Roboter führt darüber Buch. Jeder Roboter hat sein Gedächtnis. Dazu verwendet er eine Variable: energie – **man sagt auch, dass jedes Roboterobjekt eine Eigenschaft/ein Attribut energie hat**.
In dieser Variable merkt er sich die Energie, genauer: den aktuellen Wert der Energie, die ihm verbleibt.
Dieser Wert kann immer nur eine ganze Zahl sein. Man sagt: Der **Typ des Attributs ist integer (engl. für Ganzzahl)**. In Java wird dafür die Kennzeichnung <span class="method-call">int</span> verwendet.
Den Wert kannst du z.B. um 15 verringern, indem du dem Roboter den Befehl gibst:
<ul><li><span class="method-call">verbraucheEnergie(15)</span>: Damit hat er 15 Energiepunkte weniger, egal wie viele es vorher waren (jedoch unterschreitet er 0 Energiepunkte nicht).</li></ul>
Den aktuellen Wert kannst du erfragen, indem du ihm die Anfrage stellst: <ul><li><span class="method-call">getEnergie()</span>: Er wird dir die Restenergie als Antwort nennen. </ul></li>
Die aktuellen Werte aller Attribute bestimmen den **Zustand eines Roboters.**
</div>
[[Zum Variablenquiz-> Quiz Variablen]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.update_variablenQuiz = function(element){
element.style.color = "white";
if (element.value.toLowerCase() == "gedächtnis") {
// Display the hidden link.
$('#link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
</script>
### eigene Attribute
Löse das Kreuzworträtsel und du erhältst das Lösungswort um weiter zu machen
<iframe src="https://learningapps.org/watch?v=pd1mr619j23" style="border:0px;width:100%;height:500px" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true"></iframe>
[[Zurück zum Text -> Input AB6-2]]
Gib hier das Lösungswort ein und drücke dann die Enter-Taste
<input type="text" onchange="document.twine.update_variablenQuiz(this)" />
<span id="link" style="display: none;"> [[Gut gemacht =) Weiter gehts! -> Aufgaben AB6-1]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.checkAufgabenStatusAB6a3 = function() {
if (document.twine.AB6aufgabe3Erreicht) {
// Zeige die Aufgabe 3 an, da die vorherigen bereits erledigt wurden
$('#AB6-Aufgabe3').show();
document.getElementById('label-AB6-Aufgabe2').style.color = "#108300";
document.getElementById('AB6-Aufgabe2').checked = true;
}
}
</script>
<script type="text/javascript">
document.twine.checkCheckboxAb6a2 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#AB6-Aufgabe3').show();
document.getElementById('label-AB6-Aufgabe2').style.color = "#108300";
} else {
$('#AB6-Aufgabe3').hide();
document.getElementById('label-AB6-Aufgabe2').style.color = "#FD2C4A";
}
}
</script>
<script type="text/javascript">
document.twine.updateAB6a3 = function(element){
element.style.color = "white";
if (element.value.toLowerCase() === "50x50") {
// Display the hidden link.
$('#link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
</script>
<script type="text/javascript">
document.twine.checkAufgabenStatusAB6a3();
</script>
### eigene Attribute
<!-- Aufgabe 1 -->
<div style="display: flex; align-items: flex-start;"><div class="aufgabe"><ol><li>Erprobe an zwei Robotern <span class="method-call">verbraucheEnergie(...)</span> bzw. <span class="method-call">getEnergie()</span> und kontrolliere mit **INSPECT** (Rechtsmausklick auf den Roboter → Inspizieren) den Zustand der Energie. Verschiebe ggf. das Inspect-Fenster so, dass es nicht mehr über der Roboterwelt liegt. Rechts siehst du einen Roboter und sein INSPECT- Fenster.</span> </li></ol></div>
<div>
<iframe src="https://drive.google.com/file/d/1u-4J0TcWotksOrHVkCWsBIZzFeF98Hu5/preview" width="300" height="200" allow="autoplay"></iframe></div></div>
<!-- Aufgabe 2 -->
<div class="aufgabe"><ol start="2"><li>Notiere, welche weiteren Eigenschaften des Roboters in Attributen gespeichert sind. Finde mindestens eine Methode, mit der Du den Werte eines ganzzahligen Attribute ändern kannst.
<input type="checkbox" id="AB6-Aufgabe2" name="AB6-Aufgabe2" onchange="document.twine.checkCheckboxAb6a2(this)"/><label id="label-AB6-Aufgabe2" style="color:#FD2C4A;" for="AB6-Aufgabe2">**Ich habe eine weitere Methode gefunden mit der ich ein ganzzahliges Attribut verändern kann.**</label>
</li></ol>
</div><span id="AB6-Aufgabe3" style="display: none;">
<script>
document.twine.AB6aufgabe3Erreicht = true;
</script>
<div> Bei den Integer-Attributen kann man die Werte direkt sehen. Bei komplexeren Attributen (z.B. inventar) wird nur ein Pfeil angezeigt. Die Attribute sind komplexer und nicht mit einer einzelnen Zahl auszudrücken. Programmieren musst du das noch nicht. Aber durch Klicken auf den Pfeil kannst du dir anschauen, was dahinter steckt. Du kannst beispielsweise erkennen, wo der Roboter speichert, wie viele Gegenstände er in seiner Inventarliste hat.</div>
<!-- Aufgabe 3 -->
<div class="aufgabe"> <ol start="3"><li>Lasse dir durch einen Klick auf den Pfeil hinter inventar anzeigen, wie groß die Inventarliste ist. Versuche herauszufinden, wie groß das Bild (image) eines Roboters ist. Dazu musst du mehreren Pfeilen folgen.</li>
Gib hier die Größe des Bildes ein im Format: "*breite***x***höhe*"
<input type="text" onchange="document.twine.updateAB6a3(this)" />
[[Tipp -> Tipp Bildgröße]]
</ol></div>
</span>
<span id="link" style="display: none;"> [[Weiter-> Input AB6-3]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>### Tipp Bildgröße herausfinden
Finde das Attribut *raster*. Folge diesem und du triffst auf die Attribute *width* und *height*. Als Lösungswort sollst du nicht die Anzahl der Gesamtpixel eingeben, sondern so etwas wie *200x130*.
[[Zurück -> Aufgaben AB6-1]]## Variablen Teil 2
<div>
Jede Variable, die die Werte für eine Eigenschaft speichert, kannst du dir als beschriftete Kiste vorstellen. Vorne steht der Name der Variable, damit die Kiste bzw. ihr Speicherplatz wiedergefunden werden kann.
Namen von Variablen beginnen mit einem Kleinbuchstaben. Setzt sich der Name aus mehreren Wörtern zusammen, darf man keine Leerzeichen verwenden, sondern beginnt jedes neue Wort mit einem Großbuchstaben. Das bezeichnet man als Camel- Case.
**In der Kiste gibt es zu jedem Zeitpunkt genau einen aktuell gültigen Wert.**
Mit <span class="method-call">**set**-Methoden</span> (und auch durch andere Methoden) werden neue Werte in die Kiste gebracht.
Mit der <span class="method-call">**get**-Methode</span> nach dem aktuellen Wert gefragt und dieser Wert dann dem Anfragenden als Ergebnis genannt. Dabei verbleibt der Wert unverändert in der Variable. So wie beim Anhören eines Musikstücks auf deinem Smartphone der Musikinhalt ja weiterhin gespeichert bleibt.
Der **Typ der Variable** legt die Größe der Kiste fest. In int-Kisten (32 Bit groß) passen z.B. ganze Zahlen zwischen -2.147.483.648 und +2.147.483.647.
Für größere Zahlen bräuchte man long- Kisten (64 Bit groß). Dort passen Zahlen zwischen -9.223.372.036.854.775.808 und 9.223.372.036.854.775.807 hinein.
<div class="iframe-container">
<iframe src="https://drive.google.com/file/d/1vBc0v5GitOyB9apQtoiw70b74CC5CJ-k/preview" width="600" height="200" allow="autoplay"></iframe>
<p class="iframe-caption">Abb. 1: int und long-Variablen als "Kisten" Quelle: Schaller/Zechnall</p>
</div>
Die Zeichnungen zeigen zwei Variable vom Datentyp <span class="method-call">int</span>. In solche Variable können nur ganze Zahlen (= Integer; daher int) gesteckt werden. Auch wenn die Bilder nur positive Ganzzahlen suggerieren, sind Integer-Zahlen positive und negative Ganzzahlen.
[[Weiter -> Aufgaben AB6-2]]
</div><script type="text/javascript">
document.twine.checkCheckboxAb6a5 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB6-Aufgabe5').style.color = "#108300";
} else {
$('#link').hide();
document.getElementById('label-AB6-Aufgabe5').style.color = "#FD2C4A";
}
}
</script>
## Variablen
Beantworte die folgenden beiden Aufgaben in deinem Dokument indem du die Reaktor Roboter Ergebnisse speicherst.
Die Aufgaben werden dann im Plenum besprochen
<!-- Aufgabe 4--><div class="aufgabe">
<ol start="4"><li><strong>Denk- und Sprechweisen:</strong><ol type="a"><li>Wieso kann man sich Variablen als Kisten vorstellen?</li><li>Welche der vier Sprechweisen hältst du für gut? <ol><li>Die Variable anzahl hat den Inhalt 7.</li><li>Die Variable anzahl hat den Wert 7.</li><li>Die Variable anzahl hat 7 Werte.</li><li>anzahl ist 7.</li></ol></li></ol>
</li>
<li><strong>Namensgebung:</strong>
<ol type="a"><li>Schlage sinnvolle Namen für Attribute vor, die speichern<ol><li>wie viele Akkus der Roboter besitzt.</li><li>wie viele Akkus der Roboter schon eingesetzt hat.</li><li>wie viele Drehungen er gemacht hat. (Was genau gibt die gespeicherte Zahl dann an? Wie werden Links- bzw. Rechtsdrehungen gespeichert?)</li><li>wie viele Brennstäbe er schon gefunden hat.</li></ol></li></ol></li></ol></div>
<input type="checkbox" id="AB6-Aufgabe5" name="AB6-Aufgabe5" onchange="document.twine.checkCheckboxAb6a5(this)"/><label id="label-AB6-Aufgabe5" style="color:#FD2C4A;" for="AB6-Aufgabe5">**Erledigt.**</label>
<span id="link" style="display: none;"> [[Weiter-> Input AB6-4]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.update_AB6eigeneAttribute = function(element){
element.style.color = "white";
if (element.value.toLowerCase() === "deklaration") {
// Display the hidden link.
$('#link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
$('#hide').show();
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
</script>
##Eigene Attribute
<div>
Schaue dir die Folien in der Präsentation an und löse den Lückentext auf der letzten Folie!
</div>
<iframe src="https://jwalther.hopp-its.de/wp-admin/admin-ajax.php?action=h5p_embed&id=4" width="100%" height="auto" frameborder="0" allowfullscreen="allowfullscreen" title="Erstellung neuer Attribute"></iframe><script src="https://jwalther.hopp-its.de/wp-content/plugins/h5p/h5p-php-library/js/h5p-resizer.js" charset="UTF-8"></script>
Gib das Lösungswort ein und drücke dann die Enter Taste:
<input type="text" onchange="document.twine.update_AB6eigeneAttribute(this)" />
<!-- Link zur nächsten Passage --><span id="link" style="display: none;">
[[Weiter -> Aufgaben AB6-3]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div
<script type="text/javascript">
document.twine.checkCheckboxAb6a7 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#Ab6-Aufgabe8').show();
document.getElementById('label-AB6-Aufgabe7').style.color = "#108300";
} else {
$('#Ab6-Aufgabe8').hide();
document.getElementById('label-AB6-Aufgabe7').style.color = "#FD2C4A";
}
}
</script>
<script type="text/javascript">
document.twine.checkCheckboxAb6a8 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB6-Aufgabe8').style.color = "#108300";
} else {
$('#link').hide();
document.getElementById('label-AB6-Aufgabe8').style.color = "#FD2C4A";
}
}
</script>
## eigene Attribute
<!-- Aufgabe 6-7 --><div class="aufgabe">
<ol start="6"> <li>Überprüfe im INSPECT-Fenster, ob der Roboter ordentlich seine Schritte zählt.</li>
<!-- Aufgabe 7 -->
<li>**Schrittezähler:** Implementiere eine Methode <span class="method-call">bisWandMitZaehlen()</span> unter Verwendung <span class="method-call">von einsVorMitZaehlen()</span>, die den Roboter bis zur Wand laufen lässt und dabei die Schritte zählt.
<input type="checkbox" id="AB6-Aufgabe7" name="AB6-Aufgabe7" onchange="document.twine.checkCheckboxAb6a7(this)"/><label id="label-AB6-Aufgabe7" style="color:#FD2C4A;" for="AB6-Aufgabe7">**Der AB6 Roboter kann kann jetzt seine Schritte bis zu einer Wand zählen.**</label></li></ol></div>
<!-- Aufgabe 8-->
<span id="Ab6-Aufgabe8" style="display: none;"> <div class="aufgabe">
<ol start="8"><li>**Drehzähler:** Führe ein neues Attribut *drehungen* ein (deklariere und initialisiere das Attribut). Dieses soll bei jeder Rechtsdrehung um eins erhöht und bei jeder Linksdrehung um 1 erniedrigt werden. Führe dazu die beiden Methoden <span class="method-call">dreheLinksMitZaehlen()</span> und <span class="method-call">dreheRechtsMitZaehlen()</span> ein.
*<u>Hinweis:</u> Um den Wert einer Variablen um 1 zu erhöhen hast du bereits die **++**-Schreibweise kennen gelernt. Analog dazu gibt es auch **--**. Diese Operationen werden Inkrementieren und Dekrementieren genannt. <a href="https://de.wikipedia.org/wiki/Inkrement_und_Dekrement" target="_blank">Hier</a> kannst du mehr zu diesen Operationen nachlesen.*
<input type="checkbox" id="AB6-Aufgabe8" name="AB6-Aufgabe8" onchange="document.twine.checkCheckboxAb6a8(this)"/><label id="label-AB6-Aufgabe8" style="color:#FD2C4A;" for="AB6-Aufgabe8">**Der AB6 Roboter kann kann jetzt seine Drehungen zählen.**</label></li></ol></div>
</li></ol></div></span>
<!-- Link zur nächsten Passage --><span id="link" style="display: none;">
[[Get-Methoden -> Aufgaben AB6-4]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
<script type="text/javascript">
document.twine.checkCheckboxAb6a10 = function(checkbox) {
var allChecked = checkbox.checked;
if (allChecked) {
$('#link').show();
document.getElementById('label-AB6-Aufgabe10').style.color = "#108300";
} else {
$('#link').hide();
document.getElementById('label-AB6-Aufgabe10').style.color = "#FD2C4A";
}
}
</script>
{
<!-- Workaround damit der Beginn der Seite angezeigt wird, ansonsten ist das erste Input-Tag fokussiert und es wird dorthin gescrollt -->
<input type="hidden" autofocus="true" />
## Get-Methoden
<div>
Wie bei den anderen Eigenschaften auch, soll der Roboter auch ohne Inspect-Fenster Auskunft darüber geben können, welchen Wert seine Attribute haben.
Dazu brauchen wir get-Methoden. Im letzten Kapitel hast du Methoden kennengelernt, die mit true oder false antworten. Nun möchten wir mit einer Zahl als Ergebnis antworten. Daher muss der Rückgabetyp der Methode int sein:<br><br>
<center><span class="method-call">public int getSchritte() {...}</span></center><br>
Statt return true oder return false, wollen wir nun den Wert des Attributs zurückgeben. Dazu verwenden wir einfach den Namen des Attributs:<br><br>
<center><span class="method-call">return this.schritte;</span></center><br>
Eine fertige get-Methode für die Schritte sieht dann so aus:<br>
<iframe src="https://drive.google.com/file/d/1VfJfMt4z92Ax2nDKjZdruu_2JP1cjtwC/preview" width="500" height="300"></iframe>
</div><br>
<!-- Aufgabe 9--><div class="aufgabe">
<ol start="9"> <li> **Eine get-Methode:** Verändere die Methode <span class="method-call">getSchritte()</span> im Roboter AB6/AB7, so dass die Methode nicht immer 0 zurück gibt, sondern den Wert des Attributs schritte. Warum kann die Methode dafür nicht lauten: public void ... ?
Warum enthält die Methode <span class="method-call">bisWandMitZaehlen()</span> aus Aufgabe 7 keine Zeile, die mit **return ...** beginnt?</li><br>
<!-- Aufgabe 10 -->
<li>**Deine get-Methode:** Implementiere eine get-Methode für die Anzahl der Drehungen. Teste deine get-Methode.</li></ol><br>
<input type="checkbox" id="AB6-Aufgabe10" name="AB6-Aufgabe10" onchange="document.twine.checkCheckboxAb6a10(this)"/><label id="label-AB6-Aufgabe10" style="color:#FD2C4A;" for="AB6-Aufgabe10">**Der AB6 Roboter kann kann mir durch Aufruf von get-Methoden nun seine gelaufenen Schritte und gemachten Drehungen rückmelden.**</label></div>
}
<!-- Link zur nächsten Passage --><span id="link" style="display: none;">
[[zum Level-Abschluss -> Geschichte AB6 Teil 2]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
## Einsatz 6
### Test des Notfallprogramms
(set: $typewriterText to "Der Roboter wird nicht immer so gut informiert, wie sein Einsatzgebiet aussieht. Unsere hohen Entwicklungskosten sollen nicht verloren gehen, nur weil der Roboter irgendwann mal den Ausgang nicht wiederfindet.
Daher bekommt der Roboter ein Not-Programm, mit dem er in beliebigen Umgebungen den Ausgang (gekennzeichnet durch das Portal) immer wiederfindet, egal wie viele Ecken und Wände im Weg sind.
Geht das wirklich?
Ja, John Pledge, ein 12- jähriger Junge (kein Scherz), hat entdeckt, wie das geht. Wir müssen dazu nur Drehungen zählen können.
Seine Idee war folgendermaßen:
Im Prinzip folgt er permanent einer Wand so, dass seine linke Hand die Wand berührt. Da das aber zu Problemen führt, wenn die linke Hand beispielsweise an einer Säule ist, muss man irgendwann loslassen und geradeaus laufen. Das macht Pledge, wenn er sich genauso oft links wie rechtsrum gedreht hat.
")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Abschlussaufgabe AB6]]
</div>
(stop:)
]
]
}
[[Überspringen -> Abschlussaufgabe AB6]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.checkCheckbox = function() {
var checkboxes = document.querySelectorAll('input[type="checkbox"][id^="AB6-punkt"]');
var allChecked = true;
checkboxes.forEach(function(checkbox) {
if (!checkbox.checked) {
allChecked = false;
}
});
if (allChecked) {
$('#link').show();
} else {
$('#link').hide();
}
}
</script>
<h2>Zusammenfassung Level 6</h2>
<fieldset class="level-fieldset"><legend>Du hast in diesem Level...</legend>
<div class="level-checkbox">
<input type="checkbox" id="AB6-punkt1" name="AB6-punkt1" onchange="document.twine.checkCheckbox(this)"/> <label for="AB6-punkt1">gelernt was **Variablen** sind. </label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB6-punkt2" name="AB6-punkt2" onchange="document.twine.checkCheckbox(this)"/> <label for="AB6-punkt2">erkundet welche **Attribute** der Roboter besitzt, um sich in seiner Welt zurecht zu finden.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB6-punkt3" name="AB6-punkt3" onchange="document.twine.checkCheckbox(this)"/> <label for="AB6-punkt3">neue **Attribute** mittels einer Variablen für die **Roboterklasse** zu erstellen .</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB6-punkt4" name="AB6-punkt4" onchange="document.twine.checkCheckbox(this)"/> <label for="AB6-punkt4">**get-Methoden** zu erstellen, um mit dem Wert eines Attributes arbeiten zu können. </label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB6-punkt5" name="AB6-punkt5" onchange="document.twine.checkCheckbox(this)"/> <label for="AB6-punkt5">gelernt Methoden zu implementieren, die einen **integer**-Wert zurück geben. </label>
</div>
</fieldset>
<span id="link" style="display: none;">
<div> Gut gemacht =) Du hast nun das siebte Level erreicht. Möchtest du direkt dorthin springen, benötigst du das folgende Codewort:
<center>**zählMeister**</center>
</div>
[[Weiter ->Einleitung AB7]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einsatz 6:
###Test des Notprogamms
<div style="display: flex; align-items: flex-start;">
<!-- Text -->
<div class="aufgabe">Implementiere den Pledge-Algorithmus als Not-Programm (Methode <span class="method-call">einsatz6()</span>). Der Roboter wird dann in einer unbekannten Umgebung ausgesetzt und muss das Portal finden.
*<u><strong>Hinweis 1:</strong></u> Im Bild rechts siehst du ein Flussdiagramm des Pledge-Algorithmus. Es besteht aus ein paar Anweisungen, die du gerade implementiert hast und nur aufrufen musst und einigen while-Schleifen und if-Anweisungen.
Überlege dir zunächst, welche der Fragen/Bedingungen zu einer while-Schleife und welche zu einer if-Anweisung gehören. Woran erkennt man den Unterschied?*
</div><div><iframe src="https://drive.google.com/file/d/1RK7SdvoVJbB2xB_-mdSTbB_ucjdBivXk/preview" width="430" height="600"></iframe>
</div></div><div class=aufgabe> *<u><strong>Hinweis 2:</strong></u> Korrigiere die Befehle (wie beispielsweise wandLinks()), falls nötig!*
*<u><strong>Hinweis 3:</strong></u> Wenn dein Programm nicht funktioniert, hast du vermutlich das Flussdiagramm nicht korrekt umgesetzt. Kopiere den Abschnitt deines Quelltextes über die Zwischenablage in das Programm "Flussdiagramme.exe" oder ein vergleichbares. Vergleiche dann deine Version mit dem Original.*
</div>
[[Das Portal wurde erreicht -> Abschluss AB6]]
<script type="text/javascript">
document.twine.sideStoryTschernobyl = function(element){
element.style.color = "white";
document.twine.tschernobyl = element.value;
if (document.twine.tschernobyl.toLowerCase() == "tschernobyl") {
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
if (document.twine.tschernobyl.toLowerCase() === "tschernobyl" && document.twine.fukushima.toLowerCase() === "fukushima") {
// Display the hidden link.
$('#link').show();
}
}
</script>
<script type="text/javascript">
document.twine.sideStoryFukushima = function(element){
element.style.color = "white";
document.twine.fukushima = element.value;
if (document.twine.fukushima.toLowerCase() === "fukushima") {
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
if (document.twine.tschernobyl.toLowerCase() === "tschernobyl" && document.twine.fukushima.toLowerCase() === "fukushima") {
// Display the hidden link.
$('#link').show();
}
}
</script>
## Side Story Einsatz 7:
{
<figure>
<iframe src="https://drive.google.com/file/d/14AdyROLrHYXeYSPhEp0mehp2PjqWfCqI/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Stable Diffusion, Prompt: Tschernobyl after the explosion of the power plant, painting </figcaption></figure>
<!-- Set the text to show -->
(set: $typewriterText to "Du arbeitest jetzt schon eine ganze Weile hier in einem Atomkraftwerk herum und hast alle Einsätze bisher gemeistert. Aber jetzt ist es Zeit, ein bisschen über Atomenergie zu plaudern.
Atomenergie kann wunderbar sein. Sie liefert uns eine enorme Menge an Energie aus einer sehr kleinen Menge Brennstoff. Das ist super für unseren ständig wachsenden Energiebedarf.
Und das Beste?
Bei der Produktion von Atomstrom entstehen keine Treibhausgase, was gut für unseren Planeten ist.
Es gibt jedoch auch große Risiken. Ihr erinnert euch an das Feuer im Kernkraftwerk?
Solche Unfälle können katastrophale Folgen haben. Kommt es zu solchen Unfällen spricht man von einem GAU. Der G-rößten A-nzunehmenden U-nfall der eintreten kann.
Bisher ist das in der Geschichte der Atomkraft zwei mal passiert.
Weißt du wo?")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
(stop:)
<p>
1986 in der ehemaligen Sowjetunion in :
<input type="text" onchange="document.twine.sideStoryTschernobyl(this)" />
</p>
<p>
2011 in Japan in:
<input type="text" onchange="document.twine.sideStoryFukushima(this)" />
</p>
]
]
}
}
<span id="link" style="display: none;">
[[Weiter -> SideStory AB7-2]]
</span>
[[Überspringen -> SideStory AB7-2]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>{
## Side Story Einsatz 7:
<figure>
<iframe src="https://drive.google.com/file/d/14AdyROLrHYXeYSPhEp0mehp2PjqWfCqI/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Stable Diffusion, Prompt: Tschernobyl after the explosion of the power plant, painting </figcaption></figure><!-- Set the text to show -->
(set: $typewriterText to "Genau!
In den Nuklearkatastrophen von Fukushima und Tschernobyl spielten Roboter eine entscheidende Rolle bei der Bewältigung der Krisen.
Nach der Explosion im Reaktor von Tschernobyl 1986 wurden ferngesteuerte Maschinen eingesetzt, um radioaktives Material zu entfernen und die zerstörte Umgebung zu untersuchen, da der Ort für Menschen zu gefährlich war.
In Fukushima, nach dem Tsunami und der Kernschmelze 2011, wurden Roboter verwendet, um die beschädigten Reaktoren zu erkunden, Wassermengen zu messen und radioaktive Hotspots zu identifizieren.
Diese Maschinen ermöglichten es den Experten, Informationen zu sammeln und Schutzmaßnahmen zu treffen, ohne menschliches Leben unnötig zu gefährden.")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
(stop:)
<p>
In diesem Video erfährst du etwas darüber, wie ein Roboter in der Reaktorruine von Fukushima arbeitet:
</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/u10FjpCl9vo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
[[Weiter ->SideStory AB7-3]]
]
]
}
}
[[Überspringen ->SideStory AB7-3]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Side Story Einsatz 7:
{
<figure>
<iframe src="https://drive.google.com/file/d/13V9AiG1cCMjixe7e7jbzrRkriCbyrdrp/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Dall-E, Prompt: An realistic oil painting of an nuclear accident</figcaption></figure>
<!-- Set the text to show -->
(set: $typewriterText to "Abgesehen von der Gefahr eines Unfalls in einem Kraftwerk gibt es aber auch noch den Atommüll. Er bleibt für Tausende von Jahren radioaktiv und kann schädlich für alles Leben sein. Es ist extrem wichtig, ihn sicher zu lagern.
In Deutschland ist das Thema Atommüll hochumstritten. Seit dem Beginn der Atomenergienutzung in den 1960er Jahren hat sich radioaktiver Abfall angesammelt. Ein zentrales Endlager für hochradioaktiven Müll fehlt bis heute. Der Salzstock Gorleben in Norddeutschland, lange als potenzieller Lagerort diskutiert, wurde 2020 aus der Betrachtung genommen. Die Suche nach einem geeigneten Standort geht weiter, wobei Sicherheit und Akzeptanz in der Bevölkerung entscheidend sind. Der Ausstieg aus der Atomenergie ist zwar inzwischen geschafft. Ob das nun sinnvoll ist oder nicht kann man diskutieren. Eine Lösung für den Müll hat man dennoch nicht...
Daher lieber mal wieder zurück in unsere Simulation =) ")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter ->Einleitung AB7-2]]
</div>
(stop:)
]
]
}
}
[[Überspringen ->Einleitung AB7-2]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einleitung Einsatz 7:
{
<figure>
<iframe src="https://drive.google.com/file/d/13V9AiG1cCMjixe7e7jbzrRkriCbyrdrp/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Dall-E, Prompt: An realistic oil painting of an nuclear accident</figcaption></figure><!-- Set the text to show -->(set: $typewriterText to "Dort gibt es immerhin ein Endlager. Wirklich rosig sieht die Lage aber dennoch nicht aus:
Der Atommüll im Endlager rottet vor sich hin... keiner traut sich mehr hinein! Wenigstens sollte eine Aufstellung über die Anzahl der dort lagernden Fässer und der beschädigten Fässer, aus denen die abgebrannten Brennstäbe schon herausgefallen sind, gemacht werden. Eine neue Aufgabe für unseren Rescue-Robot...")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Input AB7-1]]
</div>
(stop:)
]
]
}
}
[[Überspringen -> Input AB7-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>### Nicht jedes Mal muss man alles neu programmieren ...
Unser Ziel ist es jetzt **Vererbung einzusetzen**, um Fähigkeiten eines Roboters in ein neues Modell zu übernehmen.
[[Input zum Thema Vererbung-> Input AB7-2]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
## Vererbung
<div style="display: flex; align-items: flex-start;"><div>Im AB5 hast du viele neue Sensoren für den Roboter programmiert, in AB6 hat er gelernt, Schritte und Drehungen zu zählen. Aber dafür sind alle Fähigkeiten des AB5 wieder verloren gegangen. Natürlich könnte man per Copy-Paste die Methode in die neue Klasse übernehmen. Das geht aber auch eleganter.
Du hast ja schon gemerkt, dass deine Roboter alles können, was ganz allgemein ein Roboter kann, ohne dass du jemals dafür eine einzige Methode hast kopieren müssen. Das liegt daran, dass deine ABx-Roboter **Unterklassen** der Klasse Roboter sind. Sie erben alle Eigenschaften und Fähigkeiten der **Oberklasse**, können sie dennoch erweitern oder verändern.
Dies erreicht man durch folgende Anweisung am Anfang der Klasse:
<center><span class="method-call">public class AB6 extends Roboter. {...}</span></center>
*Die neue Klasse heißt jetzt <span class="method-call">AB6</span> und ist Unterklasse der Klasse <span class="method-call">Roboter</span>*</div>
<div><iframe src="https://drive.google.com/file/d/1FvWQOGIn_5cuj7m1grpsgb22mXrnyKh0/preview" width="170" height="600" allow="autoplay"></iframe>
</div></div>
[[zu den Aufgaben zum Thema Vererbung-> Aufgaben AB7-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>### AB6/AB7 Klassenänderungen und Kreuzungen zählen
<script type="text/javascript">
document.twine.checkAB7Aufgabe1 = function(checkbox) {
if (checkbox.checked) {
$('#AB7-Aufgabe2').show();
document.getElementById('label-AB7-Aufgabe1').style.color = "#108300";
}
else {
$('#AB7-Aufgabe2').hide();
document.getElementById('label-AB7-Aufgabe1').style.color = "#FD2C4A";
}
}
document.twine.showErklaerungAB7a2 = function() {
$('#AB7-Aufgabe2-Lösung').show();
}
document.twine.checkCheckboxAB7a2 = function(checkbox) {
if (checkbox.checked) {
$('#AB7-Aufgabe3').show();
document.getElementById('label-AB7-Aufgabe2').style.color = "#108300";
} else {
$('#AB7-Aufgabe3').hide();
document.getElementById('label-AB7-Aufgabe2').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAB7a3 = function(checkbox) {
if (checkbox.checked) {
$('#linkAB7').show();
document.getElementById('label-AB7-Aufgabe3').style.color = "#108300";
} else {
$('#linkAB7').hide();
document.getElementById('label-AB7-Aufgabe3').style.color = "#FD2C4A";
}
}
</script>
<!-- Aufgabe 1 -->
<div class="aufgabe">
<ol>
<li>Verändere die Klasse AB6/AB7 so, dass sie nicht mehr eine direkte Unterklasse von Roboter, sondern eine Unterklasse des AB5-Roboters ist. Sie erbt auf diese Weise alle seine Sensoren.
Compiliere die Klasse neu. Wie verändert sich das Klassendiagramm?
Überprüfe, dass der AB6/AB7-Roboter jetzt die Fähigkeiten des AB5-Roboters hat. Du findest sie unter „inherited from AB5 >“. (inherited = engl. geerbt).
<input type="checkbox" id="AB7-Aufgabe1" name="AB7-Aufgabe1" onchange="document.twine.checkAB7Aufgabe1(this)"/><label id="label-AB7-Aufgabe1" style="color:#FD2C4A;" for="AB7-Aufgabe1">**Ich habe die Klasse erfolgreich geändert und überprüft.**</label></li></ol></div>
<!-- Aufgabe 2 -->
<div id="AB7-Aufgabe2" style="display: none;"><div class="aufgabe"><ol start="2"><li>Erkläre, warum dein Roboter weiterhin auch die Fähigkeiten eines normalen Roboters hat.
<button onclick="document.twine.showErklaerungAB7a2()">Erklärung anzeigen</button>
<div id="AB7-Aufgabe2-Lösung" style="display: none;">(color:orange)[AB5 ist eine Unterklasse von Roboter. Damit ist auch jeder AB6/AB7 Roboter automatisch eine Unterklasse von Roboter. Eigenschaften und Fähigkeiten werden auch über mehrere Generationen vererbt.]
<input type="checkbox" id="AB7-Aufgabe2" name="AB7-Aufgabe2" onchange="document.twine.checkCheckboxAB7a2(this)"/><label id="label-AB7-Aufgabe2" style="color:#FD2C4A;" for="AB7-Aufgabe2">**Ich habe die Erklärung verstanden.**</label></li> </ol>
</div></div></div>
<!-- Aufgabe 3 -->
<div id="AB7-Aufgabe3" style="display: none;">
<div style="display: flex; align-items: flex-start;"><div class="aufgabe"><ol start="3"><li>**Kreuzungen zählen:** Implementiere im AB6/AB7 Roboter eine Methode <span class="method-call">zaehleKreuzungen()</span>, die einen Gang ans Ende zur Wand läuft und zählt an wie vielen Kreuzungen der Roboter vorbei kam. Benutze dazu einen der bei AB5 programmierten Sensoren. Speichere den Wert in einem geeigneten Attribut. Stelle auch eine get-Methode zur Verfügung. Verschiebe zum Testen mit der Maus das Fass vor dem Roboter oben links, damit er einen Gang mit Kreuzungen vor sich hat.
<input type="checkbox" id="AB7-Aufgabe3" name="AB7-Aufgabe3" onchange="document.twine.checkCheckboxAB7a3(this)"/><label id="label-AB7-Aufgabe3" style="color:#FD2C4A;" for="AB7-Aufgabe3">**Ich habe die Methode zaehleKreuzungen() implementiert und getestet.**</label></li></ol></div><div>
<iframe src="https://drive.google.com/file/d/1kcOnIEzEzew5utLRqOlCKkxCLcmdwx9h/preview" width="300" height="200" allow="autoplay"></iframe>
</div>
</div>
</div>
<span id="linkAB7" style="display: none;">
<div>
Vererbung kann aber noch mehr. Man kann schon existierende Methoden auch verbessern. Beim letzten Arbeitsblatt wurde eine neue Methode <span class="method-call">einsVorMitZaehlen()</span> eingeführt, die eine Verbesserung der Methode <span class="method-call">einsVor()</span> des Standardroboters darstellt. Statt eine Methode mit einem neuen Namen zu erfinden, kann man auch die alte Methode verbessern. Dazu ändert man den Namen auf <span class="method-call">einsVor()</span>. Nun gibt es diese Methode zweimal. Einmal beim Roboter und einmal beim AB6/AB7-Roboter. Um die alte Methode aufzurufen, wird beim AB6/AB7-Roboter <span class="method-call">super.einsVor();</span> geschrieben.
*Lies: rufe die Methode <span class="method-call">einsVor()</span> bei der übergeordneten Klasse auf.*
Diese Technik wirst du in den weiteren Aufgaben üben.
</div>
[[Weiter-> Aufgaben AB7-2]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
<script type="text/javascript">
document.twine.checkAB7Aufgabe4 = function(checkbox) {
if (checkbox.checked) {
$('#AB7-Aufgabe5').show();
document.getElementById('label-AB7-Aufgabe4').style.color = "#108300";
} else {
$('#AB7-Aufgabe5').hide();
document.getElementById('label-AB7-Aufgabe4').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAB7a5 = function(checkbox) {
if (checkbox.checked) {
$('#AB7-Aufgabe6').show();
document.getElementById('label-AB7-Aufgabe5').style.color = "#108300";
} else {
$('#AB7-Aufgabe6').hide();
document.getElementById('label-AB7-Aufgabe5').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAB7a6 = function(checkbox) {
if (checkbox.checked) {
$('#AB7-Aufgabe7').show();
document.getElementById('label-AB7-Aufgabe6').style.color = "#108300";
} else {
$('#AB7-Aufgabe7').hide();
document.getElementById('label-AB7-Aufgabe6').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAB7a7 = function(checkbox) {
if (checkbox.checked) {
$('#AB7-Aufgabe8').show();
document.getElementById('label-AB7-Aufgabe7').style.color = "#108300";
} else {
$('#AB7-Aufgabe8').hide();
document.getElementById('label-AB7-Aufgabe7').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAB7a8 = function(checkbox) {
if (checkbox.checked) {
$('#AB7-Aufgabe9').show();
document.getElementById('label-AB7-Aufgabe8').style.color = "#108300";
} else {
$('#AB7-Aufgabe9').hide();
document.getElementById('label-AB7-Aufgabe8').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAB7a9 = function(checkbox) {
if (checkbox.checked) {
$('#link').show();
document.getElementById('label-AB7-Aufgabe9').style.color = "#108300";
} else {
$('#link').hide();
document.getElementById('label-AB7-Aufgabe9').style.color = "#FD2C4A";
}
}
</script>
## Vererbung
### Unter und Oberklassen
<!-- Aufgabe 4 -->
<div class="aufgabe"><ol start="4">
<li>**Super:** Ändere den Namen der Methode <span class="method-call">einsVorMitZaehlen</span> in <span class="method-call">einsVor</span>. Rufe innerhalb dieser Methode die gleichnamige Methode der Oberklasse mit <span class="method-call">super.einsVor()</span> auf. Anmerkung: Damit du die Klasse kompilieren kannst, muss du natürlich überall die Namensänderung vornehmen, wo du <span class="method-call">einsVorMitZaehlen()</span> verwendet hast.
Überprüfe die Auswirkungen dieser Änderung:
<ul>
<li>Rufe <span class="method-call">einsVor()</span> beim AB6 auf. Beobachte die Auswirkung im Inspect-Fenster.</li>
<li>Rufe die von AB5 geerbte Methode <span class="method-call">laufeBisWand()</span> auf. Beobachte im Inspect-Fenster.</li></ul>
<input type="checkbox" id="AB7-Aufgabe4" name="AB7-Aufgabe4" onchange="document.twine.checkAB7Aufgabe4(this)"/><label id="label-AB7-Aufgabe4" style="color:#FD2C4A;" for="AB7-Aufgabe4">**Ich habe die Methode erfolgreich geändert und überprüft.**</label></li></ol></div>
<!-- Aufgabe 5 -->
<div id="AB7-Aufgabe5" style="display: none;"><div class="aufgabe"><ol start="5">
<li>**Brennstäbe zählen:** Ändere die überflüssig gewordene Methode <span class="method-call">bisWandMitZaehlen()</span>, so dass sie in einem neuen Attribut brennstaebe zählt, wie viele Brennstäbe auf dem Weg zur Wand liegen (wir verwenden auf dem Testgelände natürlich nur ungefährliche Attrappen, die aber täuschend echt aussehen). Verwende dazu <span class="method-call">istAufGegenstand(''Brennstab'')</span>. Ergänze auch die dazugehörige get-Methode.
*<u>Achtung:</u> Ein direkt vor der Wand liegender Brennstab muss auch erkannt werden.*
<input type="checkbox" id="AB7-Aufgabe5" name="AB7-Aufgabe5" onchange="document.twine.checkCheckboxAB7a5(this)"/><label id="label-AB7-Aufgabe5" style="color:#FD2C4A;" for="AB7-Aufgabe5">**Ich habe die Methode geändert und überprüft.**</label></li></ol></div></div>
<!-- Aufgabe 6 -->
<div id="AB7-Aufgabe6" style="display: none;"><div class="aufgabe"><ol start="6">
<li>**Standardmethoden überschreiben:** Überschreibe auf die gleiche Weise die Methode <span class="method-call">dreheLinks</span> und <span class="method-call">dreheRechts</span> von Roboter, so dass die Drehungen gezählt werden. Überprüfe, ob der Pledge-Algorithmus (<span class="method-call">einsatz6()</span>) immer noch funktioniert.
<input type="checkbox" id="AB7-Aufgabe6" name="AB7-Aufgabe6" onchange="document.twine.checkCheckboxAB7a6(this)"/><label id="label-AB7-Aufgabe6" style="color:#FD2C4A;" for="AB7-Aufgabe6">**Ich habe die Methoden überschrieben und getestet.**</label></li></ol></div></div>
<!-- Aufgabe 7 -->
<div id="AB7-Aufgabe7" style="display: none;"><div class="aufgabe"><ol start="7">
<li>**Fass links:** Implementiere einen neuen Sensor <span class="method-call">istFassLinks()</span>, der erkennt, ob links ein Fass (egal, ob ein normales oder ein Atommüllfass) ist. Verwende dazu den Sensor <span class="method-call">istFassVorne()</span> *(Öffne zum Vergleich AB 5)*.
<input type="checkbox" id="AB7-Aufgabe7" name="AB7-Aufgabe7" onchange="document.twine.checkCheckboxAB7a7(this)"/><label id="label-AB7-Aufgabe7" style="color:#FD2C4A;" for="AB7-Aufgabe7">**Ich habe den neuen Sensor implementiert und überprüft.**</label></li></ol></div></div>
<!-- Aufgabe 8 -->
<div id="AB7-Aufgabe8" style="display: none;"><div class="aufgabe"><ol start="8">
<li>**Überschreiben:** Überschreibe die Methoden <span class="method-call">istWandVorne()</span> und <span class="method-call">istWandLinks()</span> so, dass sie true zurückgeben, falls wirklich eine Wand vorne (<span class="method-call">super.istWandVorne()</span>) bzw. links (<span class="method-call">super.istWandLinks()</span>) ist oder falls ein Fass vorne bzw. links ist. Verwende dazu die Sensoren <span class="method-call">istFassVorne()</span> und <span class="method-call">istFassLinks()</span>.
<input type="checkbox" id="AB7-Aufgabe8" name="AB7-Aufgabe8" onchange="document.twine.checkCheckboxAB7a8(this)"/><label id="label-AB7-Aufgabe8" style="color:#FD2C4A;" for="AB7-Aufgabe8">**Ich habe die Methoden überschrieben und getestet.**</label></li></ol></div></div>
<!-- Aufgabe 9 -->
<div id="AB7-Aufgabe9" style="display: none;"> <div style="display: flex; align-items: flex-start;"><div class="aufgabe"><ol start="9"><li>Teste die Auswirkungen dieser Änderungen auf den Pledge- Algorithmus, indem du direkt am Roboter (nicht auf einem Bodenfeld) den einsatz6() aufrufst, nachdem du einige Fässer in der Welt zusätzlich platziert hast. (Erzeuge dazu mit einem Rechtsklick auf <span class="method-call">new Gegenstand(String name)</span> einen neuen Gegenstand und gib als Name ''Atommuell'' oder ''Fass'' ein.)
</li></ol></div><div>
<iframe src="https://drive.google.com/file/d/1sm1mi7J6GJZZIYyMtMqo9H3K3ekeECxz/preview" width="250" height="200" allow="autoplay"></iframe></div></div> <ul style="list-style-type: none"><li><div class="aufgabe"><input type="checkbox" id="AB7-Aufgabe9" name="AB7-Aufgabe9" onchange="document.twine.checkCheckboxAB7a9(this)"/><label id="label-AB7-Aufgabe9" style="color:#FD2C4A;" for="AB7-Aufgabe9">**Ich habe die Auswirkungen getestet und der Pledge-Algorithmus funktioniert immer noch.**</label></div></li></ul>
<span id="link" style="display: none;">
[[zur Abschlussaufgabe-> Geschichte AB7 Teil 2]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einsatz 7:
<figure><img src="https://www.augsburger-allgemeine.de/img/incoming/crop22011616/4539662136-cv16_9-w1880-owebp/Asse?t=.jpg" width = "800" height = "300">
<figcaption>Quelle: https://www.augsburger-allgemeine.de/politik/Asse-II-bei-Wolfenbuettel-Mission-Impossible-Die-Rueckholung-der-Atomfaesser-und-die-Gefahr-id22011681.html Das Bundesumweltministerium will eine Rückholung der Atommüllfässer. Doch ein Experte äußert Zweifel. Foto: dpa</figcaption></figure> <!-- Set the text to show -->(set: $typewriterText to "In einem alten Bergwerk wurde vor etlichen Jahren ein Atommüllendlager eingerichtet. Leider rosten die Fässer dort vor sich hin, so dass einige Brennstäbe in den Gängen herumliegen. Für Menschen ist es zu gefährlich, diese zu zählen, da sie stark strahlen. Außerdem ist das Bergwerk stark einsturzgefährdet. Jeden Moment kann es einen Steinschlag geben. Unser Roboter soll das übernehmen.")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter ->Abschlussaufgabe AB7]]
</div>
(stop:)
]
]
}
[[Überspringen->Abschlussaufgabe AB7]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einsatz 7:
### Zählung der Atommüllfässer
<div class="aufgabe">**Ihr Auftrag:** Zählen Sie die Brennstäbe in den Gängen, hebe Sie sie auf und kehre Sie zum Portal zurück.</div>
<iframe src="https://drive.google.com/file/d/13FdgiUR_HZugak3Pqg-0EFQMyl7tGdq8/preview" width="600" height="600"></iframe>
<div class="aufgabe">
*<u><strong>Hinweis 1:</strong></u> Auf dem Rundweg außen herum liegen keine Brennstäbe.*
*<u><strong>Hinweis 2:</strong></u> Machen Sie sich vorher ein Bild von der Situation, indem Sie den Einsatz7 starten.*
*<u><strong>Hinweis 3:</strong></u> Eventuell reicht die Energie nicht aus, um das Bergwerk zu verlassen. In diesem Fall müssen Sie den Einsatz erneut ausführen.*
</div>
[[Weiter ->Abschluss AB7]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.checkCheckbox = function() {
var checkboxes = document.querySelectorAll('input[type="checkbox"][id^="AB7-punkt"]');
var allChecked = true;
checkboxes.forEach(function(checkbox) {
if (!checkbox.checked) {
allChecked = false;
}
});
if (allChecked) {
$('#link').show();
} else {
$('#link').hide();
}
}
</script>
<h2>Zusammenfassung Level 7</h2>
<fieldset class="level-fieldset"><legend>Du hast in diesem Level...</legend>
<div class="level-checkbox">
<input type="checkbox" id="AB7-punkt1" name="AB7-punkt1" onchange="document.twine.checkCheckbox(this)"/> <label for="AB7-punkt1">gelernt **Vererbung** einzusetzen, um Fähigkeiten eines Roboters in ein neues Modell zu übernehmen. Du weißt jetzt, dass man mittels <span class="method-call">public class AB6 extends Roboter {...}</span> eine Unterklasse einer bereits existierenden Klasse erstellen kann.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB7-punkt2" name="AB7-punkt2" onchange="document.twine.checkCheckbox(this)"/> <label for="AB7-punkt2">gelernt das Schlüsselwort <span class="method-call">super</span> einzusetzen, um die Methoden einer Oberklasse zu verwenden.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB7-punkt3" name="AB7-punkt3" onchange="document.twine.checkCheckbox(this)"/> <label for="AB7-punkt3">Standardmethoden erfolgreich überschrieben und die Auswirkungen darauf getestet.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB7-punkt4" name="AB7-punkt4" onchange="document.twine.checkCheckbox(this)"/> <label for="AB7-punkt4">neue Sensoren für den Roboter implementiert und ihre Funktionsweise überprüft.</label>
</div>
</fieldset>
<span id="link" style="display: none;">
<div> Gut gemacht =) Du hast nun das achte Level erreicht. Möchtest du direkt dorthin springen, benötigst du das folgende Codewort:
<center>**vererbungsPro**</center>
</div>
[[Weiter ->Einleitung AB8]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
## Einleitung Einsatz 8:
{
<figure>
<iframe src="https://drive.google.com/file/d/16xX9BsYuuwB75LQa0pxskBRT6RyPkGvK/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Dall-E, Prompt: A cyberpunk foto of an nuclear accident </figcaption></figure>
<!-- Set the text to show -->
(set: $typewriterText to "Immer mehr Atommüll. Wie viel passt eigentlich noch in unser Endlager? Einige Räume im Endlager sind noch frei. Dort sollen Fässer eingelagert werden. Vorher muss aber bestimmt werden, wie viel Platz dort noch ist.
Dazu müssen wir uns nochmals mit dem Thema Variablen auseinandersetzen.
Ihr ZIEL: lokale Variable als Zwischenspeicher für einen Wert kennen und einsetzen können sowie lokale Variable von Objektvariablen unterscheiden können. Außerdem werden Sie lernen Wertzuweisungen zu nutzen.")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Input AB8-1]]
</div>
(stop:)
]
]
}
}
[[Überspringne -> Input AB8-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Wertzuweisungen
#### Lokale Variablen als Kurzzeitgedächtnis
<div>Manchmal muss sich der Roboter bestimmte Werte nur vorübergehend merken, um eine Aufgabe zu erfüllen. Wenn er z.B. die Schrauben einer lückenlosen Schraubenspur zählen soll, so muss er sich nur kurzfristig merken, wie viele Schrauben er schon gezählt hat und kann das wieder vergessen, sobald er die Antwort gegeben hat.
Bisher hatten wir Attribute der Objekte als Gedächtnis. Diese sind aber nur für Werte gedacht, die der Roboter sich dauerhaft merken soll, z.B. wie viele Schritte er insgesamt schon gelaufen ist, welche x-Position er im Moment hat, ... .
Man könnte auch das „Kurzzeitgedächtnis“ mit Attributen realisieren, würde dann aber sehr viele Attribute bekommen, die immer nur kurzfristig zum Einsatz kämen und dann gegebenenfalls nicht mehr gebraucht werden. Das fördert nicht gerade die Lesbarkeit.
Daher verwenden wir sogenannte **lokale Variablen**, deren Geltungsbereich nur eine Methode (oder auch nur eine Schleife) ist. Man verwendet sie fast genauso wie Attribute.
Die folgende Tabelle stellt die Unterschiede dar:</div>
<iframe src="https://drive.google.com/file/d/11adj2CX76Rq7uC2fRQjb-RfGmUdadmD8/preview" width="600" height="600" allow="autoplay"></iframe>
[[zu den Aufgaben zum Thema Wertzuweisung-> Aufgaben AB8-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.showErklaerungAB8a1 = function() {
$('#AB8-Aufgabe1-Lösung').show();
}
document.twine.checkCheckboxAB8a1 = function(checkbox) {
if (checkbox.checked) {
$('#AB8-Aufgabe2').show();
document.getElementById('label-AB8-Aufgabe1').style.color = "#108300";
} else {
$('#AB8-Aufgabe1').hide();
document.getElementById('label-AB8-Aufgabe1').style.color = "#FD2C4A";
}
}
document.twine.checkCheckboxAB8a2 = function(checkbox) {
if (checkbox.checked) {
$('#AB8-Aufgabe3').show();
document.getElementById('label-AB8-Aufgabe2').style.color = "#108300";
} else {
$('#AB8-Aufgabe3').hide();
document.getElementById('label-AB8-Aufgabe2').style.color = "#FD2C4A";
}
}
document.twine.updateAB8a3 = function(element){
element.style.color = "white";
if (element.value.toLowerCase() === "robotermeister3000") {
// Display the hidden link.
$('#link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
</script>
## Wertzuweisung und lokale Variablen
<!-- Aufgabe 1 -->
<div class="aufgabe"><ol><li>**Finde den Unterschied:** Rufe bei den beiden AB8-Robotern links oben die Methoden <span class="method-call">zaehleSchritteBisWand1</span> bzw. <span class="method-call">zaehleSchritteBisWand2</span> auf. Sie sollten das gleiche Ergebnis liefern. Rufe danach die Methoden erneut auf. Erkläre den Unterschied.
<button onclick="document.twine.showErklaerungAB8a1()">Erklärung anzeigen</button>
<div id="AB8-Aufgabe1-Lösung" style="display: none;">(color:orange)[Es werden zwei unterschiedliche Arten von Variablen verwendet. Das eine ist eine **Klassenvariable**, die so lange bestehen bleibt, wie der Roboter existiert.
Die andere Variable ist eine **lokale Variable**, die wieder gelöscht wird, wenn die Methode beendet wird. Beim erneuten Aufruf wird sie wieder mit 0 initialisiert.
Daher zählt die Klassenvariable (=Attribut) alle Schritte, die lokale Variable nur die Schritte des aktuellen Methodenaufrufs.]
<input type="checkbox" id="AB8-Aufgabe1" name="AB8-Aufgabe1" onchange="document.twine.checkCheckboxAB8a1(this)"/><label id="label-AB8-Aufgabe1" style="color:#FD2C4A;" for="AB8-Aufgabe1">**Ich habe dieErklärung verstanden.**</label></li> </ol></div></div>
<!-- Aufgabe 2 -->
<div id="AB8-Aufgabe2" style="display: none;">
<div class="aufgabe"><ol start="2"><li>**Debugging:** Lasse dir mit INSPECT die Attribute anzeigen, um den Ablauf der Methoden zu verfolgen. Warum sieht man hiernur den zaehler1? Wo sieht man die lokalen Variablen? Dafür benötigt man den **Debugger**, mit dem man auch bei lokalen Variablen den Verlauf kontrollieren kann.
Setze dazu einen Breakpoint, indem du auf die Zeilennummer klickst, an der das Programm unterbrochen werden soll (hier Zeile 27). Wenn du dann die Methode aufrufst, hält das Programm am Stoppschild an und kann mit Step Schritt für Schritt ausgeführt werden. Dabei werden Attribute (= Instance variables) und lokale Variablen angezeigt. Du siehst, dass die lokale Variable erst entsteht, wenn sie das erste Mal benutzt wird.
<iframe src="https://drive.google.com/file/d/1NV-G81fRSqm6afnJrxzXkOCUm99hngFM/preview" width="700" height="550" allow="autoplay"></iframe>
<input type="checkbox" id="AB8-Aufgabe2" name="AB8-Aufgabe2" onchange="document.twine.checkCheckboxAB8a2(this)"/><label id="label-AB8-Aufgabe2" style="color:#FD2C4A;" for="AB8-Aufgabe2">**Ich habe mich mit dem Debugger beschäftigt.**</label></li></ol></div></div>
<!-- Aufgabe 3 & 4 -->
<div id="AB8-Aufgabe3" style="display: none;">
<div class="aufgabe"><ol start="3"><li> & 4. Aufgabe: *(Falls die Aufgabe nicht korrekt angezeigt wird, drücke einmal auf "Überprüfen" und dann auf "Wiederholen".)*
</li></ol>
<iframe src="https://jwalther.hopp-its.de/wp-admin/admin-ajax.php?action=h5p_embed&id=5" width="1198" height="779" frameborder="0" allowfullscreen="allowfullscreen" title="RR AB lokale Variablen - Attribute"></iframe><script src="https://jwalther.hopp-its.de/wp-content/plugins/h5p/h5p-php-library/js/h5p-resizer.js" charset="UTF-8"></script>
Gib hier das Lösungswort ein und drücke dann die Enter-Taste:
<input type="text" onchange="document.twine.updateAB8a3(this)" />
</div></div>
<span id="link" style="display: none;">
[[Weiter-> Input AB8-2]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Wertzuweisungen in Java
<iframe src="https://jwalther.hopp-its.de/wp-admin/admin-ajax.php?action=h5p_embed&id=6" width="1198" height="699" frameborder="0" allowfullscreen="allowfullscreen" title="RR AB8 Wertzuweisung"></iframe><script src="https://jwalther.hopp-its.de/wp-content/plugins/h5p/h5p-php-library/js/h5p-resizer.js" charset="UTF-8"></script>
[[Weiter-> Variablenquiz AB8]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Variablenquiz
Der untenstehende Code enthält in Summe 10 Fehler. Wenn du 8 der 10 Fehler findest bist du schon richtig gut im Umgang mit Variablen. Findest du weniger als 6 solltest du dich mit dem Thema noch etwas auseinandersetzen.
<iframe src="https://jwalther.hopp-its.de/wp-admin/admin-ajax.php?action=h5p_embed&id=9" width="1198" height="773" frameborder="0" allowfullscreen="allowfullscreen" title="Aufgaben zu Variablen"></iframe><script src="https://jwalther.hopp-its.de/wp-content/plugins/h5p/h5p-php-library/js/h5p-resizer.js" charset="UTF-8"></script>
[[zu den Programmieraufgaben von Level 8-> Aufgaben AB8-2]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.showNextTask = function(checkbox, nextTaskID, labelID) {
if (checkbox.checked) {
$(`#${nextTaskID}`).show();
document.getElementById(labelID).style.color = "#108300";
} else {
$(`#${nextTaskID}`).hide();
document.getElementById(labelID).style.color = "#FD2C4A";
}
}
document.twine.checkAB8a9 = function(element){
element.style.color = "white";
if (element.value.toLowerCase() == "38") {
// Display the hidden link.
$('#Aufgabe10').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
$('#Aufgabe10').hide();
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
</script>
{
### Aufgaben <br>
<!-- Aufgabe 5 -->
<div id="Aufgabe5">
<div class="aufgabe">
<ol start="5">
<li>
<strong>Summe:</strong> Rufe die Methode <span class="method-call">gibPositionssumme()</span> an einem Roboter auf. Bewege ihn (per einsVor- und drehen-Befehle) an eine andere Stelle.
<ul><li>Was meldet er jetzt als Antwort auf diesen Fragebefehl? </li>
<li>Wie musst du ihn bewegen, damit das Ergebnis gleich bleibt? Begründe dies mit dem Quelltext. </li>
<li>Wo findet welche Art von Wertzuweisung statt? </li></ul><br>
<input type="checkbox" id="checkAufgabe5" onchange="document.twine.showNextTask(this, 'Aufgabe6', 'label-Aufgabe5')"/><label id="label-Aufgabe5" for="checkAufgabe5" style="color:#FD2C4A;">**Ich habe diese Aufgabe abgeschlossen.**</label>
</li>
</ol>
</div>
</div>
<!-- Aufgabe 6 -->
<div id="Aufgabe6" style="display: none;">
<div class="aufgabe">
<ol start="6">
<li>
<strong>Abstände:</strong> Implementiere die Methode <span class="method-call">gibLaenge()</span> mit int-Rückgabewert: Deklariere drei lokale Variablen <span class="method-call">`x1, x2, x_diff`</span>. Weise <span class="method-call">x1</span> den Wert des Aufrufs von <span class="method-call">getX()</span> zu. Lasse den Roboter bis zur nächsten Wand laufen. Weise nun <span class="method-call">x2</span> den Wert des Aufrufs von <span class="method-call">getX()</span> zu. Berechne die Differenz von <span class="method-call">x2</span> und <span class="method-call">x1</span> und speichere sie in <span class="method-call">`x_diff`</span>. Gib diese Differenz als Ergebnis deiner Methode zurück.<br>
Teste diese Methode:
<ul>
<li>Welches Ergebnis liefert sie, wenn du den Roboter an eine Wand nach rechts laufen lässt?</li>
<li>Was passiert bei Robotern, die nach links/oben/unten laufen? Verbessere deine Methode so, dass sie immer den Abstand zur Wand zurück gibt. Dazu wirst du auch die y-Koordinaten speichern müssen.</li></ul>
*Anmerkung: Ok, einfacher als Schritte zählen ist das nicht ...*<br><br>
<input type="checkbox" id="checkAufgabe6" onchange="document.twine.showNextTask(this, 'Aufgabe7', 'label-Aufgabe6')"/><label id="label-Aufgabe6" for="checkAufgabe6" style="color:#FD2C4A;">**Meine Methode gibLaenge() funktioniert jetzt.**</label>
</li>
</ol>
</div>
</div>
<!-- Aufgabe 7 -->
<div id="Aufgabe7" style="display: none;">
<div class="aufgabe">
<div style="display: flex; align-items: start;">
<div style="flex: 1;">
<ol start="7">
<li>
<strong>Fläche:</strong> Implementiere eine Methode, die die Fläche eines Raumes (Breite `*` Höhe) bestimmt und zurück gibt. Du kannst davon ausgehen, dass der Roboter in einer Ecke des Raumes steht. Du kannst dir aussuchen, in welcher. <br>
</li>
</ol>
</div>
<div><br>
<iframe src="https://drive.google.com/file/d/1ZQkkBIWwmVBmduC3gF4BavXiokCqJlOq/preview" width="200" height="150"></iframe>
</div>
</div>
<ol style="list-style-type: none;"><li>
<input type="checkbox" id="checkAufgabe7" onchange="document.twine.showNextTask(this, 'Aufgabe8', 'label-Aufgabe7')"/><label id="label-Aufgabe7" for="checkAufgabe7" style="color:#FD2C4A;">**Mein Roboter kann jetzt die Fläche eines Raumes bestimmen.**</label></li></ol>
</div>
</div>
<!-- Aufgabe 8 -->
<div id="Aufgabe8" style="display: none;">
<div class="aufgabe">
<div style="display: flex; align-items: start;">
<div style="flex: 1;">
<ol start="8">
<li>
<strong>Zähle Fässer:</strong> Implementiere eine Methode, die zurück gibt, aus wie vielen Fässern ein rechteckiges Areal von Fässern besteht. Es ist sinnvoll, zunächst einen Sensor <span class="method-call">istFassRechts()</span> zu
implementieren. Damit kann man eine Methode <span class="method-call">gibLaengeFassreihe()</span> implementieren, die man dann zum Bestimmen der Anzahl der Fässer benutzt. <br>
</li>
</ol>
</div>
<div>
<iframe src="https://drive.google.com/file/d/1sUxLdhVLyuxaKg891ZDA_89gxhkiSgdh/preview" width="300" height="300"></iframe>
</div>
</div>
<ol style="list-style-type: none;"><li>
<input type="checkbox" id="checkAufgabe8" onchange="document.twine.showNextTask(this, 'Aufgabe9', 'label-Aufgabe8')"/><label id="label-Aufgabe8" for="checkAufgabe8" style="color:#FD2C4A;">**Mein Roboter kann jetzt die Anzahl an Fässern in einem rechteckigen Areal zählen.**</label>
</li></ol>
</div>
</div>
<!-- Aufgabe 9 -->
<div id="Aufgabe9" style="display: none;">
<div class="aufgabe">
<ol start="9">
<li>
Gib an, welchen Wert die Variable summe hat, wenn folgende fünf Zeilen ausgeführt wurden:
<pre>
`int summe;
summe = 10;
summe = summe – 2;
summe = summe * 4;
summe = summe + 6;`</pre><br>
<input type="text" onchange="document.twine.checkAB8a9(this)" /><br>
</li>
</ol>
</div>
</div>
<!-- Aufgabe 10 -->
<div id="Aufgabe10" style="display: none;">
<div class="aufgabe">
<ol start="10">
<li>
<strong>Sammler:</strong> Implementiere eine Methode, die den
Roboter bis zur nächsten Wand laufen lässt und dabei alles aufhebt, was auf dem Boden liegt. Dabei soll der Wert der gesammelten Gegenstände ermittelt werden. Jede Schraube ist dabei 20 Cent Wert, jeder Akku 2,40 Euro, jeder Schlüssel 5 Euro, jeder Feuerlöscher 40 Euro. Er soll dann mittels einer get-Methode jederzeit abgefragt werden können.<br>
*Tipp: Überlege dir, ob du eine lokale Variable oder ein Attribut für den Wert verwenden möchtest. Kommazahlen kann man nicht in einer integer-Variable speichern. Dafür gibt es den Typ double. Kommazahlen werden in Java mit einem Punkt geschrieben (z.B. 2.40).*<br><br>
<input type="checkbox" id="checkAufgabe10" onchange="document.twine.showNextTask(this, 'Aufgabe11', 'label-Aufgabe10')"/><label id="label-Aufgabe10" for="checkAufgabe10" style="color:#FD2C4A;">**Ich habe diese Aufgabe abgeschlossen.**</label>
</li>
</ol>
</div>
</div>
<!-- Aufgabe 11 -->
<div id="Aufgabe11" style="display: none;">
<div class="aufgabe">
<ol start="11">
<li>
<strong>Finanzamt:</strong> Der Wert aller gesammelter Gegenstände (aus vorheriger Aufgabe) muss besteuert werden, d.h. für jeden gefundenen Gegenstand, der verkauft wird, muss die Mehrwertsteuer hinzugerechnet und ans Finanzamt abgeführt werden. Daher soll der Roboter mit <span class=""method-call>getMehrwertsteuer()</span> den Steuerbetrag der gefundenen Gegenstände berechnen können. Implementiere eine Methode, die die Steuer berechnet und zurück gibt. <br><br>
<input type="checkbox" id="checkAufgabe11" onchange="document.twine.showNextTask(this, 'Ende', 'label-Aufgabe11')"/><label id="label-Aufgabe11" for="checkAufgabe11" style="color:#FD2C4A;">**Mein Roboter kann nun die Mehrwertssteuer berechnen**</label>
</li>
</ol>
</div>
</div>
<span id="Ende" style="display: none;"> [[zum Levelabschluss-> Abschlussaufgabe AB8]]</span>
}
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einsatz 8:
### Bestimme die Lagerkapazität des Endlagers
<div class="aufgabe">Einige Räume im Endlager sind noch frei. Dort sollen Fässer eingelagert werden. Vorher muss aber bestimmt werden, wie viel Platz dort noch ist. Die Räume gehen alle nach rechts von einem Gang ab. Man kommt immer am linken oberen Eck in den Raum. Die ersten zwei Zeilen müssen frei bleiben, damit man mit dem Gabelstapler rangieren kann. Daher können die Fässer nur auf den gelben Feldern platziert werden.
Bestimme die Anzahl der gelben Felder und gehe zum Portal. Der Leveltest (also die Methode <span class="method-call">einsatz8()</span>) muss als Ergebnis die Anzahl der Felder zurückgeben.</div>
<iframe src="https://drive.google.com/file/d/1QR4435cns9vqbzsR54Rj6cUX1hUQeUxu/preview" width="600" height="600"></iframe>
[[Weiter -> Abschluss AB8]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.checkCheckbox = function() {
var checkboxes = document.querySelectorAll('input[type="checkbox"][id^="AB8-punkt"]');
var allChecked = true;
checkboxes.forEach(function(checkbox) {
if (!checkbox.checked) {
allChecked = false;
}
});
if (allChecked) {
$('#link').show();
} else {
$('#link').hide();
}
}
</script>
<h2>Zusammenfassung Level 8</h2>
<fieldset class="level-fieldset"><legend>Du hast in diesem Level...</legend>
<div class="level-checkbox">
<input type="checkbox" id="AB8-punkt1" name="AB8-punkt1" onchange="document.twine.checkCheckbox(this)"/> <label for="AB8-punkt1">den Unterschied zwischen **lokalen Variablen** und **Attributen** kennen gelernt. Außerdem weißt du, wie man lokale Variablen deklarieren und initialisieren kann.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB8-punkt2" name="AB8-punkt2" onchange="document.twine.checkCheckbox(this)"/> <label for="AB8-punkt2">gelernt, wann es sinnvoll ist lokale Variablen zu nutzen und wann Attribute genutzt werden.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB8-punkt3" name="AB8-punkt3" onchange="document.twine.checkCheckbox(this)"/> <label for="AB8-punkt3">verschiedene Arten der Wertzuweisung kennen gelernt: <ul><li> <span class="method-call">anzSchritte = 13;</span> </li>
<li> <span class="method-call">anzSchritte = zaehleSchritteBisWand1();</span> </li>
<li> <span class="method-call">flaeche = breite `*` hoehe;</span> </li></label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB8-punkt4" name="AB8-punkt4" onchange="document.twine.checkCheckbox(this)"/> <label for="AB8-punkt4">den Debugger kennen gelernt, um Variablenwerte zu analysieren und Fehler zu finden.</label>
</div>
</fieldset>
<span id="link" style="display: none;">
<div> Gut gemacht =) Du hast nun das neunte Level erreicht. Möchtest du direkt dorthin springen, benötigst du das folgende Codewort:
<center>**wertWeise**</center>
</div>
[[Weiter ->Einleitung AB9]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
## Einleitung Einsatz 9:
{
<figure>
<iframe src="https://drive.google.com/file/d/1rYAB0tvEMGVrN7K-jORrtMgrp1j2rLYu/preview" width="600" height="600"></iframe>
<figcaption>Quelle: Dall-E, Prompt: Digital art of a robot with a bomb </figcaption></figure>
<!-- Set the text to show -->
(set: $typewriterText to "Ein Platz für ein neues Endlager ist gefunden! In einem Bergwerk soll dies geschaffen werden. Sprengarbeiten müssen vorgenommen und Brennstäbe eingelagert werden. Eine Aufgabe wie gemacht für unsere Roboter...
Ein Einsatzleiter wurde bestimmt, die anstehenden heiklen Arbeiten zu koordinieren.
Dazu müssen sie lernen, Probleme mit Hilfe von flexibel einsetzbaren Methoden zu lösen. Diese Methoden enthalten Parameter, mit denen sich das Verhalten der Roboter flexibel steuern lässt.")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Input AB9-1]]
</div>
(stop:)
]
]
}
}
[[Überspringen -> Input AB9-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Methoden mit Parametern
{<!-- Workaround damit der Beginn der Seite angezeigt wird, ansonsten ist das erste Input-Tag fokussiert und es wird dorthin gescrollt -->
<input type="hidden" autofocus="true" />
<div>
Bei manchen Einsätzen müssen Roboter situationsgerecht agieren können. So legt beispielsweise ein Roboter über den Methodenaufruf <span class="method-call">ablegen(...)</span> eine Schraube, ein anderer einen Brennstab ab. Welchen Gegenstand der einzelne Roboter ablegen soll, bekommt er als sogenannten Parameter innerhalb der **Parameterklammer ( )** mitgeteilt. So bewirkt <span class="method-call">ablegen("Schraube")</span> etwas anderes als <span class="method-call">ablegen("Brennstab")</span>. <br>
Das kennst du schon seit AB3 Aufgabe 1. <br>
Als Parameter wird der Methode <span class="method-call">ablegen(...)</span> ein **String**, also ein Text mitgegeben. Dieser Text muss, wie du schon gelernt hast, in Java immer in Anführungszeichen geschrieben werden.
Als weitere Methoden mit Parametern hast du beispielsweise schon diese aufgerufen:
<ul>
<li><span class="method-call"> benutze("Feuerloescher")</span</li>
<li> <span class="method-call"> istVorne("Fass")</span> </li>
<li> <span class="method-call"> istAufGegenstand("Brennstab")</span> </li>
</ul>
Um den Robotern diese Variabilität beizubringen, muss der Kopf der Methodenbeschreibung (oder auch **Signatur der Methode** genannt) wie folgt lauten:<br><br>
<center>
<span class="method-call">public void ablegen(**String** name)</span><br>
</center>
<br><br>
Das Schlüsselwort String in der Parameterklammer hinter dem Methodennamen besagt, dass bei Befehlserteilung ein Text anzugeben ist, damit der Befehl ausgeführt werden kann. <br>
<iframe src="https://drive.google.com/file/d/14IyIqc0EXBDPjv0DD7pKTad21F-LpJU7/preview" width="400" height="300"></iframe>
Es wird also der Name des Gegenstandes erwartet, der abgelegt werden soll. Wenn du keinen Text eingibst, weiß der Roboter nicht, welchen Gegenstand er ablegen soll. Es erscheint eine Fehlermeldung. Eine Fehlermeldung erscheint ebenfalls, wenn der Eingabewert nicht vom Typ String, also z.B. nicht in Anführungszeichen geschrieben ist.<br>
Als Parameter sind alle Variablentypen denkbar. So erwartet beispielsweise die Methode mit der Signatur <span class="method-call">public void macheWasXMal(int anzahl)</span> einen Integer, also eine Ganzzahl. Bei der Befehlserteilung ist also eine Zahl anzugeben, damit der Befehl ausgeführt werden kann. Gültige Methodenaufrufe wären beispielsweise <span class="method-call">macheWasXMal(7)</span> oder <span class="method-call">macheWasXMal(1234)</span>.<br>
Sogar <span class="method-call">macheWasXMal(-3)</span> wäre erlaubt, nach einem Sinn müssten wir jedoch suchen ;-).<br><br>}
#### <u>Mehrere Prameter</u>
{Manchmal ist es auch erforderlich, mehrere Parameter anzugeben. So hat die Methode <span class="method-call">int berechneFlaeche(int breite, int hoehe)</span> zwei Parameter vom Typ int, die zur Flächenberechnung genutzt werden. Der Methodenaufruf <span class="method-call">berechneFlaeche(3, 5)</span> würde somit den Wert 15 als Methodenergebnis liefern (siehe Bilder).
<iframe src="https://drive.google.com/file/d/1lGCaT7kntW719CdalO0IiAAIKbx9xBVE/preview" width="800" height="400"></iframe>
Beim Methodenaufruf der Methode <span class="method-call">melde(String text, boolean istWichtig)</span> wird an erster Position die Eingabe eines Textes erwartet, an zweiter Position die Eingabe eines Wahrheitswertes true oder false, je nachdem, ob die Meldung besonders wichtig ist oder nicht.
</div>}
[[Weiter -> Aufgaben AB9-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script>
document.twine.checkAB9a1 = function(element){
element.style.color = "white";
if (element.value.toLowerCase() == "methodensignatur") {
// Display the hidden link.
$('#Aufgabe2').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
$('#Aufgabe2').hide();
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
document.twine.showNextTask = function(checkbox, nextTaskID, labelID) {
if (checkbox.checked) {
$(`#${nextTaskID}`).show();
document.getElementById(labelID).style.color = "#108300";
} else {
$(`#${nextTaskID}`).hide();
document.getElementById(labelID).style.color = "#FD2C4A";
}
}
</script>
### Methoden mit Parametern
{
<!-- Workaround damit der Beginn der Seite angezeigt wird, ansonsten ist das erste Input-Tag fokussiert und es wird dorthin gescrollt -->
<input type="hidden" autofocus="true" />
Du bist jetzt in Greenfoot im Level „AB9 – Methoden mit Parametern“. Alle Roboter haben (in der Klasse Roboter) schon einige Methoden mit Parametern implementiert.<br><br>
<!-- Aufgabe 1 -->
<div class="aufgabe">
<ol><li>Löse die folgenden Aufgaben:<br><br>
<iframe src="https://jwalther.hopp-its.de/wp-admin/admin-ajax.php?action=h5p_embed&id=7" width="1198" height="696" frameborder="0" allowfullscreen="allowfullscreen" title="RR AB9 A1 Methoden mit Parameter"></iframe><script src="https://jwalther.hopp-its.de/wp-content/plugins/h5p/h5p-php-library/js/h5p-resizer.js" charset="UTF-8"></script><br><br>
Gib hier das Lösungswort ein und drücke dann die Enter-Taste:<br>
<input type="text" onchange="document.twine.checkAB9a1(this)" />
</div></li></ol>
<!-- Aufgabe 2 -->
<div id="Aufgabe2" style="display: none;">
<div class="aufgabe">
<ol start="2">
<li>
<strong> Teste </strong>an einem AB9 die drei unten markierten Methoden (indem du bei einem Roboter rechts klickst und auf geerbt von Roboter → Weitere Methoden gehst). Beschreibe jeweils kurz, welche Aufgabe die jeweilige Methode erfüllt.<br>
<iframe src="https://drive.google.com/file/d/1qS6LXPaYTRrDc4b3pVuM3j4_5ygiEknY/preview" width="600" height="300"></iframe>
<br><br>
<input type="checkbox" id="checkAufgabe2" onchange="document.twine.showNextTask(this, 'Ende', 'label-Aufgabe2')"/><label id="label-Aufgabe2" for="checkAufgabe2" style="color:#FD2C4A;">**Ich habe diese Aufgabe abgeschlossen.**</label>
</li>
</ol>
</div>
</div>
}
<span id="Ende" style="display: none;"> [[Weiter-> Aufgaben AB9-2]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.showNextTask = function(checkbox, nextTaskID, labelID) {
if (checkbox.checked) {
$(`#${nextTaskID}`).show();
document.getElementById(labelID).style.color = "#108300";
} else {
$(`#${nextTaskID}`).hide();
document.getElementById(labelID).style.color = "#FD2C4A";
}
}
</script>
{
Im Bergwerk bringt ein Aufzug die Roboter in das richtige Stockwerk. Durch einen „Schalter“ kann der Aufzug in das oberste Stockwerk gerufen werden. Dafür gibt es schon die Methode <span class="method-call">holeAufzug()</span>.<br><br>
<!-- Aufgabe 3 -->
<div class="aufgabe">
<div style="display: flex; align-items: start;">
<div style="flex: 1;">
<ol start="3">
<li>
<strong>Drehe Roboter: </strong>Vervollständige die Methode <span class="method-call">public void dreheRoboter(int richtung)</span>, die den Roboter in die angegebene Richtung dreht (0=Blick nach rechts, 90=Blick nach unten, ...). Mit <span class="method-call">getRotation()</span> kann man die aktuelle Richtung erfragen.<br>
*Tipp1: Drehe den Roboter so lange, bis "richtung" erreicht ist.* <br>
</li>
</ol>
</div>
<div>
<iframe src="https://drive.google.com/file/d/1iQtAUeevWgcLDD2mcb5Ep-YRBiuQ3v6Z/preview" width="300" height="350"></iframe>
</div>
</div>
<ol style="list-style-type: none;"><li>
<input type="checkbox" id="checkAB9Aufgabe3" onchange="document.twine.showNextTask(this, 'AB9Aufgabe4', 'label-AB9Aufgabe3')"/><label id="label-AB9Aufgabe3" for="checkAB9Aufgabe3" style="color:#FD2C4A;">**Ich habe die Methode vervollständigt.**</label></li></ol>
</div><br><br>
<!-- Aufgabe 4 -->
<div id="AB9Aufgabe4" style="display: none;">
Wie du schon richtig erkannt hast, schauen wir nun nicht mehr auf die Roboterwelt von oben, sondern wir betrachten einen Querschnitt eines Bergwerks. Hier spielt – wie im wirklichen Leben – die Schwerkraft eine wichtige Rolle. Pass auf, dass deine Roboter nicht in den Aufzugschacht fallen.<br>
<div class="aufgabe">
<ol start="4">
<li>
<strong>Laufe zu: </strong> Vervollständige die Methode <span class="method-call">public void laufeZuXPos(int x)</span>, die den Roboter zu der angegebenen x-Koordinate laufen lässt. Die y-Position kann sich auch aufgrund der Schwerkraft verändern.<br>
*Tipp: Durch Rechtsklick auf die Welt (blauer Hintergrund) kannst du die Methode <span class="method-call">zeigeKoordinaten()</span> aufrufen, somit erkennst du schnell, wie die Koordinaten eines Feldes lauten.*<br><br>
<input type="checkbox" id="checkAB9Aufgabe4" onchange="document.twine.showNextTask(this, 'AB9Aufgabe5', 'label-AB9Aufgabe4')"/><label id="label-AB9Aufgabe4" for="checkAB9Aufgabe4" style="color:#FD2C4A;">**Ich kann jetzt meinen Roboter zu einer x-Position laufen lassen.**</label>
</li>
</ol>
</div>
</div>
<!-- Aufgabe 5 -->
<div id="AB9Aufgabe5" style="display: none;">
Der alte Grubenaufzug funktioniert etwas eigentümlich und muss noch programmiert werden. Bisher muss ein Roboter nach unten bzw. nach oben schauen und einsVor gehen, damit der Aufzug ein Stockwerk nach unten bzw. nach oben fährt.<br>
<div class="aufgabe">
<ol start="5">
<li>
<strong>Fahre Aufzug:</strong>Vervollständige die Methode <span class="method-call">public void fahreAufzug(int stockwerke, boolean abwaerts)</span>, die einen Roboter, der auf einem Aufzug steht (istAufGegenstand(“Aufzug“)?), die angegebene Anzahl von Stockwerken (ein Stockwerk entspricht einem Schritt) abwärts oder aufwärts fahren lässt. Diese Methode soll funktionieren, egal in welche Richtung der Roboter am Anfang schaut. Steht der Roboter nicht auf einem Aufzug, soll nichts passieren.<br>
*Bedenke: Die Roboter können in leere Aufzugsschächte stürzen, da man in diesem Level nicht von oben sondern von vorne auf die Welt schaut.*<br><br>
<input type="checkbox" id="checkAB9Aufgabe5" onchange="document.twine.showNextTask(this, 'AB9Aufgabe6', 'label-AB9Aufgabe5')"/><label id="label-AB9Aufgabe5" for="checkAB9Aufgabe5" style="color:#FD2C4A;">**Mein Roboter kann jetzt Aufzug fahren.**</label>
</li>
</ol>
</div>
</div>
<!-- Aufgabe 6 -->
<div id="AB9Aufgabe6" style="display: none;">
<div class="aufgabe">
<ol start="6">
<li>
<strong>Fahre ins Stockwerk:</strong> Implementiere die Methode <span class="method-call">public void fahreInsStockwerk(int stockwerk)</span>. Dabei werden die Stockwerke vom Boden ab abwärts gezählt (blaue Koordinate).<br><br>
<input type="checkbox" id="checkAB9Aufgabe6" onchange="document.twine.showNextTask(this, 'AB9Aufgabe7', 'label-AB9Aufgabe6')"/><label id="label-AB9Aufgabe6" for="checkAB9Aufgabe6" style="color:#FD2C4A;">**Mein Roboter kann jetzt in bestimmte Stockwerke fahren.**</label>
</li>
</ol>
</div>
</div>
<!-- Aufgabe 7 -->
<div id="AB9Aufgabe7" style="display: none;">
<div class="aufgabe">
<ol start="7">
<li>
<strong>Bombe sichern:</strong> Implementiere die Methode <span class="method-call">public void holeBombeUndKehreZurueck(int xBombe, int yBombe)</span>, die einen Roboter, der auf dem Aufzug steht, zur angegeben Position laufen lässt und dort eine Bombe einsammelt. Danach soll er zum Aufzug zurück kehren.<br><br>
<input type="checkbox" id="checkAB9Aufgabe7" onchange="document.twine.showNextTask(this, 'AB9Aufgabe8', 'label-AB9Aufgabe7')"/><label id="label-AB9Aufgabe7" for="checkAB9Aufgabe7" style="color:#FD2C4A;">**Ich habe die Bombe gesichert.**</label>
</li>
</ol>
</div>
</div>
<div id="AB9Aufgabe8" style="display: none;">
<div class="aufgabe">
<ol start="8">
<li>
<strong>Sprengen:</strong> Nun soll ein AB9-Roboter einen Bereich im Bergwerk sprengen. Implementiere dazu die Methode <span class="method-call">public void sprenge(int xPos, int yPos)</span>, die einen Roboter, der auf dem Aufzug steht, zur übergebenen (x|y)-Position laufen lässt und mit <span class="method-call">benutze("Bombe")</span> die Bombe zündet.<br><br>
<input type="checkbox" id="checkAB9Aufgabe8" onchange="document.twine.showNextTask(this, 'AB9Aufgabe9', 'label-AB9Aufgabe8')"/><label id="label-AB9Aufgabe8" for="checkAB9Aufgabe8" style="color:#FD2C4A;">**Ich habe die Methode getestet und einen Bereich gesprengt.**</label>
</li>
</ol>
</div>
</div>
<!-- Aufgabe 9 -->
<div id="AB9Aufgabe9" style="display: none;">
<div class="aufgabe" style="display: inline-block; vertical-align: top; width: 60%;">
<ol start="9">
<li>
<strong>Legen:</strong> Der Roboter soll einen Raum mit einer Zweierreihe von Brennstäben (von denen er ausreichend dabei hat) belegen. Mit der Methode <span class="method-call">legen (String name)</span> legt der Roboter einen Gegenstand auf dem Feld vor sich ab. Implementiere eine Methode, die als Parameter die Breite des Raumes bekommt. Die Schwerkraft bewirkt, dass ein abgelegter Brennstab nach unten rutscht. D.h. legt man einen Brennstab ab, rutscht dieser runter, wenn kein Fels oder anderer Gegenstand sich unter dem Roboter befindet. Beachte, dass der Roboter sich nicht mehr nach oben bewegen kann.<br><br>
<input type="checkbox" id="checkAB9Aufgabe9" onchange="document.twine.showNextTask(this, 'Ende', 'label-AB9Aufgabe9')"/><label id="label-AB9Aufgabe9" for="checkAB9Aufgabe9" style="color:#FD2C4A;">**Ich habe den Raum mit Brennstäben belegt.**</label>
</li>
</ol>
</div>
<iframe src="https://drive.google.com/file/d/1CWOsFEmD6DINh2FWL335VhVAvJCq2-_e/preview" style="display: inline-block; width: 35%; height: 300px; vertical-align: top; border: 1px solid black; margin-left: 5%;"></iframe>
</div>
<!-- Link zur nächsten Passage -->
<span id="Ende" style="display: none;"> [[Der Einsatzleiter kommt ins Spiel-> Aufgaben AB9-3]]</span>
}
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.showNextTask = function(checkbox, nextTaskID, labelID) {
if (checkbox.checked) {
$(`#${nextTaskID}`).show();
document.getElementById(labelID).style.color = "#108300";
} else {
$(`#${nextTaskID}`).hide();
document.getElementById(labelID).style.color = "#FD2C4A";
}
}
</script>
{
<!-- Workaround damit der Beginn der Seite angezeigt wird, ansonsten ist das erste Input-Tag fokussiert und es wird dorthin gescrollt -->
<input type="hidden" autofocus="true" />
## Der Einsatzleiter
<div>
Nun kommt der Einsatzleiter ins Spiel. Das ist das kleine Männchen oben rechts. Der Einsatzleiter kennt die vier Roboter. Der erste ganz links heißt <span class="method-call">aufzugRoboter</span>, der rechts daneben <span class="method-call">sprengRoboter1</span>, dann <span class="method-call">sprengRoboter2</span> und unten steht der <span class="method-call">legeRoboter</span>.
</div><br>
<iframe src="https://drive.google.com/file/d/1Jcj-F1W6MvkhfeTFZE5FDfmuvxQD9os2/preview" width="400" height="150"></iframe>
<br>
Im Folgenden muss der Einsatzleiter jeweils Methoden bei einem der vier Roboter aufrufen. Im Quelltext schreibt man dazu beispielsweise folgenden Befehl:<br><br>
<center><span class="method-call">
sprengRoboter2.fahreAufzug(2,true);
</span></center><br>
<div>
Man schreibt also den Namen des Roboters, gefolgt von einem Punkt. Danach kommt der Name der Methode und die dazugehörigen Parameter. (color:orange)[(Merkhilfe für die Reihenfolge: Wer macht was?)]
*<u>Hinweis:</u> Drückt man die Tastenkombination STRG+Leertaste nach der Eingabe des Punktes, so bekommt man eine Liste aller Methoden, die man bei diesem Roboter aufrufen kann.*
</div><br>
<!-- Aufgabe 10 -->
<div class="aufgabe">
<ol start="10">
<li>
<strong>Sprengkommando:</strong> Öffne die Klasse EinsatzLeiter und vervollständige die Methode <span class="method-call">public void holeBombeUndSprenge (int xBombe, int yBombe, int xPos, int yPos)</span>. Dabei sind (xBombe|yBombe) die Koordinaten, wo sich eine Bombe befindet und (xPos|yPos) die Koordinaten der Sprengposition. Der Einsatzleiter soll dazu dem aufzugRoboter und dem sprengRoboter1 die passenden Befehle geben! (Wie das geht, siehst du im Quelltextbeispiel).<br><br>
<input type="checkbox" id="checkAB9Aufgabe10" onchange="document.twine.showNextTask(this, 'Ende', 'label-AB9Aufgabe10')"/><label id="label-AB9Aufgabe10" for="checkAB9Aufgabe10" style="color:#FD2C4A;">**Ich habe die Methode vervollständigt.**</label>
</li>
</ol>
</div>
}
<!-- Link zur nächsten Passage -->
<span id="Ende" style="display: none;"> [[EINSATZ-> Abschlussaufgabe AB9]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einsatz 9:
### Nun übernehmen Sie die Verantwortung – Einsatzleiter!
<div class="aufgabe">Im Folgenden soll dein Einsatzleiter den Einsatz im Endlager koordinieren. Die AB9-Roboter haben alles gelernt, was sie für diesen Einsatz benötigen:
Sie können in einem Stollen Sprengarbeiten vornehmen und einen freigewordenen Bereich mit Brennstäben belegen. Aber Achtung, die Ressourcen sind knapp – sowohl die Anzahl der Sprengsätze, als auch die Energie der Roboter. Die Arbeit unter Tage ist nicht nur für Menschen anstrengend...
Deine Aufgabe ist es nun, den Einsatzleiter so zu programmieren, dass sie den Robotern klare Anweisungen gibt, um die drei verschütteten Stollen zu erweitern. Der legeRoboter soll dann seine Brennstäbe wie unten abgebildet in den frei gewordenen Hohlräumen ablegen. Hoffentlich geht ihm dabei nicht die Puste aus. Alle Roboter müssen sich am Ende wieder im oberen Eingangsstollen befinden.</div>
<iframe src="https://drive.google.com/file/d/1AmPK4wDS2Z8eDd3vE_nbVBAC5FQqTFTM/preview" width="600" height="600"></iframe>
*<u><strong>Tipp:</strong></u> Im Bild sind die Sprengpositionen mit einem roten Kasten markiert.*
[[Levelabschluss-> Abschluss AB9]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.checkCheckbox = function() {
var checkboxes = document.querySelectorAll('input[type="checkbox"][id^="AB9-punkt"]');
var allChecked = true;
checkboxes.forEach(function(checkbox) {
if (!checkbox.checked) {
allChecked = false;
}
});
if (allChecked) {
$('#link').show();
} else {
$('#link').hide();
}
}
</script>
<h2>Zusammenfassung Level 9</h2>
<fieldset class="level-fieldset"><legend>Du hast in diesem Level...</legend>
<div class="level-checkbox">
<input type="checkbox" id="AB9-punkt1" name="AB9-punkt1" onchange="document.twine.checkCheckbox(this)"/> <label for="AB9-punkt1">gelernt, wie du flexibel einsetzbare Methoden implementierst, die eine Parametereingabe erfordern.
Die Signatur einer Methode die beispielsweise die Anzahl an Buchstaben in einem Wort zählt und zurückgibt sieht dann so aus:
<center><spann class="method-call">public int countLetters(String word)</span></center>
</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB9-punkt2" name="AB9-punkt2" onchange="document.twine.checkCheckbox(this)"/> <label for="AB9-punkt2">gelernt, wie du mit einem Objekt (in diesem Fall dem Einsatzleiter-Roboter) ein anderes Objekt (Hilfsroboter) steuern kannst.</label>
</div>
</fieldset>
<span id="link" style="display: none;">
<div> Gut gemacht =) Du hast nun das zehnte Level erreicht. Möchtest du direkt dorthin springen, benötigst du das folgende Codewort:
<center>**parameterMagier**</center>
</div>
[[Weiter ->Einleitung AB10]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
## Einleitung Einsatz 10:
{
<figure>
<iframe src="https://drive.google.com/file/d/1MULUvbsK5FwoDb8Shm-yfhXJFaumGddJ/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Dall-E, Prompt: An realistic foto of a diamond mine under the earth with robots working there</figcaption></figure>
<!-- Set the text to show -->(set: $typewriterText to "Eine Diamantminenfirma hat vom großen Erfolg des ReaktorRobots gehört und überlegt, ob sie nicht auch die gefährlichen Arbeiten in den Diamantenminen durch Roboter ausführen lassen soll, da es immer wieder zu Stolleneinbrüchen kommt oder gefährliche Sprengungen notwendig sind.
Eine letzte Aufgabe für unsere Rescue-Robots ... zum Glück kommen diese gerade aus dem Trainingslager. Schauen wir mal an, was sie dort gelernt haben.")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter -> Input AB10-1]]
</div>
(stop:)
]
]
}
}
[[Überspringen -> Input AB10-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>### Gezählte Wiederholungen ...
Unser letztes Ziel ist es jetzt **Zählschleifen** kennen zu lernen und (in mindestens einer Art) in Java implementieren zu können.
[[Input zu Zählschleifen-> Input AB10-2]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
## Gezählte Wiederholungen
#### umständliches Vorgehen
<div>Die Methode <span class="method-call">rundeDrehen()</span> in der Klasse AB10 wurde umständlich notiert:
<div style="display: flex; align-items: start;"><div style="flex: 1;"> <iframe src="https://drive.google.com/file/d/1BCb6gxQOQlwGSSIwJFj2D5SSXl7Ixh16/preview" width="300" height="300"></iframe></div><div>
Der Roboter umrundet gegen den Uhrzeigersinn ein von Wänden eingeschlossenes rechteckiges Feld.
Dabei macht er vier Mal das Gleiche. Sehr häufig sind einige Befehle zu wiederholen. Daher gibt es in den Programmiersprachen die Möglichkeit, solche Wiederholungen zu notieren.
</div></div>
#### effizientes Vorgehen:
<div style="display: flex; align-items: start;"><div style="flex: 1;"> Wir müssen dem Roboter mitteilen, was er wiederholen soll (<span class="method-call">laufeBisWand()</span> und <span class="method-call">dreheLinks()</span>) und wie oft. Dabei muss er selbst mitzählen, wie oft er es schon gemacht hat.
Er muss also SOLANGE die Befehle erneut ausführen wie die Rundenzahl kleiner ist als 4.
Die Wiederholungsrunden muss er zählen. </div> <div> <iframe src="https://drive.google.com/file/d/1YM7w0Xj7eYzLJJ3BPVCIg1WTh9RLfP1x/preview" width="300" height="300"></iframe> </div></div>
Dafür benötigt er innerhalb der Methode <span class="method-call">rundeDrehen()</span> eine Variable. Sie wird als ganzzahlige Variable mit dem Namen **anzGemacht** für die Wiederholung bereitgestellt: <span class="method-call">int anzGemacht;</span>.
Die Anweisung <span class="method-call">anzGemacht = 0;</span> legt den Anfangswert der Zählvariable auf Null fest. Bisher hat der Roboter auch noch keine Runde gedreht.
Der Wert dieses Wiederholungszählers muss bei jedem Schleifendurchgang um 1 erhöht werden. Daher findest du am Ende der zu wiederholenden Anweisungen den Erhöhe-Befehl für die Zählvariable: <span class="method-call">anzGemacht++;</span>.
Die Ausführungsbedingung (<span class="method-call">anzGemacht<4</span>) sorgt dafür, dass die Schleife genau viermal durchlaufen wird:
<ul><li>Das erste Mal mit dem Wert 0 für anzGemacht.</li><li> Das zweite Mal mit dem Wert 1.</li><li> Das dritte Mal mit dem Wert 2 sowie das vierte und letzte Mal mit dem Wert 3.</li></ul>
Möchte man etwas 13-mal wiederholen, dann geht das so:
<iframe src="https://drive.google.com/file/d/1PLf8jmzdkagzi9nbN1jYBTSigVOu4E3W/preview" width="600" height="150"></iframe>
Statt dem Namen <span class="method-call">i</span> könntest du auch einen Namen wie <span class="method-call">wdhZaehler</span> benutzen oder sonst einen Namen. Informatiker verwenden gern kurz und knapp <span class="method-call">i</span> als Zählvariable. Längere Namen blähen die Ausdrücke auf. Daher werden wir meist auch <span class="method-call">i</span> oder <span class="method-call">j</span> als Namen für Zählvariablen verwenden.
#### for-Schleifen
Wenn von Anfang an feststeht, wie oft etwas wiederholt werden muss, dann kann man Zählschleifen benutzen. Es gibt eine andere Formulierung für Zählschleifen, die wir aber nicht benutzen müssen, denn jede Wiederholung lässt sich wie gesehen mit <span class="method-call">while</span> formulieren. Diese spezielle Formulierung mit dem Schlüsselwort <span class="method-call">for</span> lautet:
<iframe src="https://drive.google.com/file/d/1-118uT5aF6BfPMgTB76Ib9bI2XS78Fa2/preview" width="600" height="150"></iframe>
Das Schlüsselwort <span class="method-call">for</span> erinnert an: für alle Wiederholungsdurchgänge ist Folgendes zu machen.
####Zusammenfassung:
Diese drei Schreibweisen sind gleichwertig. Nur die letzten beiden sind Java-Standard:<div style="display: flex;">
<iframe src="https://drive.google.com/file/d/180wK53n7PZD6u9JUQ-aYo35g_L7eLaO9/preview" style="flex: 1; margin-right: 10px; height: 300px;"></iframe>
<iframe src="https://drive.google.com/file/d/1K7e0vTZlr7i6R1tj8l3U95VVK9YnMdfc/preview" style="flex: 1; margin-right: 10px; height: 300px;"></iframe>
<iframe src="https://drive.google.com/file/d/1Vih6KXRbkUuRJyDDjwvqkszyKC85vDY_/preview" style="flex: 1; height: 300px;"></iframe>
</div></div>
[[zu den Reaktor Roboter Aufgaben ->Aufgaben AB10-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Schleifenquiz
[[Zu den ReaktorRoboter Aufgbaen ->Aufgaben AB10-1]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.showNextTask = function(checkbox, nextTaskID, labelID) {
if (checkbox.checked) {
$(`#${nextTaskID}`).show();
document.getElementById(labelID).style.color = "#108300";
} else {
$(`#${nextTaskID}`).hide();
document.getElementById(labelID).style.color = "#FD2C4A";
}
}
document.twine.showErklaerungAB10a2 = function() {
$('#AB10-Aufgabe2-Lösung').show();
}
document.twine.showErklaerungAB10a6 = function() {
$('#AB10-Aufgabe6-Lösung').show();
}
</script>
## Aufgaben
{
<div id="AB10Aufgabe1" style="display: block;">
<div class="aufgabe">
<ol start="1">
<li>
<strong>Patrouille:</strong> Teste mit dem Roboter unten links die Methode <span class="method-call">rundeDrehen()</span> und betrachte anschließend den Quelltext. Wie oft läuft er die Strecke ab? Ändere die Methode so, dass er 10x hin und herläuft, d.h. 10x nach rechts und 10x wieder nach links. Welche Zahl darf <span class="method-call">anzGemacht</span> nicht überschreiten, damit der Roboter genau 800x hin und herläuft?<br><br>
<input type="checkbox" id="checkAB10Aufgabe1" onchange="document.twine.showNextTask(this, 'AB10Aufgabe2', 'label-AB10Aufgabe1')"/><label id="label-AB10Aufgabe1" for="checkAB10Aufgabe1" style="color:#FD2C4A;">**Patrouille getestet.**</label>
</li>
</ol>
</div>
</div>
<div id="AB10Aufgabe2" style="display: none;">
<div class="aufgabe">
<ol start="2">
<li>
<strong>Warum wird die Variable <span class="method-call">anzGemacht</span> aus der Methode <span class="method-call">rundeDrehen()</span> nicht im Objektinspektor angezeigt?</strong><br><br>
<button onclick="document.twine.showErklaerungAB10a2()">Erklärung anzeigen</button>
<div id="AB10-Aufgabe2-Lösung" style="display: none;">(color:orange)[Es wird nicht angezeigt, da es sich um eine lokale Variable handelt. Diese wird nur im Debugger angezeigt.]<br><br>
<input type="checkbox" id="checkAB10Aufgabe2" onchange="document.twine.showNextTask(this, 'AB10Aufgabe3', 'label-AB10Aufgabe2')"/><label id="label-AB10Aufgabe2" for="checkAB10Aufgabe2" style="color:#FD2C4A;">**Verstanden.**</label></div>
</li>
</ol>
</div>
</div>
<div id="AB10Aufgabe3" style="display: none;">
<div class="aufgabe">
<ol start="3">
<li>
<strong>Verändere in der Methode <span class="method-call">rundeDrehen()</span> die Zählschleife so, dass du anstatt einer **while**-Schleife eine **for**-Schleife verwendest. Oben stehende Tabelle kann dir als Hilfe dienen. Der Roboter soll nach Methodenaufruf genau 5x hin und herlaufen.</strong><br><br>
<input type="checkbox" id="checkAB10Aufgabe3" onchange="document.twine.showNextTask(this, 'AB10Aufgabe4', 'label-AB10Aufgabe3')"/><label id="label-AB10Aufgabe3" for="checkAB10Aufgabe3" style="color:#FD2C4A;">**Verändert.**</label>
</li>
</ol>
</div>
</div>
<div id="AB10Aufgabe4" style="display: none;">
<div class="aufgabe">
<ol start="4">
<li>
<strong>Zu Befehl:</strong> Vervollständige die Methode <span class="method-call">dreheAnzahlRunden(int anz)</span> so, dass der Roboter anz-Runden dreht, je nach übergebenem Parameter für <span class="method-call">anz</span>. So lässt der Aufruf <span class="method-call">dreheAnzahlRunden(7);</span> den AB10 sieben Mal hin und herlaufen. Blöderweise kann ihm der Strom ausgehen... zum Glück hat er jedoch drei Akkus dabei. Ergänze die Methode <span class="method-call">dreheAnzahlRunden(int anz)</span> so, dass er seine Akkus sinnvoll einsetzt. <br>
*Tipp: mit if(getEnergie()<60) kann er überprüfen, ob sein Ladezustand ausreicht.*<br><br>
<input type="checkbox" id="checkAB10Aufgabe4" onchange="document.twine.showNextTask(this, 'AB10Aufgabe5', 'label-AB10Aufgabe4')"/><label id="label-AB10Aufgabe4" for="checkAB10Aufgabe4" style="color:#FD2C4A;">**Zu Befehl erledigt.**</label>
</li>
</ol>
</div>
</div>
<div id="AB10Aufgabe5" style="display: none;">
<div class="aufgabe">
<ol start="5">
<li>
<strong>Laufe x Schritte:</strong> Implementiere eine Methode, die den Roboter genau <span class="method-call">x</span> Schritte nach vorne laufen lässt.<br><br>
<input type="checkbox" id="checkAB10Aufgabe5" onchange="document.twine.showNextTask(this, 'AB10Aufgabe6', 'label-AB10Aufgabe5')"/><label id="label-AB10Aufgabe5" for="checkAB10Aufgabe5" style="color:#FD2C4A;">**x Schritte erledigt.**</label>
</li>
</ol>
</div>
</div>
<div id="AB10Aufgabe6" style="display: none;">
<div class="aufgabe">
<ol start="6">
<li>
<div style="display: flex; align-items: flex-start;">
<div>
<strong>Was tut es?:</strong> Analysiere das Verhalten der nebenstehenden Methode (Welche Aufgabe erledigt der Roboter?).<br>
Entscheide, welche der Schleifen sinnvoll durch eine For-Schleife ersetzt werden kann. Implementiere die Methode mit einer for-Schleife und benenne die Methode geeignet.<br>
Kann man durch einen geeigneten Aufruf der Methode alle Schrauben links unten auf einmal einsammeln?
</div>
<iframe src="https://drive.google.com/file/d/1XzUXO5EmMZHEOYYI-CqtcOIhhPAIFZqJ/preview" width="300" height="300" style="margin-left: 20px; border: 1px solid #ccc;"></iframe>
</div>
<br>
<button onclick="document.twine.showErklaerungAB10a6()">Erklärung anzeigen</button>
<div id="AB10-Aufgabe6-Lösung" style="display: none;">(color:orange)[Der Roboter läuft zwischen zwei Wänden hin und her. Anz gibt an, wie oft er das macht. Dabei sammelt er alle herumliegenden Gegenstände ein.<br>
Die äußere while-Schleife kann sinnvoll durch eine for-Schleife ersetzt werden, da es sich dabei um eine Zählschleife handelt. Die Anzahl der Durchläufe der inneren Schleife ist von den Gegebenheiten der Welt abhängig und daher nicht sinnvoll ersetzbar.
]<br><br>
<input type="checkbox" id="checkAB10Aufgabe6" onchange="document.twine.showNextTask(this, 'AB10Aufgabe7', 'label-AB10Aufgabe6')"/><label id="label-AB10Aufgabe6" for="checkAB10Aufgabe6" style="color:#FD2C4A;">**Verstanden.**</label></div>
</li>
</ol>
</div>
</div>
<div id="AB10Aufgabe7" style="display: none;">
<div class="aufgabe">
<ol start="7">
<li>
<strong>Aufräumen:</strong> Implementiere die Methode <span class="method-call">aufraeumen()</span>, die den Roboter rechts oben alle von oben herunterrutschende Fässer in die untere Kammer schieben lässt.<br><br>
<input type="checkbox" id="checkAB10Aufgabe7" onchange="document.twine.showNextTask(this, 'AB10Aufgabe8', 'label-AB10Aufgabe7')"/><label id="label-AB10Aufgabe7" for="checkAB10Aufgabe7" style="color:#FD2C4A;">**Aufgeräumt.**</label>
</li>
</ol>
</div>
</div>
<div id="AB10Aufgabe8" style="display: none;">
<div class="aufgabe">
<ol start="8">
<li>
<strong>Aufzug:</strong> Implementiere die Methoden <span class="method-call">fahreAufzug</span> und <span class="method-call">fahreInsStockwerk</span> von AB9 unter Verwendung einer for-Schleife. Entscheide in beiden Fällen, ob die while-Schleife oder die for-Schleife geschickter war.<br><br>
<input type="checkbox" id="checkAB10Aufgabe8" onchange="document.twine.showNextTask(this, 'AB10AufgabeEnd', 'label-AB10Aufgabe8')"/><label id="label-AB10Aufgabe8" for="checkAB10Aufgabe8" style="color:#FD2C4A;">**Aufzug implementiert.**</label>
</li>
</ol>
</div>
</div>
<div id="AB10AufgabeEnd" style="display: none;">
<div class="aufgabe">
<p><strong>Glückwunsch! Du hast alle Aufgaben abgeschlossen!</strong></p>
</div>
[[Weiter ->Geschichte AB10 Teil 2]]
</div>
}
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einsatz 10:
<figure>
<iframe src="https://drive.google.com/file/d/1MULUvbsK5FwoDb8Shm-yfhXJFaumGddJ/preview" width="600" height="400"></iframe>
<figcaption>Quelle: Dall-E, Prompt: An realistic foto of a diamond mine under the earth with robots working there</figcaption></figure><!-- Set the text to show -->(set: $typewriterText to "Die Diamantminenfirma möchte nun Ergebnisse sehen. Der ReaktorRobot soll im Bergwerk Diamanten einsammeln. Der ReaktorRobot soll dabei zunächst nur seine grundsätzliche Eignung für diese Aufgabe unter Beweis stellen:
Die Unwägbarkeiten in der Minenarbeit sind riesig. Daher ist es in diesem Szenario nicht notwendig, dass die Roboter die Aufgabe jedes Mal schaffen, sondern es reicht aus, wenn er es einmal bewältigt.
Sammeln alle Roboter zusammen mind. 10 Diamanten, überlegt sich die Firma den Einsatz der Roboter, bei mind. 15, werden die Roboter (vielleicht im Fortsetzungsszenario) speziell für diese Aufgabe trainiert, bei mind. 20 Diamanten ist der Roboter schon so als Bergbauarbeiter geeignet und wird sofort gekauft.")
<!-- Display (call) the Typewriter passage -->
{
<!-- Create a variable to track the position within the $typewriterText string -->
(set: $typewriterPos to 1)
<!-- Create a hook to hold the typed text -->
|typewriterOutput>[]
<!-- Set a delay of 5ms seconds per loop -->
(live: 5)[
<!-- Add the next character to the hook -->
(append: ?typewriterOutput)[(print: $typewriterText's $typewriterPos)]
<!-- Update the position -->
(set: $typewriterPos to it + 1)
<!-- If it's gone past the end, stop -->
(if: $typewriterPos is $typewriterText's length + 1)[
<br><div>
[[Weiter ->Abschlussaufgabe AB10]]
</div>
(stop:)
]
]
}
[[Überspringen->Abschlussaufgabe AB10]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>## Einsatz 10:
### Diamanten!
<div class="aufgabe">Es stehen dir 3 Roboter (roboter1, roboter2 und roboter3) zur Verfügung. Roboter 2 und 3 führen jeweils 2 Bomben mit sich. Der Einsatzleiter muss den Einsatz koordinieren. Wie sie zu ihrem Ziel kommen, ist dabei egal. Aber Achtung: Die Steine und Diamanten sind nicht immer an der gleichen Stelle. Sprengt man Stollenwände weg, fallen die Steine und Diamanten herunter. Stürzt der Roboter runter oder wird von einem fallenden Stein getroffen, verliert er Energie.</div>
<iframe src="https://drive.google.com/file/d/1fXO9zFKBqqYYC9puqEAsidHLYuo6LlcD/preview" width="600" height="600"></iframe>
<div>
<u><strong>Aufgabe:</strong></u> Implementiere beim Einsatzleiter die Methode <span class="method-call">public void einsatz10()</span>. Implementiere bei den AB10-Robotern notwendige Hilfsmethoden. Verwende dabei – wenn möglich – for-Schleifen.
</div>
[[Levelabschluss-> Abschluss AB10]]
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot A"))[
(if: (saved-games:) contains "Slot A")[
Slot A is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div><script type="text/javascript">
document.twine.checkCheckbox = function() {
var checkboxes = document.querySelectorAll('input[type="checkbox"][id^="AB10-punkt"]');
var allChecked = true;
checkboxes.forEach(function(checkbox) {
if (!checkbox.checked) {
allChecked = false;
}
});
if (allChecked) {
$('#link').show();
} else {
$('#link').hide();
}
}
</script>
<h2>Zusammenfassung Level 10</h2>
<a href="https://www.youtube.com/watch?v=hEyWqVfY4vo" target="_blank">Diamonds are a girl's best friend</a>
<fieldset class="level-fieldset"><legend>Du hast in diesem Level...</legend>
<div class="level-checkbox">
<input type="checkbox" id="AB10-punkt1" name="AB10-punkt1" onchange="document.twine.checkCheckbox(this)"/> <label for="AB10-punkt1">gelernt, wie du Zählschleifen einsetzen und in Java implementieren kannst.
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB10-punkt2" name="AB10-punkt2" onchange="document.twine.checkCheckbox(this)"/> <label for="AB10-punkt2">for-Schleifen kennen gelernt und dich mit deren Syntax beschäftigt.</label>
</div>
<div class="level-checkbox">
<input type="checkbox" id="AB10-punkt3" name="AB10-punkt3" onchange="document.twine.checkCheckbox(this)"/> <label for="AB10-punkt3">den Reaktor Roboter Lehrgang bewältigt und erfolgreich abgeschlossen.
**HERZLICHEN GLÜCKWUNSCH!**</label>
</div>
</fieldset>
<span id="link" style="display: none;"> [[Ende ->Ende]]</span>
<div id="saveLink">
(link:"Save game?")[
(if:(save-game:"Slot B"))[
(if: (saved-games:) contains "Slot B")[
Slot B is in the saved-games datamap!
]
](else: )[
Sorry, I couldn't save your game.
]
]
</div>
<center>
## This is
the
#END
</center>
<script type="text/javascript">
document.twine.checkCodewort = function(element) {
element.style.color = "white";
if (element.value.toLowerCase() == "befehlsmeister") {
$('#AB2link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else if (element.value.toLowerCase() == "methodenmonster") {
$('#AB3link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else if (element.value.toLowerCase() == "schleifenmeister") {
$('#AB4link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else if (element.value.toLowerCase() == "verzweigungsprofi") {
$('#AB5link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else if (element.value.toLowerCase() == "unterklasseheld") {
$('#AB6link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else if (element.value.toLowerCase() == "zählmeister") {
$('#AB7link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else if (element.value.toLowerCase() == "vererbungspro") {
$('#AB8link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else if (element.value.toLowerCase() == "wertweise") {
$('#AB9link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else if (element.value.toLowerCase() == "parametermagier") {
$('#AB10link').show();
element.style.background = "rgba(30, 200, 30, 0.8)";
} else {
element.style.background = "rgba(200, 30, 30, 0.8)";
}
}
</script>
##Levelsprungautomat
Gib das Codewort des entsprechenden Levels ein und drücke dann die Enter-Taste:
<input type="text" onchange="document.twine.checkCodewort(this)" />
[[zu AB1 ->Einleitung AB1]]
<span id="AB2link" style="display: none;">[[zu AB2 ->Einleitung AB2]]</span>
<span id="AB3link" style="display: none;">[[zu AB3 ->Einleitung AB3]]</span>
<span id="AB4link" style="display: none;">[[zu AB4 ->Einleitung AB4]]</span>
<span id="AB5link" style="display: none;">[[zu AB5 ->Einleitung AB5]]</span>
<span id="AB6link" style="display: none;">[[zu AB6 ->Einleitung AB6]]</span>
<span id="AB7link" style="display: none;">[[zu AB7 ->Einleitung AB7]]</span>
<span id="AB8link" style="display: none;">[[zu AB8 ->Einleitung AB8]]</span>
<span id="AB9link" style="display: none;">[[zu AB9 ->Einleitung AB9]]</span>
<span id="AB10link" style="display: none;">[[zu AB10 ->Einleitung AB10]]</span>
<script>
function EmbedTwineUpdateHeight(){
var passage = document.getElementsByTagName("tw-passage")[0];
if (passage === undefined){//SugarCube
passage = document.getElementById("passages");
}
var newHeight = passage.offsetHeight;
if(newHeight<500){newHeight=500;}
window.parent.postMessage(["setHeight", newHeight], "*");
console.log(newHeight);
}
setTimeout(EmbedTwineUpdateHeight, 50);
</script>