Robot Karol: Aufräumen (die ganze Fläche): Unterschied zwischen den Versionen

Aus MINT.lentner.net
Zur Navigation springen Zur Suche springen
 
(32 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 
[[Robot Karol | >>> zurück zur Übersicht von Robot Karol]]
 
[[Robot Karol | >>> zurück zur Übersicht von Robot Karol]]
 +
 
... Fortsetzung von '''Aufräumen (rundherum).'''
 
... Fortsetzung von '''Aufräumen (rundherum).'''
 +
===Version 5: Wie geht man denn durch den ganzen Raum zum Aufräumen?===
 +
[[Datei: karolraeum5.png |thumb|links|400px|In Schlangenlinien jeden Platz abklappern!]]
  
 +
'''Jetzt wird's knifflig!'''
  
 +
Wir gehen jetzt in Schlangenlinien durch den Raum und klappern alle Plätze ab. Da gibt's einige Stolperfallen:
  
===Version 1: Aufräumen rundherum===
+
Die Wenden im Süden sehen anders aus als im Norden.
[[Datei: karolraeum1.png |thumb|links|800px|Rundherum Aufräumen]]
 
 
 
Beim Bauen der Schwimmbäder haben wir schon gesehen: Wir wollen, dass '''unser Roboter Karol ja möglichst intelligent wird'''. Er sollte im Kapitel 1 (Version 3) sich auf unterschiedliche Raumgrößen selber einstellen können und entscheiden, wie er sich an die neuen Umstände richtig anpasst.
 
 
 
Im wirklichen Leben (denken wir an das '''autonome Fahren''') kommen noch viel mehr Unwägbarkeiten dazwischen. Ein anderes Auto fährt uns in die Parade! '''Unerwartete Hindernisse stehen im Weg ...'''
 
  
Karol soll trotzdem sein Schwimmbad bauen. Lassen wir für's Erste mal Ziegelsteine im Weg liegen. Dann kann Karol ja ''nicht einfach draufziegeln''! Wir erwarten, dass Karol die Hindernisse zuerst aus dem Weg räumt und dann erst zu bauen beginnt. Das Bewegen in einer schlampigen Welt, in der wir uns bewegen können und aufräumen müssen, können wir in folgendem Code organisieren. Das ist schon fast sowas, wie '''eine Programmbibliothek'''.
+
Je nach ungerade oder gerade vielen Spalten sieht das Ende völlig anders aus!
  
Karol kennt jetzt: ''GeheBisZurWand, GeheRundHerum, Räume, RäumeBisZurWand, RäumeRundHerum''
+
Das Räumen bei einer Wende sieht an der Ostseite (Am Ende) anders aus!
  
5 neue Befehle, die Karol versteht. Wir werden für eine bestimmte Aufgabe nicht immer alle Befehle benutzen, aber laden sie trotzdem immer als unseren Sprachschatz mit herein. Im Hauptprogramm können wir dann einfach immer benutzen, was grade anfällt:
+
Wenn Karol merkt, dass neben ihm eine Wand ist (er also an der Ostseite abbricht), er das aber in Nordrichtung '''und''' Südrichtung merkt (also links oder rechts), dann wird er auch an der Westwand abbrechen und gar nicht erst beginnen! Das heißt, '''wir müssen sicherstellen''', dass er '''die Wiederholungsschleife auf jeden Fall einmal durchläuft''', bevor er testet, ob er an einer Wand entlangläuft. Daher die '''Variante der Wiederholungsschleife mit Abbruchbedingung am Ende'''.  
  
'''Tipp:''' Standardmäßig lädt das Programm '''Aufräumen_1.kdp''' auch die Welt '''Aufräumen_1.kdw''' ins Programm. Da liegen nur einzelne Ziegel herum. Karol wird damit fertig. Aber probier' mal '''Aufräumen_1a.kdw''' ins Programm zu laden (Welt >>> Öffne Welt). Da liegen ganze Müllstapel rum. Aber auch damit wird Karol fertig!
+
Ihr könnt mit '''Aufräumen_5a.kdw''' und '''Aufräumen_5b.kdw''' Varianten reinladen, um Eure Versuche ausführlich zu testen.
 
<br style="clear:left; ">
 
<br style="clear:left; ">
 
+
//nix Neues - wie bei den vorigen Versionen
 
  Anweisung GeheBisZurWand solange NichtIstWand tue Schritt *solange *Anweisung
 
  Anweisung GeheBisZurWand solange NichtIstWand tue Schritt *solange *Anweisung
 
  Anweisung GeheRundHerum wiederhole 4 mal GeheBisZurWand LinksDrehen *wiederhole *Anweisung
 
  Anweisung GeheRundHerum wiederhole 4 mal GeheBisZurWand LinksDrehen *wiederhole *Anweisung
 
  Anweisung Räume solange IstZiegel tue Aufheben *solange *Anweisung
 
  Anweisung Räume solange IstZiegel tue Aufheben *solange *Anweisung
  Anweisung RäumeBisZurWand solange NichtIstWand tue Räume Schritt *solange *Anweisung
+
  Anweisung RäumeBisZurWand solange NichtIstWand tue Räume Schritt *solange *Anweisung<br>
 +
//Wir müssen an der Wand eine Wende machen - im Süden anders als im Norden - auch anders räumen als auf der Geraden
 +
//An der Ostwand angekommen, drehen wir uns nur um, ohne weiterzuschreiten
 +
Anweisung RäumeWende
 +
  wenn IstSüden dann
 +
      LinksDrehen
 +
      wenn NichtIstWand dann Räume Schritt *wenn
 +
      LinksDrehen
 +
  sonst
 +
      RechtsDrehen
 +
      wenn NichtIstWand dann Räume Schritt *wenn
 +
      RechtsDrehen
 +
  *wenn
 +
*Anweisung<br>
 +
//wieder wie in den alten Versionen
 
  Anweisung RäumeRundHerum wiederhole 4 mal RäumeBisZurWand LinksDrehen *wiederhole *Anweisung<br>
 
  Anweisung RäumeRundHerum wiederhole 4 mal RäumeBisZurWand LinksDrehen *wiederhole *Anweisung<br>
  RäumeRundherum
+
  //Wir müssen an der Ostwand merken, dass wir am Ende sind - mal in Nordrichtung - mal in Südrichtung
 +
Bedingung IstDanebenWand
 +
  schnell
 +
  falsch
 +
  RechtsDrehen wenn IstWand dann wahr *wenn LinksDrehen
 +
  LinksDrehen wenn IstWand dann wahr *wenn RechtsDrehen
 +
  langsam
 +
*Bedingung<br>
 +
Anweisung RäumeFläche
 +
  //Die hohe Kunst - die Wiederholungsbedingung am Ende, sonst bricht Karol am Anfang schon ab!
 +
  wiederhole
 +
      RäumeBisZurWand
 +
      RäumeWende
 +
  *wiederhole bis IstDanebenWand
 +
  //Nach Hause gehen
 +
  RäumeBisZurWand
 +
  wenn IstSüden dann LinksDrehen LinksDrehen GeheBisZurWand *wenn
 +
  LinksDrehen GeheBisZurWand LinksDrehen
 +
*Anweisung<br>
 +
RäumeFläche
  
Jetzt geht's ans's Bauen! :-)
+
Jetzt geht's an's Bauen! :-)
 
<br style="clear:left; ">
 
<br style="clear:left; ">
  
===Version 2: Jetzt wird - nach eventuellem Aufräumen vorher - ein Schwimmbad gebaut===
+
===Version 6: Jetzt kann - nach eventuellem Aufräumen vorher - komplett gepflastert werden===
 +
 
 +
[[Datei: karolraeum6.png |thumb|links|1200px|Die komplette Fläche "unter Kontrolle"!]]
  
[[Datei: karolraeum2.png |thumb|links|250px|Erst Aufräumen - <br>dann Schwimmbad bauen!]]
+
<br style="clear:left; ">
  
Ihr seht: Es sind nur zwei zusätzliche Anweisungen aus Kapitel 1 nötig und unser Karol kann jetzt schon:<br>''GeheBisZurWand, GeheRundHerum, Räume, RäumeBisZurWand, RäumeRundHerum, ZiegleBisZurWand, ZiegleRundherum''
+
'''Die Herkulesarbeit ist mit Version 5 erledigt!'''  
  
 +
Nur noch die Anweisungen '''ZiegleWende''' und '''ZiegleFläche''' müssen ergänzt werden. Das geht aber wie beim Räumen nur mit Hinlegen statt Aufheben. Bingo! :-)
 
<br style="clear:left; ">
 
<br style="clear:left; ">
 
 
  Anweisung GeheBisZurWand solange NichtIstWand tue Schritt *solange *Anweisung
 
  Anweisung GeheBisZurWand solange NichtIstWand tue Schritt *solange *Anweisung
 
  Anweisung GeheRundHerum wiederhole 4 mal GeheBisZurWand LinksDrehen *wiederhole *Anweisung
 
  Anweisung GeheRundHerum wiederhole 4 mal GeheBisZurWand LinksDrehen *wiederhole *Anweisung
 
  Anweisung Räume solange IstZiegel tue Aufheben *solange *Anweisung
 
  Anweisung Räume solange IstZiegel tue Aufheben *solange *Anweisung
  Anweisung RäumeBisZurWand solange NichtIstWand tue Räume Schritt *solange *Anweisung
+
  Anweisung RäumeBisZurWand solange NichtIstWand tue Räume Schritt *solange *Anweisung<br>
Anweisung RäumeRundHerum wiederhole 4 mal RäumeBisZurWand LinksDrehen *wiederhole *Anweisung
+
  Anweisung RäumeWende
Anweisung ZiegleBisZurWand solange NichtIstWand tue Hinlegen Schritt *solange *Anweisung
+
  wenn IstSüden dann
Anweisung ZiegleRundherum wiederhole 4 mal ZiegleBisZurWand LinksDrehen *wiederhole *Anweisung<br>
+
      LinksDrehen
  RäumeRundherum
+
      wenn NichtIstWand dann Räume Schritt *wenn
wiederhole 2 mal ZiegleRundHerum *wiederhole
+
      LinksDrehen
 
+
  sonst
'''Aber:''' Ist es nicht unrealistisch, dass Karol all die Steine tragen kann? Eventuell bekommst Du sogar Fehlermeldungen, dass er das nicht kann. Das kannst Du unter ''"Einstellungen >>> Karol"'' einstellen: "Ob er beliebig viel tragen kann" oder "ob er eine Maximalzahl an Ziegeln hat, jenseits derer ihn das Schmalz verlässt"! Also ...
+
      RechtsDrehen
 
+
      wenn NichtIstWand dann Räume Schritt *wenn
In der nächsten Version legen wir die Ziegel '''einfach links''' ab, dann muss er lediglich '''einen''' Ziegel immer schleppen. Das wird er ja wohl können! ...
+
      RechtsDrehen
 
+
  *wenn
<br style="clear:left; ">
 
 
 
===Version 3: Aufräumen und Bauen - Nicht schleppen sondern Steine links ablegen ===
 
 
 
[[Datei: karolraeum3.png |thumb|links|250px|Erst Aufräumen - <br>dann Schwimmbad bauen!]]
 
 
 
Man sieht schön, wie praktisch übersichtliche Bibliotheken sind!
 
 
 
Wir brauchen nur '''einmal''' in der Anweisung '''Räume''' den Befehl ''Aufheben'' durch die Passage ''Aufheben und links ablegen'' ersetzen. Alles Andere bleibt gleich, denn jede andere Tätigkeit benutzt ja unseren Befehl '''Räume''' (oder andere Anweisungen, die selber wiederum '''Räume''' nutzen). Würden wir das Aufheben in allen Anweisungen immer wieder '''im Orginal''' nutzen, müssten wir das '''Aufheben''' an jeder Stelle ausbessern!
 
 
 
<br style="clear:left; ">
 
 
 
Anweisung GeheBisZurWand solange NichtIstWand tue Schritt *solange *Anweisung
 
Anweisung GeheRundHerum wiederhole 4 mal GeheBisZurWand LinksDrehen *wiederhole *Anweisung<br>
 
Anweisung Räume
 
    //Aufheben und links ablegen
 
    solange IstZiegel tue Aufheben LinksDrehen Hinlegen RechtsDrehen *solange
 
 
  *Anweisung<br>
 
  *Anweisung<br>
Anweisung RäumeBisZurWand solange NichtIstWand tue Räume Schritt *solange *Anweisung
+
  Anweisung RäumeRundHerum wiederhole 4 mal RäumeBisZurWand LinksDrehen *wiederhole *Anweisung<br>
  Anweisung RäumeRundHerum wiederhole 4 mal RäumeBisZurWand LinksDrehen *wiederhole *Anweisung
+
  Bedingung IstDanebenWand
Anweisung ZiegleBisZurWand solange NichtIstWand tue Hinlegen Schritt *solange *Anweisung
 
Anweisung ZiegleRundherum wiederhole 4 mal ZiegleBisZurWand LinksDrehen *wiederhole *Anweisung<br>
 
RäumeRundherum
 
wiederhole 2 mal ZiegleRundHerum *wiederhole
 
 
 
Klappt hervorragend mit der Welt ''Aufräumen_3.kdw''.
 
 
 
'''Aber:''' Probiert mal Version 3 mit der Welt ''Aufräumen_2.kdw''!
 
 
 
Wenn am 2. Platz einer Wand ein Ziegel liegt, dann steht Karol beim Aufheben genau im Eck und legt den Ziegel links daneben ab. Links daneben ist aber in dem Fall ebenfalls am Rand! Beim Bauen ist dann der Bauplatz nicht sauber und Karol ziegelt über den Müll drüber!!!
 
 
 
In der nächsten Version heilen wir den Fehler dadurch, dass wir im Eck den Ziegel einfach daneben ablegen, dann passt alles!
 
 
 
<br style="clear:left; ">
 
 
 
===Version 4: Aufräumen und Bauen - Nicht schleppen sondern Steine links ablegen - diesmal immer richtig===
 
 
 
[[Datei: karolraeum4.png |thumb|links|250px|Erst Aufräumen - <br>dann Schwimmbad bauen!]]
 
 
 
Diesmal legt sich Karol beim Aufräumen die Steine nicht in den zukünftigen Weg! Wieder nur ein chirurgischer Eingriff an einer Stelle!
 
 
 
'''Aber:''' Woher weiß Karol im Eck, dass hinter ihm Wand ist? Dazu müsste er sich '''jedesmal''' umdrehen und schauen, ob dort eine Wand hinter ihm ist! Erstens kommt das ständig vor. Wir erstellen diesmal also eine eigene Bedingung ''"istImRückenWand"'', um das immer wieder abzufragen. Zweitens aber '''zappelt er an jeder Stelle, weil er ständig sich umdreht, und schaut, ob nicht da Wand ist!''' Man kann für solche Fälle den Befehl '''schnell''' benutzen. Dann unterdrückt das Programm das ständige Anzeigen jeder Bewegung (nur um etwas anzuschauen). Am Ende der Bedingung stellen wir wieder auf '''langsam''' und jede Bewegung wird wieder angezeigt.
 
 
 
<br style="clear:left; ">
 
 
 
Anweisung GeheBisZurWand solange NichtIstWand tue Schritt *solange *Anweisung
 
Anweisung GeheRundHerum wiederhole 4 mal GeheBisZurWand LinksDrehen *wiederhole *Anweisung<br>
 
  Bedingung IstImRückenWand
 
 
   schnell
 
   schnell
   LinksDrehen LinksDrehen
+
   falsch
   wenn IstWand dann wahr sonst falsch *wenn
+
   RechtsDrehen wenn IstWand dann wahr *wenn LinksDrehen
   LinksDrehen LinksDrehen
+
   LinksDrehen wenn IstWand dann wahr *wenn RechtsDrehen
 
   langsam
 
   langsam
 
  *Bedingung<br>
 
  *Bedingung<br>
  Anweisung Räume
+
  Anweisung RäumeFläche
   solange IstZiegel tue
+
   wiederhole
       wenn IstImRückenWand dann
+
       RäumeBisZurWand
        //Legt den Ziegel am Platz daneben ab
+
      RäumeWende
        Aufheben LinksDrehen Schritt RechtsDrehen Hinlegen RechtsDrehen Schritt LinksDrehen
+
  *wiederhole bis IstDanebenWand
      sonst
+
  RäumeBisZurWand
        Aufheben LinksDrehen Hinlegen RechtsDrehen
+
  wenn IstSüden dann LinksDrehen LinksDrehen GeheBisZurWand *wenn
      *wenn
+
   LinksDrehen GeheBisZurWand LinksDrehen
   *solange
 
 
  *Anweisung<br>
 
  *Anweisung<br>
Anweisung RäumeBisZurWand solange NichtIstWand tue Räume Schritt *solange *Anweisung
 
Anweisung RäumeRundHerum wiederhole 4 mal RäumeBisZurWand LinksDrehen *wiederhole *Anweisung
 
 
  Anweisung ZiegleBisZurWand solange NichtIstWand tue Hinlegen Schritt *solange *Anweisung
 
  Anweisung ZiegleBisZurWand solange NichtIstWand tue Hinlegen Schritt *solange *Anweisung
 
  Anweisung ZiegleRundherum wiederhole 4 mal ZiegleBisZurWand LinksDrehen *wiederhole *Anweisung<br>
 
  Anweisung ZiegleRundherum wiederhole 4 mal ZiegleBisZurWand LinksDrehen *wiederhole *Anweisung<br>
  RäumeRundherum
+
  Anweisung ZiegleWende
  wiederhole 2 mal ZiegleRundHerum *wiederhole
+
  wenn IstSüden dann
 
+
      LinksDrehen
Perfekt!
+
      wenn NichtIstWand dann Hinlegen Schritt *wenn
 
+
      LinksDrehen
<br style="clear:left; ">
+
  sonst
 +
      RechtsDrehen
 +
      wenn NichtIstWand dann Hinlegen Schritt *wenn
 +
      RechtsDrehen
 +
  *wenn
 +
*Anweisung<br>
 +
  Anweisung ZiegleFläche
 +
  Hinlegen Schritt LinksDrehen LinksDrehen Hinlegen LinksDrehen LinksDrehen
 +
  wiederhole
 +
      ZiegleBisZurWand
 +
      ZiegleWende
 +
  *wiederhole bis IstDanebenWand
 +
  ZiegleBisZurWand
 +
  wenn IstSüden dann LinksDrehen LinksDrehen GeheBisZurWand *wenn
 +
  LinksDrehen GeheBisZurWand LinksDrehen
 +
*Anweisung<br>
 +
RäumeFläche
 +
ZiegleFläche

Aktuelle Version vom 19. April 2021, 23:46 Uhr

>>> zurück zur Übersicht von Robot Karol

... Fortsetzung von Aufräumen (rundherum).

Version 5: Wie geht man denn durch den ganzen Raum zum Aufräumen?

In Schlangenlinien jeden Platz abklappern!

Jetzt wird's knifflig!

Wir gehen jetzt in Schlangenlinien durch den Raum und klappern alle Plätze ab. Da gibt's einige Stolperfallen:

Die Wenden im Süden sehen anders aus als im Norden.

Je nach ungerade oder gerade vielen Spalten sieht das Ende völlig anders aus!

Das Räumen bei einer Wende sieht an der Ostseite (Am Ende) anders aus!

Wenn Karol merkt, dass neben ihm eine Wand ist (er also an der Ostseite abbricht), er das aber in Nordrichtung und Südrichtung merkt (also links oder rechts), dann wird er auch an der Westwand abbrechen und gar nicht erst beginnen! Das heißt, wir müssen sicherstellen, dass er die Wiederholungsschleife auf jeden Fall einmal durchläuft, bevor er testet, ob er an einer Wand entlangläuft. Daher die Variante der Wiederholungsschleife mit Abbruchbedingung am Ende.

Ihr könnt mit Aufräumen_5a.kdw und Aufräumen_5b.kdw Varianten reinladen, um Eure Versuche ausführlich zu testen.

//nix Neues - wie bei den vorigen Versionen 
Anweisung GeheBisZurWand solange NichtIstWand tue Schritt *solange *Anweisung
Anweisung GeheRundHerum wiederhole 4 mal GeheBisZurWand LinksDrehen *wiederhole *Anweisung
Anweisung Räume solange IstZiegel tue Aufheben *solange *Anweisung
Anweisung RäumeBisZurWand solange NichtIstWand tue Räume Schritt *solange *Anweisung
//Wir müssen an der Wand eine Wende machen - im Süden anders als im Norden - auch anders räumen als auf der Geraden //An der Ostwand angekommen, drehen wir uns nur um, ohne weiterzuschreiten Anweisung RäumeWende wenn IstSüden dann LinksDrehen wenn NichtIstWand dann Räume Schritt *wenn LinksDrehen sonst RechtsDrehen wenn NichtIstWand dann Räume Schritt *wenn RechtsDrehen *wenn *Anweisung
//wieder wie in den alten Versionen Anweisung RäumeRundHerum wiederhole 4 mal RäumeBisZurWand LinksDrehen *wiederhole *Anweisung
//Wir müssen an der Ostwand merken, dass wir am Ende sind - mal in Nordrichtung - mal in Südrichtung Bedingung IstDanebenWand schnell falsch RechtsDrehen wenn IstWand dann wahr *wenn LinksDrehen LinksDrehen wenn IstWand dann wahr *wenn RechtsDrehen langsam *Bedingung
Anweisung RäumeFläche //Die hohe Kunst - die Wiederholungsbedingung am Ende, sonst bricht Karol am Anfang schon ab! wiederhole RäumeBisZurWand RäumeWende *wiederhole bis IstDanebenWand //Nach Hause gehen RäumeBisZurWand wenn IstSüden dann LinksDrehen LinksDrehen GeheBisZurWand *wenn LinksDrehen GeheBisZurWand LinksDrehen *Anweisung
RäumeFläche

Jetzt geht's an's Bauen! :-)

Version 6: Jetzt kann - nach eventuellem Aufräumen vorher - komplett gepflastert werden

Die komplette Fläche "unter Kontrolle"!


Die Herkulesarbeit ist mit Version 5 erledigt!

Nur noch die Anweisungen ZiegleWende und ZiegleFläche müssen ergänzt werden. Das geht aber wie beim Räumen nur mit Hinlegen statt Aufheben. Bingo! :-)

Anweisung GeheBisZurWand solange NichtIstWand tue Schritt *solange *Anweisung
Anweisung GeheRundHerum wiederhole 4 mal GeheBisZurWand LinksDrehen *wiederhole *Anweisung
Anweisung Räume solange IstZiegel tue Aufheben *solange *Anweisung
Anweisung RäumeBisZurWand solange NichtIstWand tue Räume Schritt *solange *Anweisung
Anweisung RäumeWende wenn IstSüden dann LinksDrehen wenn NichtIstWand dann Räume Schritt *wenn LinksDrehen sonst RechtsDrehen wenn NichtIstWand dann Räume Schritt *wenn RechtsDrehen *wenn *Anweisung
Anweisung RäumeRundHerum wiederhole 4 mal RäumeBisZurWand LinksDrehen *wiederhole *Anweisung
Bedingung IstDanebenWand schnell falsch RechtsDrehen wenn IstWand dann wahr *wenn LinksDrehen LinksDrehen wenn IstWand dann wahr *wenn RechtsDrehen langsam *Bedingung
Anweisung RäumeFläche wiederhole RäumeBisZurWand RäumeWende *wiederhole bis IstDanebenWand RäumeBisZurWand wenn IstSüden dann LinksDrehen LinksDrehen GeheBisZurWand *wenn LinksDrehen GeheBisZurWand LinksDrehen *Anweisung
Anweisung ZiegleBisZurWand solange NichtIstWand tue Hinlegen Schritt *solange *Anweisung Anweisung ZiegleRundherum wiederhole 4 mal ZiegleBisZurWand LinksDrehen *wiederhole *Anweisung
Anweisung ZiegleWende wenn IstSüden dann LinksDrehen wenn NichtIstWand dann Hinlegen Schritt *wenn LinksDrehen sonst RechtsDrehen wenn NichtIstWand dann Hinlegen Schritt *wenn RechtsDrehen *wenn *Anweisung
Anweisung ZiegleFläche Hinlegen Schritt LinksDrehen LinksDrehen Hinlegen LinksDrehen LinksDrehen wiederhole ZiegleBisZurWand ZiegleWende *wiederhole bis IstDanebenWand ZiegleBisZurWand wenn IstSüden dann LinksDrehen LinksDrehen GeheBisZurWand *wenn LinksDrehen GeheBisZurWand LinksDrehen *Anweisung
RäumeFläche ZiegleFläche