ef:grundlagen_python

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ef:grundlagen_python [2022/09/11 13:10] lehmannref:grundlagen_python [2024/09/03 15:15] (aktuell) lehmannr
Zeile 16: Zeile 16:
 | ''world(x,y,z)'' | Absolute Position in der Welt | | ''world(x,y,z)'' | Absolute Position in der Welt |
 | ''pos(x,y,z)'' | Relativ zum Spieler/Agenten bez. Himmelsrichtung | | ''pos(x,y,z)'' | Relativ zum Spieler/Agenten bez. Himmelsrichtung |
-| ''local_pos(x,y,z)'' | Relativ zum Spieler/Agenten bez. Blickrichtung |+| ''pos_local(x,y,z)'' | Relativ zum Spieler/Agenten bez. Blickrichtung |
  
 ** Der Agent ** ** Der Agent **
Zeile 24: Zeile 24:
 ** Den Agenten bauen lassen, oder direkt bauen ** ** Den Agenten bauen lassen, oder direkt bauen **
  
-Man kann nun den Agenten dazu bringen, etwas für uns zu bauen, oder man kann auch direkt (ohne die Verwendung der Agenten bauen). Die folgenden beiden Programme setzen jeweils einen Gold- und einen Diamantblock an die absoluten Positionen (0,-60,10) und (0,-60,11):+Man kann nun den Agenten dazu bringen, etwas für uns zu bauen, oder man kann auch direkt bauen (ohne die Verwendung der Agenten). Die folgenden beiden Programme setzen jeweils einen Gold- und einen Diamantblock an die absoluten Positionen (0,-60,10) und (0,-60,11):
  
 <sxh python;title:Blöcke direkt bauen> <sxh python;title:Blöcke direkt bauen>
Zeile 51: Zeile 51:
 | ''agent.set_assist(PLACE_FROM_ANY_SLOT, [TRUE/FALSE])'' | Automatisch nächstes Fach wählen, wenn ein Fach leer ist | | ''agent.set_assist(PLACE_FROM_ANY_SLOT, [TRUE/FALSE])'' | Automatisch nächstes Fach wählen, wenn ein Fach leer ist |
  
-Achtung: Wenn man im Kreativmodus ist, so ist das Material unlimitiert, d.h. es nimmt im Inventar des Spielers oder des Agenten nicht ab, wenn man baut.+Achtung: Im Kreativmodus ist das Material unlimitiert, d.h. das Material nimmt im Inventar des Spielers oder des Agenten nicht ab, wenn man baut.
 </collapse> </collapse>
 </callout> </callout>
Zeile 228: Zeile 228:
 </sxh> </sxh>
 <sxh python;title:eine weitere rekursive Funktion> <sxh python;title:eine weitere rekursive Funktion>
-ef rec2(x,y):+def rec2(x,y):
     if x<=1 or y>=30:     if x<=1 or y>=30:
         blocks.place(GOLD_BLOCK,pos(x,y,10))         blocks.place(GOLD_BLOCK,pos(x,y,10))
Zeile 234: Zeile 234:
         blocks.place(GRANITE, pos(x,y,10))         blocks.place(GRANITE, pos(x,y,10))
         rec2(x-1,y+2)         rec2(x-1,y+2)
-        rec2(x+1, y)+        rec2(x+1, y+1)
  
 rec2(30,4) rec2(30,4)
Zeile 242: Zeile 242:
 **Aufgaben B** **Aufgaben B**
   - Überlege dir, was der Agent genau baut, wenn man das oben angegebene Programm ''rec1'' ausführt. Wie könnte man das Programm ohne Rekursion programmieren?   - Überlege dir, was der Agent genau baut, wenn man das oben angegebene Programm ''rec1'' ausführt. Wie könnte man das Programm ohne Rekursion programmieren?
-  - Überlege dir dies auch für das Programm ''rec2''. Kannst du auch dieses Programm ohne Rekursion programmieren? 
   - Welcher fundamentale Unterschied besteht zwischen den beiden Programmen? Wie wirkt sich dies auch den Zeit- und Speicherbedarf aus?   - Welcher fundamentale Unterschied besteht zwischen den beiden Programmen? Wie wirkt sich dies auch den Zeit- und Speicherbedarf aus?
 </WRAP> </WRAP>
Zeile 391: Zeile 390:
 </callout> </callout>
  
-<callout type="warning" title="3. Listen (Arrays) erstellen, durchgehen und der range-Befehl">+<callout type="warning" title="4. Listen (Arrays) erstellen, durchgehen und der range-Befehl">
 {{fa>angle-double-down}}<button collapse="colllists" type="link">Bereich ausklappen/einklappen </button> {{fa>angle-double-down}}<button collapse="colllists" type="link">Bereich ausklappen/einklappen </button>
 <collapse id="colllists"> <collapse id="colllists">
-==== 3.1 Listen erstellen ====+==== 4.1 Listen erstellen ====
 Mit eckigen Klammern kann man in Python eine Liste erstellen. Dabei können die einzelnen Elemente der Liste ganz unterschiedliche Typen haben. Es können sogar selbst wieder Listen sein. Auf die einzelnen Elemente der Liste kann man zugreifen, indem man den Namen der Liste mit eckigen Klammern und dem Index angibt (der Index bezeichnet die Position des Elementes in der Liste - er beginnt bei 0. Gibt man als Index negative Zahlen an, so zählt Python vom letzten Element an rückwärts. D.h. das letzte Element der Liste ''Liste1'' erhält man mit ''Liste1[-1]'' Mit eckigen Klammern kann man in Python eine Liste erstellen. Dabei können die einzelnen Elemente der Liste ganz unterschiedliche Typen haben. Es können sogar selbst wieder Listen sein. Auf die einzelnen Elemente der Liste kann man zugreifen, indem man den Namen der Liste mit eckigen Klammern und dem Index angibt (der Index bezeichnet die Position des Elementes in der Liste - er beginnt bei 0. Gibt man als Index negative Zahlen an, so zählt Python vom letzten Element an rückwärts. D.h. das letzte Element der Liste ''Liste1'' erhält man mit ''Liste1[-1]''
 <code Python> <code Python>
Zeile 421: Zeile 420:
 </WRAP> </WRAP>
  
-==== 3.2 Der range-Befehl ====+==== 4.2 Der range-Befehl ====
 Sehr häufig möchte man eine regelmässige Liste von Zahlen erstellen: z.B. alle Zahlen von 1 bis 10 oder die Zahlen von 1 bis 100 in 2er-Schritten etc. Sehr häufig möchte man eine regelmässige Liste von Zahlen erstellen: z.B. alle Zahlen von 1 bis 10 oder die Zahlen von 1 bis 100 in 2er-Schritten etc.
 Dazu ist der range-Befehl sehr praktisch: Er erstellt eine Liste von einem Startwert bis zu einem Endwert mit einer bestimmten Schrittweite: Dazu ist der range-Befehl sehr praktisch: Er erstellt eine Liste von einem Startwert bis zu einem Endwert mit einer bestimmten Schrittweite:
Zeile 440: Zeile 439:
 Tipp: Mit dem Befehl ''player.say'' kannst du deine Listen anzeigen lassen. Beispiel: ''player.say(L1)'' Tipp: Mit dem Befehl ''player.say'' kannst du deine Listen anzeigen lassen. Beispiel: ''player.say(L1)''
 </WRAP> </WRAP>
-==== 3.3 Listen durchgehen ====+==== 4.3 Listen durchgehen ====
 Ganz oft will man für alle Elemente in einer Liste dasselbe tun, d.h. man will die Liste "abklappern" (durchgehen) und dann für jedes Element dieselbe Aktion durchfühen. Z.B. hat man eine Liste von Positionen und möchte bei jeder Position ein Haus bauen, oder man hat eine Liste von Baumaterialien und man möchte für jedes dieser Materialien einen Block platzieren etc.  Ganz oft will man für alle Elemente in einer Liste dasselbe tun, d.h. man will die Liste "abklappern" (durchgehen) und dann für jedes Element dieselbe Aktion durchfühen. Z.B. hat man eine Liste von Positionen und möchte bei jeder Position ein Haus bauen, oder man hat eine Liste von Baumaterialien und man möchte für jedes dieser Materialien einen Block platzieren etc. 
  
Zeile 465: Zeile 464:
     agent.move(FORWARD,zahl)     agent.move(FORWARD,zahl)
     agent.turn(richtung)     agent.turn(richtung)
-</code+</sxh
  
 Damit sieht unser Programm viel kürzer aus: Damit sieht unser Programm viel kürzer aus:
  
-<sxh python;title:Bessere Version mit Schleife>+<sxh python>
 def baueSpirale(richtung): def baueSpirale(richtung):
     for zahl in [1,2,3,4,5,6]:     for zahl in [1,2,3,4,5,6]:
Zeile 510: Zeile 509:
   - Schreibe eine Funktion ''LinieTre(n)'', welche eine Linie mit drei selbst gewählten Materialien baut, wobei es jeweils abwechselt mit allen drei Materialien.   - Schreibe eine Funktion ''LinieTre(n)'', welche eine Linie mit drei selbst gewählten Materialien baut, wobei es jeweils abwechselt mit allen drei Materialien.
   - Schreibe eine Funktion ''LinieDoppelt(n)'', welche eine Linie mit Höhe zwei Blöcke und Länge n baut. Das Baumaterial ist frei wählbar.    - Schreibe eine Funktion ''LinieDoppelt(n)'', welche eine Linie mit Höhe zwei Blöcke und Länge n baut. Das Baumaterial ist frei wählbar. 
-  - Schreibe eine Funktion ''LinieMitHöhe(n,h)'', welche eine Linie mit Höhe zwei Blöcke und Länge n und Höhe h baut. +  - Schreibe eine Funktion ''LinieMitHöhe(n,h)'', welche eine Linie mit Länge n und Höhe h baut. 
   - Schreibe eine Funktion ''quadrat(n)'', welche den Agenten dazu bringt, ein nicht ausgefülltes Quadrat der Länge n zu bauen.    - Schreibe eine Funktion ''quadrat(n)'', welche den Agenten dazu bringt, ein nicht ausgefülltes Quadrat der Länge n zu bauen. 
   - Schreibe eine Funktion ''quadratf(n)'' welche ein gefülltes Quadrat baut.   - Schreibe eine Funktion ''quadratf(n)'' welche ein gefülltes Quadrat baut.
Zeile 520: Zeile 519:
 </callout> </callout>
  
-<callout type="primary" title="4. Verzweigungen mit ''if'' und Schleifen mit ''while'' ">+<callout type="primary" title="5. Verzweigungen mit ''if'' und Schleifen mit ''while'' ">
 {{fa>angle-double-down}}<button collapse="collif" type="link">Bereich ausklappen/einklappen </button> {{fa>angle-double-down}}<button collapse="collif" type="link">Bereich ausklappen/einklappen </button>
 <collapse id="collif"> <collapse id="collif">
Zeile 540: Zeile 539:
 </sxh> </sxh>
 ==== Schleifen mit "while" ==== ==== Schleifen mit "while" ====
-Wir haben bereits die ''for''-Schleife gesehen, um Befehle zu wiederholen. Mit der ''while''-Schleife kann man das auch tun, wobei die Wiederholung nicht durch eine Liste gesteuert ist (wie bei der ''for''-Schleife) sondern durch eine Bedingung. Solange die Bedinugung wahr (True) ist, werden die Befehle wiederholt:+Wir haben bereits die ''for''-Schleife gesehen, um Befehle zu wiederholen. Mit der ''while''-Schleife kann man das auch tun, wobei die Wiederholung nicht durch eine Liste gesteuert ist (wie bei der ''for''-Schleife) sondern durch eine Bedingung. Solange die Bedinugung wahr (True) ist, werden die Befehle wiederholt (das folgende Beispiel funktioniert im Kreativ-Modus nicht, da dort die Anzahl der Materialien nicht abnimmt):
 <sxh python;title:while-Schleife> <sxh python;title:while-Schleife>
-agent.set_slot(1) +while agent.inspect(AgentInspection.BLOCK, FORWARD)==AIR:  # solange AIR vor ihm ist 
-while agent.get_item_count(1)>0:  # solange noch etwas im Fach 1 ist +    agent.move(FORWARD, 1
-    agent.place(BACK # Material bauen + 
-    agent.move(FORWARD,1)  # nach vorne gehen+while agent.detect(AgentDetection.BLOCKFORWARD) # solange ein Block for ihm ist 
 +    agent.turn_left()
 </sxh> </sxh>
- 
 </collapse> </collapse>
 </callout> </callout>
Zeile 559: Zeile 558:
   - Erstelle eine Funktion ''scan()'', welche den Bereich (0,-60,0) bis (20,-60,20) abklappert, alle gefundenen Blöcke zerstört und speichert und dann dasselbe an der Position (100,-60,0) bis (100,-60,20) baut.    - Erstelle eine Funktion ''scan()'', welche den Bereich (0,-60,0) bis (20,-60,20) abklappert, alle gefundenen Blöcke zerstört und speichert und dann dasselbe an der Position (100,-60,0) bis (100,-60,20) baut. 
   - Schreibe eine Funktion ''kugel(n)'', welche eine Kugel baut mit "Radius" n, ohne dabei die Funktion shapes.sphere vom Code-Builder zu nutzen.   - Schreibe eine Funktion ''kugel(n)'', welche eine Kugel baut mit "Radius" n, ohne dabei die Funktion shapes.sphere vom Code-Builder zu nutzen.
-  - Schreibe eine Funktion ''house()'', welche ein Haus baut.Siehe dabei auch den Tipp unten+  - Schreibe eine Funktion ''house(...)'', welche ein Haus baut.! 
 </WRAP> </WRAP>
  
  • ef/grundlagen_python.1662894609.txt.gz
  • Zuletzt geändert: 2022/09/11 13:10
  • von lehmannr