Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Einführung in MSWLogo Autor: H. Sporenberg. Nach dem Start erscheinen zwei Felder 1. Graphik- Ausgabefenster 2. Das Commander – Feld (Befehlsfeld) Um.

Ähnliche Präsentationen


Präsentation zum Thema: "Einführung in MSWLogo Autor: H. Sporenberg. Nach dem Start erscheinen zwei Felder 1. Graphik- Ausgabefenster 2. Das Commander – Feld (Befehlsfeld) Um."—  Präsentation transkript:

1 Einführung in MSWLogo Autor: H. Sporenberg

2 Nach dem Start erscheinen zwei Felder 1. Graphik- Ausgabefenster 2. Das Commander – Feld (Befehlsfeld) Um ein Programm zu schreiben, geht man Folgendermaßen vor: In der unteren Zeile des Commandfeldes gibt man ein: Edit „Programmname. Im Editor wird der Text geschrieben. File und dann Save and Exit anklicken Will man das Programm abspeichern, im Punkt File SaveAS anklicken. Zum Start des Programms wird im unteren Command -Feld der Name des Pro-gramms eingegeben Einführung in MSWLogo Autor: H. Sporenberg

3 Durch den Befehl FORWARD 150 bzw. FD 150 zieht die Turtle eine Linie mit 150 Einheiten in Richtung der Pfeilspitze Mit BACK bzw. BK geschieht dasselbe rückwärts Mit Hilfe der Befehle RIGHT (RT) und LEFT (LT) ist es möglich, die Turtle zu drehen. Angegeben wird die Gradzahl. RIGHT 90 bedeutet, dass die Turtle sich um 90 Grad nach rechts dreht. Einführung in MSWLogo Befehle in MSWLogo Autor: H. Sporenberg

4 Befehle werden in der unteren Zeile im Commander- Window eingegeben. Beispiel: FORWARD 150 LEFT 90 Jeder eingegebene Befehl wird direkt ausgeführt. Mit Hilfe dieser Befehle lässt sich z.B. ein Quadrat zeichnen. Weitere Befehle: CLEARSCREEN – löscht alles auf dem Bildschirm HOME - bringt die Turtle in die Ausgangsposition ohne zu löschen Einführung in MSWLogo Befehle in MSWLogo Autor: H. Sporenberg

5 Einführung in MSWLogo Programme in MSWLogo Um mehrere Befehle nachein- ander ausführen zu lassen, fasst man diese zu einem Programm zusammen. Den Programmcode schreibt man im Editor. Dieser wird durch den Edall-Button aufgerufen. Ein Programm beginnt mit dem Schlüsselwort to und endet mit end. Jedem Programm muss ein Programmname zugeteilt werden Autor: H. Sporenberg

6 Einführung in MSWLogo Programme in MSWLogo Das Programmgerüst sieht dann wie folgt aus. to … … end Autor: H. Sporenberg

7 to quadrat cs setpensize[5 5] FD 150 Left 90 end Einführung in MSWLogo Programme in MSWLogo Als Beispiel sei ein Programm angegeben, das ein Quadrat mit der Seitenlänge 90 Pixel zeichnet. Der Aufruf geschieht in der Commandzeile mit dem Namen des Programms. Hier also: quadrat Autor: H. Sporenberg

8 Die beiden Befehle fd :laenge left 90 werden 4 mal aufgerufen. Dies kann durch eine REPEAT-Schleife verkürzt werden. Dabei werden die zu wiederholenden Befehle in eckige Klammern gesetzt. to quadrat cs setpensize[5 5] Repeat 4[ FD 150 Left 90] end Einführung in MSWLogo Programme in MSWLogo Autor: H. Sporenberg

9 Jetzt soll das Quadrat mit einer Farbe gefüllt werden. Dazu muss das Dreieck (Turtle) sich im Quadrat befinden. D.h., dass man mit Hilfe von left, right und forward das Dreieck (Turtle) in die umrandete Fläche bringen muss. Dann wird mit Hilfe des Befehls setfc[ ]fill die umrandete Fläche mit der angegebenen Farbe gefüllt. Einführung in MSWLogo Programme in MSWLogo Autor: H. Sporenberg

10 (1) setpensize[6 6] setpc[255 100 100] (2) repeat 4[fd 200 lt 90] (3) pu fd 10 lt 90 fd 10 (4) setfc[152 138 63]fill (5) home pd Einführung in MSWLogo Programme in MSWLogo (1) Hier werden die Dicke und die Farbe des Pen festgelegt setpensize[5 5]: Angabe der Dicke in eckigen Klammern, die beiden Zahlwerte müssen gleich sein, eine größere Zahl entspricht dabei einer größeren Pinselbreite setpc[255 100 100]: Festlegen der Pen-Farbe im RBG- Modus Autor: H. Sporenberg

11 (1) setpensize[6 6] setpc[255 100 100] (2) repeat 4[fd 200 lt 90] (3) pu fd 10 lt 90 fd 10 (4) setfc[152 138 63]fill (5) home pd Einführung in MSWLogo Programme in MSWLogo (2) Hier wird das Quadrat gezeichnet (3) Um das Innere des Quadrats einzufärben, muss der Cursor (= Dreieck = Turtle) in die umrandete Fläche gebracht werden. Damit man den Strich der Bewegung nicht sieht, wird der Pen angehoben (penup = pu). (4) Mit Hilfe dieses Befehls wird die Farbe eingestellt und dann mit fill die umschlossene Fläche eingefärbt (5) Mit home wird der Cursor in die Ausgangsposition gebracht. Dazu wird der Pen wieder abgesenkt (pendown = pd). Autor: H. Sporenberg

12 (1) setpensize[6 6] setpc[255 100 100] (2) repeat 4[fd 200 lt 90] (3) pu fd 10 lt 90 fd 10 (4) setfc[152 138 63]fill (5) home pd Einführung in MSWLogo Programme in MSWLogo Diesen Programmteil benutzt man jetzt, um mehrere Quadrate mit unterschiedlicher Stiftdicke und unterschiedlicher Farbfüllung zu zeichnen. Dazu muss der Cursor nach jedem Quadrat aber an eine andere Stelle der Zeichenfläche gebracht werden. Dieses geschieht mit folgender Befehlsfolge: home pd pu rt 90 fd 120 lt 90 fd 60 pd Hieran schließt sich dann die Befehlsfolge für das nächste Quadrat an. Die Drehungen und Bewegungen ändern sich natürlich mit dem unterschiedlichen Startpunkt des neuen Quadrats. Autor: H. Sporenberg

13 to Quadrate cs pd setpensize[8 8] setpc[100 100 100] repeat 4[fd 300 lt 90] pu fd 10 lt 90 fd 10 setfc[215 234 72]fill home pd pu rt 90 fd 120 lt 90 fd 60 pd setpensize[10 10] setpc[126 62 14] repeat 4[fd 320 lt 90] pu fd 10 lt 90 fd 10 setfc[240 54 21]fill home pd Einführung in MSWLogo Programme in MSWLogo f pu rt 90 fd 220 rt 90 fd 120 lt 180 pd setpensize[12 12] setpc[150 110 10] repeat 4[wait 50 fd 350 lt 90] pu fd 10 lt 90 fd 10 setfc[175 232 65]fill home pd end Das gesamte Programm Autor: H. Sporenberg

14 Einführung in MSWLogo Programme in MSWLogo f Und so sieht es aus Autor: H. Sporenberg

15 Einführung in MSWLogo Programme in MSWLogo f Konstruktion eines Hauses to haus cs setpensize[5 5] setpc 0 repeat 4[fd 200 lt 90] ;;Der Hauskörper wird mit einer Farbe gefüllt pu lt 45 fd 5 setfc[255 160 132] fill home pd ;; Giebel fd 200 lt 30 fd 200 lt 120 fd 200 lt 120 fd 200 ;; Hier wird der Giebel mit einer Farbe gefüllt pu lt 170 fd 50 setfc[255 10 10] fill home pd end Autor: H. Sporenberg

16 Einführung in MSWLogo Programme in MSWLogo f Konstruktion eines Hauses …… ;;Das ist das Fenster pu fd 100 lt 90 fd 125 rt 90 pd fd 40 rt 90 fd 40 rt 90 fd 40 rt 90 fd 40 pu home pd …… Um das Haus zu vervollständigen, kann man noch Fenster und Türen einfügen. Hier ist darauf zu achten, dass man die Befehle penup und pendown korrekt setzt. Um an den Beginn der Stelle für Fenster und Türen zu kommen, werden hier noch die Befehle fd, rt und lt verwendet. Autor: H. Sporenberg

17 Einführung in MSWLogo Programme in MSWLogo f Konstruktion eines Hauses mit setpos Um die Übersicht über die Koordinaten zu behalten, ist es ratsam, eine Skizze mit den entsprechenden Koordinaten anzufertigen (siehe Abb.) Mit Hilfe des Befehls setpos können die Koordinaten der Eckpunkte des Hausumrisses direkt erreicht werden. Die Koordinaten werden direkt als Zahlen angegeben Autor: H. Sporenberg

18 Einführung in MSWLogo Programme in MSWLogo f Konstruktion eines Hauses to HausOhneVariable cs setpensize[3 3] setpc 0 pu setpos[-80 0] pd setpos[80 0] setpos[80 150] setpos[-80 150] setpos[-80 0] pu setpos[80 150]pd setpos[0 300] setpos[-80 150] setpos[80 150] pu setpos[0 0]pd setpos[0 70] setpos[50 70] setpos[50 0] setpos[0 0] pu setpos[-40 10] setfc[255 0 0]fill setpos[10 20] setfc[0 255 0]fill setpos[0 170]setfc[0 0 255]fill pd ht end Die Koordinaten werden direkt als Zahlen angegeben Autor: H. Sporenberg

19 Einführung in MSWLogo Programme in MSWLogo f Konstruktion eines Hauses Möchte man jetzt mehrere Häuser an unterschiedlichen Stellen zeichnen, so müsste nach der bisherigen Methode für jedes Haus ein entsprechendes Programm schreiben, da die Koordinaten der Häuser unterschiedlich sind. Einfacher und sinnvoller ist es jedoch, einen Punkt des als variablen Punkt zu definieren. Alle anderen Punkte können dann entsprechend berechnet werden. Hier soll als variablen Punkt der untere linke Punkt genommen werden (das ist hier: -80/0). Im Prinzip kann jeder Eckpunkt genommen werden Die Koordinaten werden mit Hilfe von Variablen angegeben Autor: H. Sporenberg

20 Einführung in MSWLogo Programme in MSWLogo f Konstruktion eines Hauses Der untere linke Punkt habe die Koordinaten xko und yko. Dann lauten die Koordinaten des rechten unteren Punktes: xko+160 und yko. So kann jeder Eckpunkt ausgehend vom linken unteren Punkt mit Hilfe der Koordinaten xko und yko berechnet werden. Die Koordinaten werden mit Hilfe von Variablen angegeben Autor: H. Sporenberg

21 Einführung in MSWLogo Programme in MSWLogo f Konstruktion eines Hauses to HausMitVariable :xko :yko setpensize[3 3] setpc 0 pu setpos(list :xko :yko) pd setpos(list :xko+160 :yko) setpos(list :xko+160 :yko+150) setpos(list :xko :yko+150)setpos(list :xko :yko) pu setpos(list :xko :yko+151)pd setpos(list :xko+160 :yko+151) setpos(list :xko+80 :yko+300)setpos(list :xko :yko+151) pu setpos(list :xko+80 :yko)pd setpos(list :xko+130 :yko)setpos(list :xko+130 :yko+80) setpos(list :xko+80 :yko+80) setpos(list :xko+80 :yko) pu setpos(list :xko+70 :yko+10) setfc[255 0 0]fill setpos(list :xko+80 :yko+160)setfc[0 255 0]fill setpos(list :xko+100 :yko+10)setfc[0 0 255]fill pd ht end Autor: H. Sporenberg

22 Einführung in MSWLogo Programme in MSWLogo f Konstruktion eines Hauses Fügt man jetzt noch ein Hauptprogramm ein, in dem mehrere Aufrufe mit unterschiedlichen Koordinaten enthalten sind, so erhält man folgendes Bild: to main cs pd HausMitVariable -400 0 HausMitVariable -200 0 HausMitVariable 0 0 HausMitVariable 200 0 end Die Koordinaten werden mit Hilfe von Variablen angegeben Autor: H. Sporenberg

23 Einführung in MSWLogo Programme in MSWLogo f Der Kreis Mit dem Befehl circle 50 wird an der Stelle, wo sich die Turtle befindet, ein Kreis mit dem Radius 50 Pixel gezeichnet. (1) to kreis (2) cs (3) Pu fd 50 (4) pd circle 60 (5) pu setfc[255 255 0]fill (6) end Autor: H. Sporenberg

24 Einführung in MSWLogo Programme in MSWLogo f Die olympischen Ringe to ringe pu rt 90 bk 200 setpc[255 0 0] pd circle 100 pu fd 220 setpc[100 100 100] pd circle 100 pu fd 220 setpc[0 0 255] pd circle 100 Autor: H. Sporenberg pu home back 100 rt 90 bk 100 setpc[255 255 0] pd circle 100 pu home back 100 rt 90 fd 100 setpc[0 255 0] pd circle 100 end

25 Einführung in MSWLogo Programme in MSWLogo f Die olympischen Ringe Autor: H. Sporenberg

26 Einführung in MSWLogo Programme in MSWLogo f Der rollende Ball Ein Ball, dargestellt durch einen Kreis, soll sich von links nach rechts bewegen. Der Algorithmus sieht folgendermaßen aus: (1) to main (2) cs (3) setpensize[4 4] (4) setpencolor[100 50 180] (5) setactivearea [-350 -100 350 100] (6) make "append "false (7) make "xwert -300 (8) make "ywert 0 (9) pu setpos(list :xwert :ywert) (10) repeat 50[ kreisbewegung :xwert :ywert (gifsave "kreise.gif 0 (10a) :append 0) make "append "true pu make "xwert :xwert+10 wait 1] (11)end (1) to kreisbewegung :xwert :ywert (2) cs (3) setpos(list :xwert :ywert) (4) pd circle 60 (5) pu setfc[255 255 0]fill (6) end Autor: H. Sporenberg

27 Einführung in MSWLogo Programme in MSWLogo f Der rollende Ball Vorbereitungen in den Zeilen 2 bis 4. In Zeile 5 wird die aktive Zeichenfläche festgelegt. Die Variable append wird in Zeile 6 auf false gesetzt (wird für die gif-Abspeicherung benötigt). Die Anfangskoordinaten des ersten Kreises werden in 6 und 7 festgelegt. Der Stift wird in 9 an die Stelle des ersten Kreises bewegt. In einer repeat-Schleife wird jetzt 50 mal der Kreis mit dem Mittelpunkt in xwert und ywert gezeichnet. Dann wird mit Hilfe von gifsave der gezeichnete Kreis gespeichert. Anschließend wird die append-Variable auf true gesetzt. Die Variable xwert wird jetzt um 10 erhöht (damit liegt der neue Mittelpunkt um 10 Pixel weiter rechts) und die Schleife wird wiederholt. Das Löschen des gerade gezeichneten Kreises geschieht in der Prozedur Kreisbewegung durch den Befehl cs. ( 1) to main (2) cs (3) setpensize[4 4] (4) setpencolor[100 50 180] (5) setactivearea [-350 -100 350 100] (6) make "append "false (7) make "xwert -300 (8) make "ywert 0 (9) pu setpos(list :xwert :ywert) (10) repeat 50[ kreisbewegung :xwert :ywert (gifsave "kreise.gif 0 (10a) :append 0) make "append "true pu make "xwert :xwert+10 wait 1] (11)end ( 1) to kreisbewegung :xwert :ywert (2) cs (3) setpos(list :xwert :ywert) (4) pd circle 60 (5) pu setfc[255 255 0]fill (6) end Autor: H. Sporenberg

28 Einführung in MSWLogo Programme in MSWLogo f Der rollende Ball Das Ergebnis der Repeat-Schleife ist die Gif-Datei des sich von links nach rechts bewegenden Kreises. Autor: H. Sporenberg

29 Beispiel to Quadrat :Laenge cs setpensize[5 5] fd :Laenge lt 90 end Mit Hilfe von Repeat verkürzt sich das Programm erheblich to Quadrat :Laenge cs setpensize[7 7] repeat 4[fd :Laenge lt 90] end Will man Quadrate beliebiger Seitenlänge zeichnen lassen, muss die Länge beim Aufruf als Variable eingegeben werden. Der Aufruf lautet dann: Quadrat 100 Einführung in MSWLogo Autor: H. Sporenberg

30 Beispiel to kreis :laenge setpensize[5 5] setpencolor[255 0 0] Repeat 60[ FD :laenge Left 6] end Zeichnen eines Kreises Will man einen Kreis zeichnen, geht man um eine bestimmte Länge nach vorn, dreht dann um einen best. Winkel usw. Dabei bestimmt die Größe des Winkels die Anzahl der Wiederholungen (wieso??). Einführung in MSWLogo Autor: H. Sporenberg

31 Programm to nEck :anzahl :laenge setpensize[5 5] setpencolor[255 0 0] Repeat :anzahl [FD :laenge Left 360/:anzahl] end Zeichnen eines regelmäßigen n-Ecks Bei Eingabe der Anzahl der Ecken und der Länge soll ein regelmäßiges n-Eck gezeichnet werden. Einführung in MSWLogo Autor: H. Sporenberg

32 Programm to Vieleck :anzahl :laenge setpensize[5 5] setpencolor[255 0 0] Repeat :anzahl [FD :laenge Left 360/:anzahl] stop end Es sollen 6 Quadrate um einen Mittelpunkt gedreht gezeichnet werden. to vieleNEcke :anzahl :laenge Clearscreen Repeat 4[Vieleck :anzahl :laenge Lt 90] end Einführung in MSWLogo Autor: H. Sporenberg

33 Erzeuge mit Hilfe des Programms Vieleck die unten dargestellten Figuren Einführung in MSWLogo Autor: H. Sporenberg

34 Die Lösung to vieleNEcke1 :laenge :anzahl :Eckenzahl clearscreen Setpencolor[0 0 255] setpensize[2 2] Repeat :anzahl[Vieleck :laenge :Eckenzahl lt 360/:anzahl Back :laenge] end to Vieleck :laenge :Eckenzahl repeat :Eckenzahl[fd :laenge lt 360/:Eckenzahl] end Einführung in MSWLogo Autor: H. Sporenberg

35 Zur besseren Strukturierung empfiehlt es sich, mehrere Teilprogramme zu schreiben: 1.Das Hauptprogramm, kurz main genannt. In diesem sind alle Voreinstellungen vorzunehmen. 2.Das eigentliche Programm, in dem die Kurve gezeichnet wird. to main clearscreen setfc [150 150 150] fill setpensize[3 3] quadrat 200 end to quadrat :laenge epeat 4 [fd :laenge lt 90] end Einführung in MSWLogo Autor: H. Sporenberg

36 Die rekursive Programmierung Einführung in MSWLogo Eine spezielle Art der Program- mierung ist die Rekursion. Darun- ter versteht man ein Programm, das sich selber aufruft. Um sicher- zustellen, dass das Programm terminiert, muss eine Abbruch- bedingung eingefügt werden, die über eine veränderliche Variable das Programm anhält. to test :variable {dies ist die Abbruchbedingung, sobald die Variable größer ist als ein vorgegebener endwert, wird das Programm gestoppt.} if variable>endwert [stop] {hier werden die benötigten Anweisungen durchgeführt} test :variable+10 {dies ist der Selbstaufruf, der Wert der übergegebenen Variablen wird verändert} end Autor: H. Sporenberg

37 Das rekursive Programm müsste dann so aussehen: to VieleQuadrate :laenge if :laenge>100 [stop] repeat 4 [fd :laenge lt 90] VieleQuadrate :laenge+10 end Einführung in MSWLogo Die rekursive Programmierung Abbruchbedingung Anweisung(en) Selbstaufruf Autor: H. Sporenberg

38 In diesem Beispiel wird rekursiv eine bestimmte Anzahl von Quadraten gezeichnet, abhängig von der Länge der Seite. Das Programm für das Zeichnen eines Quadrates sieht dann so aus: to quadrat :laenge repeat 4 [fd :laenge lt 90] end Einführung in MSWLogo Die rekursive Programmierung Autor: H. Sporenberg

39 Das rekursive Programm müsste dann so aussehen: to VieleQuadrate :laenge if :laenge<0 [stop] quadrat :laenge VieleQuadrate :laenge-10 end to quadrat :laenge repeat 4 [fd :laenge lt 90] end Einführung in MSWLogo Die rekursive Programmierung Autor: H. Sporenberg

40 to VieleQuadrate :laenge If :laenge<20 [Stop] quadrat :laenge PU FD 20 LT 90 FD 20 RT 90 PD VieleQuadrate :laenge-40 end Einführung in MSWLogo Die rekursive Programmierung Autor: H. Sporenberg

41 to VieleKreise :schritt if :schritt<3 [Stop] kreis :schritt VieleKreise :schritt-3 End to Kreis :schritt REPEAT 36[FD :schritt RT 10] end Einführung in MSWLogo Die rekursive Programmierung Autor: H. Sporenberg

42 to Kreis :schritt REPEAT 36[FD :schritt wait 2 RT 10] end to kreise :schritt If :schritt<3 [Stop] kreis :schritt PU RT 90 FD 36/3.14 LT 90 PD kreise :schritt-2 end Die Zielscheibe Einführung in MSWLogo Autor: H. Sporenberg

43 Rekursive Strukturen to Baum2 :laenge wait 10 ifelse :laenge<20 [stop] [wait 10 FD :laenge wait 10 RT 45 wait 10 baum2 :laenge/2 wait 10 LT 90 wait 10 baum2 :laenge/2 wait 10 RT 45 wait 10 BK :laenge wait 10 ] end Einführung in MSWLogo Autor: H. Sporenberg

44 Bäume to Baum1 :laenge ifelse :laenge<10 [stop][FD :laenge RT 45 baum1 :laenge/2 LT 90 baum1 :laenge/2 RT 45 BK :laenge] end Rekursive Strukturen – mit IFELSE to main clearscreen setfc [0 0 0] fill setpensize[4 4] penup Back 150 pendown baum1 200 end Einführung in MSWLogo Autor: H. Sporenberg

45 to Baum3 :laenge if :laenge<20 [stop] FD :laenge RT 45 baum3 :laenge/2 LT 90 baum3 :laenge/2 RT 45 BK :laenge end Rekursive Strukturen – mit IF to main clearscreen setfc [0 0 0] fill setpensize[4 4] penup Back 150 pendown baum3 200 end Einführung in MSWLogo Autor: H. Sporenberg Der Binär-Baum

46 Rekursive Strukturen Bäume Einführung in MSWLogo Autor: H. Sporenberg

47 Rekursive Strukturen Baum mit drei Ästen to Baum :laenge ifelse :laenge<80[setpc 1+random 7 stop] [lt 25 fd :laenge Baum.5*:laenge bk :laenge rt 40 fd.5*:laenge Baum.6*:laenge bk.5*:laenge rt 30 fd.5*:laenge Baum.6*:laenge bk.5*:laenge lt 45] end Einführung in MSWLogo Autor: H. Sporenberg

48 Rekursive Strukturen Einführung in MSWLogo Baum mit drei Ästen Autor: H. Sporenberg

49 Rekursive Strukturen to Baum1 :laenge ifelse :laenge<5[fd :laenge back :laenge stop][ fd :laenge/3 left 30 Baum1 :laenge*2/3 right 30 fd :laenge/6 right 25 Baum1 :laenge/2 left 25 fd :laenge/3 right 25 Baum1 :laenge/2 left 25 fd :laenge/6 back :laenge] end Einführung in MSWLogo Baum mit drei Ästen Autor: H. Sporenberg

50 Rekursive Strukturen symmetrischer Pythagorasbaum to pyth1 :laenge quadrat :laenge if :laenge<40 [RT 90 FD :laenge stop] setpc 1+random 5 wait 30 FD :laenge LT 45 pyth1 :laenge*Cos 45 pyth1 :laenge*Sin 45 RT 45 setpc 1+random 5 wait 30 FD :laenge LT 90 end Einführung in MSWLogo Autor: H. Sporenberg

51 Rekursive Strukturen symmetrischer Pythagorasbaum Einführung in MSWLogo Autor: H. Sporenberg

52 Rekursive Strukturen asymmetrischer Pythagorasbaum to pyth1 :laenge quadrat :laenge if :laenge<40 [RT 90 FD :laenge stop] setpc 1+random 5 wait 30 FD :laenge LT 45 pyth1 :laenge*Cos 30 pyth1 :laenge*Sin 30 RT 45 setpc 1+random 5 wait 30 FD :laenge LT 90 end Einführung in MSWLogo Autor: H. Sporenberg

53 Rekursive Strukturen asymmetrischer Pythagorasbaum Einführung in MSWLogo Autor: H. Sporenberg

54 Variablenverwaltung Der Zugriff auf Variable geschieht durch: :xwert. Die Belegung von Variablen: MAKE „xwert 100 Die Ausgabe erfolgt entweder durch PRINT oder durch LABEL. Dabei wird der Wert der Variablen durch PRINT in das Commander- Feld ausgegeben. Label gibt den Inhalt an der Stelle der Schildkröte aus. Dabei ist auch die Richtung von Bedeutung. PRINT :xwert bzw. PRINT „Hallo LABEL :xwert bzw. LABEL „Hallo Einführung in MSWLogo Autor: H. Sporenberg

55 Variablenverwaltung – Eingabe in einem Fenster to Ausgabe make „Zahl first questionbox[BenutzerEingabe][ Geben Sie eine Zahl ein:] Label :Zahl end Mit Hilfe dieser Anweisung wird der eingegebene Wert in der Variablen zahl abgelegt. Durch first wird bewirkt, dass das erste Element in der Eingabeliste genommen wird. Einführung in MSWLogo Autor: H. Sporenberg

56 Variablenverwaltung – Eingabe in einem Fenster to Ausgabe make „Zahl first questionbox[BenutzerEingabe][ Geben Sie eine Zahl ein:] Make „Quadratzahl :Zahl*:Zahl Label :Quadratzahl end Mit Hilfe dieser Anweisung wird der eingegebene Wert in der Variablen zahl abgelegt. Durch first wird bewirkt, dass das erste Element in der Eingabeliste genommen wird. Einführung in MSWLogo Autor: H. Sporenberg

57 Variablenverwaltung – Eingabe in einem Fenster to quadratzahlen make "zahl first questionbox[BenutzerEingabe][ Geben Sie die Zahl ein:] rt 90 until[:zahl>10][fd 20 pendown Label :zahl make "zahl :zahl+1 penup ] end Mit Hilfe dieser Anweisung wird der eingegebene Wert in der Variablen zahl abgelegt. Durch first wird bewirkt, dass das erste Element in der Eingabeliste genommen wird. Einführung in MSWLogo Autor: H. Sporenberg

58 Fenster und Buttons to fensterneu cs windowcreate "main "Fenster "Ausgabe 100 100 250 200[] buttoncreate "Fenster "Button1 [Close Window] 10 10 50 30[fensterzu] end Einführung in MSWLogo to fensterzu windowdelete "Fenster end Autor: H. Sporenberg

59 windowcreate "main "Fenster "Ausgabe 0 0 150 100[] Allgemein: windowcreate buttoncreate "Fenster "Button1 [Close Window] 10 10 50 30[fensterzu] Allgemein: buttoncreate windowdelete "Fenster Das Fenster wird geschlossen end Fenster und Buttons Einführung in MSWLogo Autor: H. Sporenberg

60 to fensterzu windowdelete "fenster1 end Fenster und Buttons Einführung in MSWLogo Autor: H. Sporenberg (1) to combobutton (2) cs (3) windowcreate "main "fenster1 "Ausgabe 20 20 100 150[] (4) buttoncreate "fenster1 "window2 [FensterZu] 10 15 50 10[fensterzu] (5) buttoncreate "fenster1 "start [Summe berechnen] 10 35 70 10 [berechnung] (6) comboboxcreate "fenster1 „zahl1 10 65 50 10 (7) comboboxcreate "fenster1 „zahl2 10 85 50 10 (8) comboboxcreate "fenster1 "ausgabe 10 105 50 10 (9) end

61 (1) to combobutton (2) cs (3) windowcreate "main "fenster1 "Ausgabe 20 20 100 150[] (4) buttoncreate "fenster1 "window2 [FensterZu] 10 15 50 10[fensterzu] (5) buttoncreate "fenster1 "start [Summe berechnen] 10 35 70 10 [berechnung] (6) comboboxcreate "fenster1 „zahl1 10 65 50 10 (7) comboboxcreate "fenster1 „zahl2 10 85 50 10 (8) comboboxcreate "fenster1 "ausgabe 10 105 50 10 (9) end (10) to berechnung (11) make „z1 first comboboxgettext „zahl1 (12) make „z2 first comboboxgettext „zahl2 (13) make „summe :z1+:z2 (14) comboboxsettext „ausgabe :summe (15) end Fenster und Buttons Einführung in MSWLogo Autor: H. Sporenberg

62 Erläuterung für die Prozedur combobutton Zeile 3: Es wird ein Fenster mit Namen Fenster und der Beschriftung Ausgabe in der oberen linken Ecke mit der Ecke mit der Breite 100 Pixel und der Höhe 150 Pixel erzeugt. Zeile 4: Es wird ein Button mit Namen Button1 im Fenster mit dem Namen Fenster erzeugt. Auf dem Button steht FensterZu, die linke obere Ecke befindet sich im Punkt (10/15), die Breite beträgt 50 Pixel, die Höhe 10. Beim Anklicken des Buttons wird die Prozedur fensterzu aufgerufen. Zeile 5: Es wird ein Button mit Namen Button2 im Fenster mit dem Namen Fenster erzeugt. Auf dem Button steht FensterZu, die linke obere Ecke befindet sich im Punkt (10/25), die Breite beträgt 50 Pixel, die Höhe 10. Beim Anklicken des Buttons wird die Prozedur berechnung aufgerufen. Zeile 6: Es wird eine CombiBox mit Namen summand1 im Fenster mit dem Namen Fenster erzeugt. Die CombiBox summand1 ist leer, die linke obere Ecke befindet sich im Punkt (10/65), die Breite beträgt 50 Pixel, die Höhe 10. In die Box kann geschrieben werden. Fenster und Buttons Einführung in MSWLogo Autor: H. Sporenberg

63 Erläuterung für die Prozedur combobutton Zeile 7: Es wird eine CombiBox mit Namen summand2 im Fenster mit dem Namen Fenster erzeugt. Die CombiBox Summand2 ist leer, die linke obere Ecke befindet sich im Punkt (10/85), die Breite beträgt 50 Pixel, die Höhe 10. In die Box kann geschrieben werden. Zeile 8: Es wird eine CombiBox mit Namen ausgabe im Fenster mit dem Namen Fenster erzeugt. Die CombiBox ausgabe, die linke obere Ecke befindet sich im Punkt (10/105), die Breite beträgt 50 Pixel, die Höhe 10. In die Box kann geschrieben werden. In der Prozedur berechnung soll jetzt die Summe der beiden Zahlen, die in die Felder von CombiBox summand1 und summand2 eingegeben worden sind, berechnet werden und dann in dem Feld der CombiBox ausgabe geschrieben werden. Fenster und Buttons Einführung in MSWLogo Autor: H. Sporenberg

64 Fenster und Buttons Einführung in MSWLogo Autor: H. Sporenberg Erläuterung für die Prozedur berechnung Die Werte aus den Feldern von summand1 und summand2 werden 2 normalen Variablen zugewiesen. Dieses geschieht durch den Befehl: make „sum1 first comboboxgettext „summand1 (Zeile 11) Hier muss vor comboboxgettext das Wort first gesetzt werden, da die Eingabe in die CombiBox durch eine Liste geschieht und durch first das erste Element aus der Liste der Variablen sum1 zugewiesen wird. Hinweis: In die Felder kann z.B. 124 34 eingegeben werden, dann wird 124 der Variablen sum1 zugewiesen. Entsprechendes gilt für sum2 (Zeile 12). Mit Hilfe des Befehls make "summe :sum1+:sum2 in Zeile 13 wird die Summe von sum1 und sum2 berechnet und der Variablen summe zugewiesen. Mit Hilfe des Befehls comboboxsettext "ausgabe :summe in Zeile 14 wird der Inhalt von summe in die ComboBox ausgabe geschrieben (comboboxsettext).

65 Aufgabe: Mit Hilfe weiterer Buttons soll wahlweise die Addition, Subtraktion, Multiplikation und Division ausgeführt werden. Fenster und Buttons Einführung in MSWLogo Autor: H. Sporenberg

66 Wird noch ergänzt, u.a. mit MIDI Die Tonleiter Einführung in MSWLogo TonFrequenz c1264 Hz d297 Hz e330 Hz f352 Hz fis370 Hz g396 Hz a440 Hz h495 Hz c2528 Hz Sound[ ] Autor: H. Sporenberg

67 Projekt: Funktionsplotter Beschreibung In einem Koordinatensystem soll ein Funktionsgraph ge- zeichnet werden. Das MAIN-Programm sollte wie folgt aussehen: to main cs kreuz ;zeichnet koordinatenkreuz striche ; zeichnet Striche an die Achsen beschriftung ; versieht die Striche mit Zahlen graph ; zeichnet den Graphen end Einführung in MSWLogo Autor: H. Sporenberg

68 to kreuz home setpensize[3 3] setpencolor[0 0 255] penup left 90 fd 400 rt 180 pendown fd 800 penup back 400 left 90 back 300 pendown fd 600 home end Damit hat das Koordinatenkreuz eine gesamte x-Länge von 800 Pixel und eine gesamte y-Länge von 600 Pixeln. 5 Einheiten nach links, 5 Einheiten nach rechts. Das bedeutet, dass alle 80 Pixel ein Strich gezogen werden muss. to striche setpencolor[255 255 0] penup left 90 fd 400 rt 90 back 10 repeat 11[pendown fd 20 penup back 20 rt 90 fd 80 lt 90] end Projekt: Funktionsplotter Einführung in MSWLogo Autor: H. Sporenberg

69 Hier wird die x-Achse beschriftet. to beschriftung setpencolor[255 0 255] make „xwert -400 make „ywert -8 make „zahl -5 penup setpos(list :xwert :ywert) pendown until[:xwert>350] [penup setpos(list :xwert :ywert) pendown label :zahl make „ zahl :zahl+1 make „xwert :xwert+80] end Projekt: Funktionsplotter Einführung in MSWLogo Autor: H. Sporenberg

70 to graph setpensize[2 2] setpencolor[255 0 255] penup make "xwert -2 make "ywert (:xwert*:xwert*:xwert-2*:xwert) setpos(list :xwert*60 :ywert*40) pendown until[:xwert >2][make "xko :xwert*60 setpos(list :xko (:xwert*:xwert*:xwert-2*:xwert)*40) wait 5 make "xwert :xwert+0.1] end Projekt: Funktionsplotter Einführung in MSWLogo Autor: H. Sporenberg

71 Projekt: Funktionsplotter Einführung in MSWLogo Autor: H. Sporenberg

72 Bewegen der Turtle - mit Rekursion und make to strich :xwert :ywert :winkel if :ywert>200[stop] wait 30 setpos(list :xwert :ywert) make "xwert :xwert+:winkel make "ywert :ywert+:winkel strich :xwert :ywert :winkel end to main cs setpencolor[0 0 255] setpensize[2 2] strich -200 0 2 end Einführung in MSWLogo Autor: H. Sporenberg

73 Bewegen der Turtle – mit Rekursion ohne make to strich :xwert :ywert :winkel if :ywert>200[stop] wait 30 setpos(list :xwert :ywert) strich :xwert+:winkel :ywert+:winkel :winkel end Einführung in MSWLogo to main cs setpencolor[0 0 255] setpensize[2 2] strich -200 0 2 end Autor: H. Sporenberg

74 to reflexion :xwert :ywert :winkelx :winkely if :xwert>300[stop] if :ywert>200[make "winkely -:winkely] setpos(list :xwert :ywert) wait 10 make "xwert :xwert+:winkelx make "ywert :ywert+:winkely reflexion :xwert :ywert :winkelx :winkely end to main cs setpencolor[0 0 255] setpensize[2 2] reflexion -200 0 2 3 end Bewegen der Turtle – mit Rekursion und make Einführung in MSWLogo Autor: H. Sporenberg

75 Die Decke to decke setpensize[4 4] setpencolor [10 10 255] pu setpos[-400 250] pd setpos[400 250] setpos[400 280] setpos[-400 280] setpos[-400 250] pu setpos [-380 260] setfc[200 20 80] fill end Bewegen der Turtle Einführung in MSWLogo Autor: H. Sporenberg

76 Die eigentliche Reflexion to reflexion :xwert :ywert :winkelx :winkely if :ywert<0[stop] if :ywert>250[make "winkely -:winkely] setpos(list :xwert :ywert) wait 1 make "xwert :xwert+:winkelx make "ywert :ywert+:winkely reflexion :xwert :ywert :winkelx :winkely end Bewegen der Turtle – mit Rekursion und make Einführung in MSWLogo Autor: H. Sporenberg

77 Das Main-Programm to main cs setfc[60 60 60] fill decke setpos[-200 0] pd setpencolor [255 255 100] reflexion -200 0 2 3 end Bewegen der Turtle Einführung in MSWLogo Autor: H. Sporenberg

78 to WandOben setpensize[4 4] setpencolor[139 119 102] pu setpos[-400 250] pd setpos[400 250] setpos[400 280] setpos[-400 280] setpos[-400 250] pu setpos [-380 260] setfc[255 160 132] fill setpc[150 150 150] home pd end Die Tischkanten bzw. Wände Einführung in MSWLogo to WandUnten setpensize[4 4] setpencolor [139 119 101] pu setpos[-400 -250] pd setpos[-400 -280] setpos[400 -280] setpos[400 -250] setpos[-400 -250] pu setpos [-380 -260] setfc[255 160 132] fill setpc[150 150 150] home pd end Autor: H. Sporenberg

79 to WandRechts setpensize[4 4] setpencolor[139 119 102] pu setpos[400 280] pd setpos[430 280] setpos[430 -280] setpos[400 -280] setpos[400 280] pu setpos [420 260] setfc[255 160 132] fill setpc[150 150 150] home pd end Die Tischkanten bzw. Wände Einführung in MSWLogo to WandLinks setpensize[4 4] setpencolor[139 119 102] pu setpos[-400 280] pd setpos[-430 280] setpos[-430 -280] setpos[-400 -280] setpos[-400 280] pu setpos [-420 260] setfc[255 160 132] fill setpc[150 150 150] home pd end Autor: H. Sporenberg

80 Der vollständige Tisch Einführung in MSWLogo Um den vollständi- gen Tisch zu zeich- nen, sollte man ein Programm schrei- ben, in dem alle Wände aufgerufen werden. Dadurch wird dann der ganze Tisch gezeichnet. to tisch cs WandOben WandUnten WandRechts WandLinks end Autor: H. Sporenberg

81 to reflexionUntil :xwert :ywert :winkelx :winkely cs setpensize[3 3] pu setpos(list :xwert :ywert) pd until[:xwert>300][setpos(list :xwert :ywert) make "xwert :xwert+:winkelx~ make "ywert :ywert+:winkely if :ywert>200[make "winkely -:winkely] ] end to main cs setpencolor[0 0 255] setpensize[2 2] reflexionUntil -200 0 2 3 end Bewegen der Turtle ohne Rekursion Einführung in MSWLogo Autor: H. Sporenberg

82 Projekt: Billardtisch to reflexion1 cs setpensize[3 3] setpencolor[0 0 255] make "anzahl 0 make "xwert -200 make "ywert 30 make "winkelx 2 make "winkely 2 until[:anzahl>10][ if :xwert>200[make "winkelx -:winkelx make "anzahl :anzahl+1] if :ywert>150[make "winkely -:winkely make "anzahl :anzahl+1] if :xwert<-200[make "winkelx -:winkelx make "anzahl :anzahl+1] if :ywert<-150[make "winkely -:winkely make "anzahl :anzahl+1] wait 1 setpos(list :xwert :ywert) make "xwert :xwert+:winkelx make "ywert :ywert+:winkely] end Einführung in MSWLogo Bewegen der Turtle ohne Rekursion Autor: H. Sporenberg

83 Projekt: Billardtisch to reflexion :xwert :ywert :addx :addy if :xwert<-400 [make "addx -:addx] if :xwert>400 [make "addx -:addx] if :ywert<-250 [make "addy -:addy] if :ywert>250 [make "addy -:addy] wait 1 setpos(list :xwert :ywert) reflexion :xwert+:addx :ywert+:addy :addx :addy end Einführung in MSWLogo Bewegen der Turtle mit Rekursion und make Autor: H. Sporenberg

84 Projekt: Billardtisch Einführung in MSWLogo Um den Tisch und die dann anschließende Reflexion zu zeichnen, empfiehlt es sich, dieses in einem sog. Main- Programm zusammenzu- fassen to main cs tisch reflexion 0 0 1 2 end Autor: H. Sporenberg

85 Durch Eingabe der xko und yko soll der Strahl über die obere Wand so reflektiert werden, dass er im Eimer landet. Die Position der Anfangs- stellung und die des Eimers werden durch Zufallszahlen bestimmt. Projekt: Eimer Einführung in MSWLogo Autor: H. Sporenberg

86 Der Eimer to eimer make "xstelle random 350 penup setpos(list :xstelle 0) pendown setpencolor[0 0 255] setpensize[3 3] setpos(list :xstelle -30) setpos(list :xstelle+30 -30) setpos(list :xstelle+30 0) end Der random-Befehl Mit Hilfe von random zahl werden Zufallszahlen von 0 bis zum Wert von zahl erzeugt. random 10 erzeugt also Zufallszahlen von 0 bis 10 Projekt: Eimer Einführung in MSWLogo Autor: H. Sporenberg

87 Die Eingabe von xko und yko to eingabe make "xko first questionbox[Eingabe][x-Wert eingeben] make "yko first questionbox[Eingabe][y-Wert eingeben] end Projekt: Eimer Einführung in MSWLogo Autor: H. Sporenberg

88 Die Reflexion to reflexion setpencolor[0 0 255] setpensize[2 2] penup setpos(list :xwert :ywert) pendown until[:ywert<-40][make "xwert :xwert+:xko make "ywert :ywert+:yko setpos(list :xwert :ywert) if :ywert>200[make "yko -:yko] ueberpruefung] rt 90 label "Schade!Verloren end Projekt: Eimer Einführung in MSWLogo Autor: H. Sporenberg

89 Die Reflexion – mit Rekursion to reflexion1 :xwert :ywert :xko :yko if :ywert>200[make "yko -:yko] if :ywert<-40[rt 90 label "Schade!Verloren throw "toplevel] ueberpruefung1 :xwert :ywert wait 2 setpos(list :xwert :ywert) reflexion1 :xwert+:xko :ywert+:yko :xko :yko end Projekt: Eimer Einführung in MSWLogo Autor: H. Sporenberg

90 Die Überprüfung to ueberpruefung if :ywert -30[if :xwert>:xstelle~ [if :xwert<:xstelle+30[Label "Gewonnen throw „toplevel]]]] end Projekt: Eimer Einführung in MSWLogo Autor: H. Sporenberg

91 Projekt: Eimer Das Hauptprogramm to main cs decke eimer penup setpos[-200 0] pendown circle 8 make "xwert -200 make "ywert 0 eingabe reflexion1 :xwert :ywert :xko :yko end Einführung in MSWLogo Autor: H. Sporenberg

92 Einfache Bewegung der Turtle to main cs make "keypress 12 fahren 1 end to fahren :speed setfocus[MSWLogo Screen] keyboardon[make "keypress keyboardvalue steuerung :keypress keyboardoff] if :keypress=113 [finish stop] wait 2 pd fd :speed fahren :speed end to steuerung :richtung if :richtung=44 [lt 10 stop] if :richtung=46 [rt 10 stop] ;if :richtung=97 [make "speed :speed+1 stop] ;if :richtung=115 [make "speed :speed-1 stop] end Einführung in MSWLogo Autor: H. Sporenberg

93 Projekt: Autorennen Die Turtle soll mit Hilfe von Links- und Rechts- drehungen durch den Kurs gesteuert werden to go cs make "keypress 12 ladeBild fahren 1 end to ladeBild bitload "track1.bmp scrollx -200 scrolly -300 pu setpos[-285 270] seth 90 end Einführung in MSWLogo Autor: H. Sporenberg

94 to fahren :speed setfocus[MSWLogo Screen] keyboardon[make "keypress keyboardvalue steuerung :keypress keyboardoff] if :keypress=113 [finish stop] wait 2 pd fd :speed command fahren :speed end to command if pixel=[255 0 0][bk 5 lt 90 stop] ;if pixel=[0 0 0][spinout stop] if pixel=[0 0 255][finish] end to steuerung :richtung if :richtung=44 [lt 10 stop] if :richtung=46 [rt 10 stop] ;if :richtung=97 [make "speed :speed+1 stop] ;if :richtung=115 [make "speed :speed-1 stop] end to finish throw "toplevel end Projekt: Autorennen Einführung in MSWLogo Autor: H. Sporenberg

95 pixel gibt eine Liste zurück, die die Farbanteile von RGB beinhalten keyboardon mit Hilfe dieses Befehls können die Tastaturereignisse sofort gespeichert werden, zuvor muss jedoch der Focus mit Hilfe des Befehls setfocus[MSWLogo Screen] auf den MSWLogo-Bildschirm eingestellt werden throw „toplevel beendet alle laufenden Prozeduren und interaktiven Pausen und kehrt zur obersten Ebene des Programms zurück Projekt: Autorennen Einführung in MSWLogo Autor: H. Sporenberg

96 to go cs make "keypress 12 ladeBild make "start timemilli windowcreate "main "stopwatch "time 300 20 80 50[] staticcreate "stopwatch "currenttime [progress time] 5 5 50 20 ifelse yesnobox[Start][Are you ready] [fahren 1]~ [messagebox[Stopping...][Cancelling start]~ staticdelete "currenttime windowdelete "stopwatch] fahren 1 end Projekt: Autorennen Einführung in MSWLogo Autor: H. Sporenberg

97 to fahren :speed setfocus[MSWLogo Screen] keyboardon[make "keypress keyboardvalue steuerung :keypress keyboardoff] if :keypress=113 [finish stop] wait 2 pd fd :speed Command localmake "currenttime timemilli-:start staticupdate "currenttime se [time is] :currenttime fahren :speed end Projekt: Autorennen Einführung in MSWLogo Autor: H. Sporenberg

98 to finish staticdelete "currenttime windowdelete "stopwatch localmake "laptime timemilli - :start messagebox[finish](sentence[your time was] :laptime[milliseconds]) throw "toplevel end Projekt: Autorennen Einführung in MSWLogo Autor: H. Sporenberg

99 Beschreibung Auf einer Spielfläche wird eine bestimmte Anzahl von Getreidekörnern (dargestellt durch gelbe Kreise) platziert. Mit Hilfe der Tastatur wird die Turtle bewegt. Das Ziel dabei ist, alle Getreidekörner aufzusammeln. Die Spielregeln können dabei beliebig abge- ändert werden. Z.B. könnte die Zeit gemes- sen werden, in der alle Getreidekörner auf- gesammelt werden oder es könnte die An- zahl der Getreidekörner gezählt werden, die in einer vorgegebenen Zeit aufgenommen wurden. Die Geschwindigkeit könnte mit der Aufnahme eines Getreidekorns erhöht werden. Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo Autor: H. Sporenberg

100 Als erstes muss ein Programm geschrieben werden, das die Turtle von der Tastatur aus steuert. Dabei vereinbaren wir:, (Komma) - steuert links,. (Punkt) – steuert rechts. Der ganze Vorgang wird abgebrochen mit q (für Quit). Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo Einfache Bewegung der Maus bzw. (Turtle) to main cs make "keypress 12 setpensize[0 0] fahren 1 end Autor: H. Sporenberg

101 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo Einfache Bewegung der Maus bzw. (Turtle) to main cs make "keypress 12 setpensize[0 0] fahren 1 end to fahren :speed setfocus [MSWLogo Screen] keyboardon [make "keypress keyboardvalue steuerung :keypress keyboardoff] if :keypress=113 [finish stop] ;;ASCI-Code: 113 -> q (Stoppt das Programm) wait 2 pd fd :speed fahren :speed end to steuerung :richtung if :richtung=44 [lt 10 stop] ;;ASCI-Code: 44 ->, (Komma) if :richtung=46 [rt 10 stop] ;;ASCI-Code: 46 ->. (Punkt) if :richtung=97 [make "speed :speed+1] ;;ASCI-Code: 97 -> a (beschleunigen) if :richtung=115 [make "speed :speed-1] ;;ASCI-Code: 115 -> s (verlangsamen) end Achtung: Die Dicke des Stifts muss auf 0 0 gesetzt werden Autor: H. Sporenberg

102 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo Einfache Bewegung der Maus bzw. (Turtle) Die Körner können auch mit einem Grafikprogramm erzeugt werden, z.B. mit PAINT. Achtung: Es ist darauf zu achten, dass die RGB-Komponenten bekannt sind, damit eine Abfrage auf die entsprechende Farben durchgeführt werden kann. Die Paint-Grafik – muss im BMP-Format vorliegen. Hier ist die Farbe gelb, die Komponenten sind dementsprechend : RGB[255 255 0] Autor: H. Sporenberg

103 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo Einfache Bewegung der Maus bzw. (Turtle) Um das Bild zu laden, schreibt man günstig eine neue Prozedur und ruft diese aus dem MAIN-Programm auf. to ladeBild bitload „koerner1.bmp Scrollx -400 Scrolly – 300 end Autor: H. Sporenberg

104 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo Einfache Bewegung der Maus bzw. (Turtle) Das Main-Programm muss demnach erweitert werden to main cs ladeBild make "keypress 12 setpensize[0 0] fahren 1 end Autor: H. Sporenberg

105 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo Einfache Bewegung der Maus bzw. (Turtle) Wenn die Maus bzw. die Mausspur auf ein gelbes Korn trifft, muss dieses auf dem Bildschirm verschwinden. to kornweg if pixel= [255 255 0] [setfc[255 255 255]fill] make "anzahl :anzahl-1] if :anzahl<1 [stop] end Der Befehl pixel fragt die Farbe vor dem Cursor ab. Ist die Farbe gelb, d.h. [255 255 0], wird die Fläche mit dem Befehl setfc[255 255 255]fill mit der Farbe weiß gefärbt. Autor: H. Sporenberg

106 to korn cs setpencolor[255 255 0] make "anzahl 0 until[:anzahl>10][make "xkoordinate - 400+random 800 make "ykoordinate -200+random 400 pu setpos (list :xkoordinate :ykoordinate) pd circle 10 setfc[255 255 0] fill wait 10 make "anzahl :anzahl+1] pu home end Mit Hilfe dieser Prozedur werden auf die Graphikfläche 10 Kreise mit dem Radius 10 Pixel nach einem Zufallsprinzip gezeichnet und mit der Farbe gelb gefärbt. Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo Autor: H. Sporenberg

107 Projekt: Aufnahme von Getreidekörner to main ;; das ist der Aufruf in der Command-Zeile cs setpensize[0 0] korn make "keypress 12 if yesnobox [Spiel starten] [Spiel starten? (Komma für links, Punkt für rechts, Q für Beenden, A für Tempo erhöhen, S für Tempo drosseln)] ~ [messagebox [...anhalten...] [Spiel beginnen?]] fahren 1 if :anzahl<0[finish] end Einführung in MSWLogo Fett: Aufruf der Prozeduren Autor: H. Sporenberg

108 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to finish if :anzahl>0 [messagebox [Ende - Käse]~ (sentence [Du hast] :anzahl [Käsestückchen vergessen.])] throw "toplevel end Autor: H. Sporenberg

109 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to fahren :speed setfocus [MSWLogo Screen] keyboardon [make "keypress keyboardvalue steuerung :keypress keyboardoff] if :keypress=113 [finish stop] wait 2 pd fd :speed kornweg fahren :speed end to finish throw "toplevel end Autor: H. Sporenberg

110 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to fahren :speed setfocus [MSWLogo Screen] keyboardon [make "keypress keyboardvalue steuerung :keypress keyboardoff] if :keypress=113 [finish stop] wait 2 pd fd :speed korn_weg fahren :speed end to finish if :anzahl>0 [messagebox [Ende - Käse] (sentence [Du hast] :anzahl [Käsestückchen vergessen.])] throw "toplevel end Das komplette Programm (ohne Uhr) 1.Teil Autor: H. Sporenberg

111 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to korn cs setpencolor[255 255 0] ;; Farbe des Kreisrandes make "anzahl 0 until [:anzahl>9] [make "xkoordinate -400+random 800 make "ykoordinate - 200+random 400 pu setpos(list :xkoordinate :ykoordinate) pd circle 10 setfc [255 255 0]fill wait 10 make "anzahl :anzahl+1] pu print :anzahl home wait 10 setpencolor[0 0 0] ;; Farbe der Mausspur end Das komplette Programm (ohne Uhr) 2.Teil Autor: H. Sporenberg

112 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to korn_weg if pixel= [255 255 0] [setfc[255 255 255]fill make "anzahl :anzahl-1 print :anzahl] if :anzahl<1 [finish] ;;setfc[60 51 51]fill ; Farbiger Hintergrund end to main cs setpensize[0 0] korn make "keypress 12 if yesnobox [Spiel starten] [Spiel starten? (Komma für links, Punkt für rechts, Q für Beenden, A für Tempo erhöhen, S für Tempo drosseln)] ~ [messagebox [...anhalten...] [Spiel beginnen?]] fahren 1 if :anzahl<0[finish] end Das komplette Programm (ohne Uhr) 3.Teil Autor: H. Sporenberg

113 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to steuerung :richtung if :richtung=44 [lt 10 stop] if :richtung=46 [rt 10 stop] if :richtung=97 [make "speed :speed+1] if :richtung=115 [make "speed :speed-1] end Das komplette Programm (ohne Uhr) 4.Teil Autor: H. Sporenberg

114 Projekt: Aufnahme von Getreidekörner to main ;; das ist der Aufruf in der Command-Zeile cs setpensize[0 0] korn make "keypress 12 make "start timemilli windowcreate "main "stopwatch "time 300 20 80 50 [] staticcreate "stopwatch "currenttime [progress time] 5 5 50 20 ifelse yesnobox [Spiel starten] [Spiel starten? (Komma für links, Punkt für rechts, Q für Beenden, A für Tempo erhöhen, S für Tempo drosseln)] ~ [messagebox [...anhalten...] [Spiel beginnen?]]~ [staticdelete "currenttime windowdelete " stopwatch] fahren 1 if :anzahl<0[finish] end Einführung in MSWLogo Einfügen einer Uhr Autor: H. Sporenberg

115 Projekt: Aufnahme von Getreidekörner to fahren :speed setfocus [MSWLogo Screen] keyboardon [make "keypress keyboardvalue steuerung :keypress keyboardoff] if :keypress=113 [finish stop] wait 2 pd fd :speed korn_weg localmake " currenttime timemilli-:start staticupdate " currenttime se[Vergangene Zeit] :currenttime fahren :speed end Einführung in MSWLogo Einfügen einer Uhr Autor: H. Sporenberg

116 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo In der Prozedur finish muss jetzt die Uhr eingefügt werden, da hier das Ende des Spiels erreicht wird. Dazu muss von der Zeit am Ende des Spiels die Zeit bei Beginn des Spiels subtrahiert werden. Das Ergebnis wird in Millisekunden angegeben. Durch Umrechnungen kann man diese Zeit in Sekunden ausgeben. Autor: H. Sporenberg

117 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to finish staticdelete "currenttime windowdelete "stopwatch localmake "laptime timemilli-:start messagebox [Ende - Deine Zeit] ~ (sentence [Deine Zeit war] :laptime [Millisekunden.]) if :anzahl>0 [messagebox [Ende - Käse]~ (sentence [Du hast] :anzahl [Käsestückchen vergessen.])] throw "toplevel end Einfügen einer Uhr Autor: H. Sporenberg

118 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to main cs korn make "keypress 12 make "start timemilli windowcreate "main "stopwatch "time 300 20 80 50 [] staticcreate "stopwatch "currenttime [Vergangene Zeit] 5 5 50 20 ifelse yesnobox [Spiel starten] [Spiel starten? (Komma für links, Punkt für rechts, Q für Beenden, A für Tempo erhöhen, S für Tempo drosseln)] ~ [messagebox [...anhalten...] [Spiel beginnen?]][staticdelete "currenttime windowdelete "stopwatch] fahren 1 if :anzahl<0[finish] end Das komplette Programm mit Uhr Mit Uhr Autor: H. Sporenberg

119 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to korn cs setpencolor[255 255 0] ;; Farbe des Kreisrandes make "anzahl 0 until [:anzahl>9] [make "xkoordinate -200+random 400~ make "ykoordinate -200+random 200 pu setpos(list :xkoordinate :ykoordinate) pd circle 10 setfc [255 255 0]fill wait 10 make "anzahl :anzahl+1] pu print :anzahl home wait 100 setpencolor[0 0 0] ;; Farbe der Mausspur end Das komplette Programm mit Uhr Mit Uhr Autor: H. Sporenberg

120 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to fahren :speed setfocus [MSWLogo Screen] keyboardon [make "keypress keyboardvalue steuerung :keypress keyboardoff] if :keypress=113 [finish stop] wait 2 pd fd :speed korn_weg localmake "currenttime timemilli-:start staticupdate "currenttime sentence [Vergangene Zeit] :currenttime fahren :speed end Das komplette Programm mit Uhr Mit Uhr Autor: H. Sporenberg

121 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to korn_weg if pixel= [255 255 0] [setfc[255 255 255]fill make "anzahl :anzahl-1 print :anzahl] if :anzahl<1 [finish] ;;setfc[160 51 51]fill ; Farbiger Hintergrund end Das komplette Programm mit Uhr to steuerung :richtung if :richtung=44 [lt 10 stop] if :richtung=46 [rt 10 stop] if :richtung=97 [make "speed :speed+1] if :richtung=115 [make "speed :speed-1] end Mit Uhr Autor: H. Sporenberg

122 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to finish staticdelete "currenttime windowdelete "stopwatch localmake "laptime timemilli-:start messagebox [Ende - Deine Zeit] ~ (sentence [Deine Zeit war] :laptime [Millisekunden.]) messagebox [Ende - Käse] (sentence [Du hast] :anzahl ~ [Käsestückchen vergessen.]) throw "toplevel end Das komplette Programm mit Uhr Mit Uhr Autor: H. Sporenberg

123 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo Das komplette Programm mit Uhr – grafische Abfolge Mit Uhr Autor: H. Sporenberg

124 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo Das komplette Programm mit Uhr – grafische Abfolge Mit Uhr Autor: H. Sporenberg

125 Spiralen Einführung in MSWLogo Eine Spirale ist eine Kurve, die um einen Punkt oder eine Achse verläuft und sich je nach Laufrichtung von diesem/r entfernt oder annähert. Autor: H. Sporenberg

126 Einführung in MSWLogo Spiralen Autor: H. Sporenberg

127 Einführung in MSWLogo Spiralen Autor: H. Sporenberg

128 to Spirale :ecken :laenge if :laenge>300[stop] FD :laenge RT 360/:ecken Spirale :ecken :laenge+10 end to Spirale :laenge if :laenge>300[stop] FD :laenge RT 90 Spirale :laenge+10 end Einführung in MSWLogo Spiralen Autor: H. Sporenberg

129 to Spirale :laenge if :laenge>50[stop] FD :laenge RT 10 Spirale :laenge+0.1 end Einführung in MSWLogo Spiralen Autor: H. Sporenberg

130 Die Archimedische Spirale Einführung in MSWLogo Spiralen Autor: H. Sporenberg Eine archimedische Spirale ist die Bahn eines Punktes, der sich auf einem mit konstanter Winkelgeschwindigkeit  0 rotierenden Halbstrahl mit konstanter Geschwindigkeit v 0 nach außen bewegt. Insbesondere sind bei der archimedischen Spirale die Abstände der Windungen konstant. Im Alltag tritt die archimedische Spirale häufig dort auf, wo etwas ordentlich aufgewickelt ist (Seile, Toilettenpapier), oder etwas Linienförmiges eine Fläche bilden soll (Lakritzspirale, Schallplattenrillen). Insbesondere kommt sie auf jedem handelsüblichen Datenträger (CD oder DVD) zur Anwendung. Auf einer CD werden die Daten in Form von kleinen Vertiefungen beginnend bei der innersten Spur der CD spiralartig nach außen geschrieben.

131 Die Archimedische Spirale Einführung in MSWLogo Spiralen Autor: H. Sporenberg Die Parameterform der Archimedischen Spirale lautet: f:   (a  cos , a  sin ) to main cs setpensize[4 4] make „phi 0 ArchiSpirale 0 0 end to ArchiSpirale :xko :yko if :phi>360 [stop] setpos(list :xko :yko) make „phi :phi+2 make „xko 0.1*:phi*cos(:phi) make „yko 0.1*:phi*sin(:phi) ArchiSpirale :xko :yko end

132 Die Archimedische Spirale - Beispiele Einführung in MSWLogo Spiralen Autor: H. Sporenberg

133 Die Logarithmische Spirale Einführung in MSWLogo Spiralen Autor: H. Sporenberg Die Parameterform der logarithmischen Spirale lautet: f:   (a e k  cos , a e k  sin ) Eine Logarithmische Spirale ist eine Spirale, bei der sich mit jeder Umdrehung um ihren Mittelpunkt (Zentrum, Pol) der Abstand von diesem Mittelpunkt um den gleichen Faktor verändert. Jede Gerade durch den Pol schneidet die logarithmische Spirale stets unter dem gleichen Winkel. Wegen dieser Eigenschaft spricht man auch von einer gleichwinkligen Spirale.

134 Die logarithmische Spirale Einführung in MSWLogo Spiralen Autor: H. Sporenberg to Logspirale :xko :yko if :phi>1700[stop] setpos(list :xko :yko) make "potenz power 2.712 (0.004*:phi) make "phi :phi+1 make "xko 0.4*:potenz*cos(:phi) make "yko 0.4*:potenz*sin(:phi) Logspirale :xko :yko end to main cs setpensize[4 4] setpc[0 0 255] make "phi 0 Logspirale 0 0 end

135 Die logarithmische Spirale - Beispiele Einführung in MSWLogo Spiralen Autor: H. Sporenberg

136 Die Goldene Spirale als Sonderfall der logarithmischen Spirale Einführung in MSWLogo Spiralen Autor: H. Sporenberg Die Goldene Spirale ist ein Sonderfall der logarithmischen Spirale. Diese Spirale lässt sich mittels rekursiver Teilung eines Goldenen Rechtecks in je ein Quadrat und ein weiteres, kleineres Goldenes Rechteck konstruieren (siehe nachfolgendes Bild). Bei ihr gilt somit mit dem Wert des Goldenen Schnittes. Die Werte für:  = 1,61803 und k = 0,30508

137 Die Fermatsche Spirale Einführung in MSWLogo Spiralen Autor: H. Sporenberg Durch leichte Variation der Gleichung der Archimedischen Spirale erhält man Spiralklassen, bei denen der Windungsabstand nicht mehr konstant ist. Erhöht man den Grad von r (und a), so liegen die Windungen mit größerer Entfernung vom Zentrum immer dichter beieinander.

138 Die Fermatsche Spirale Einführung in MSWLogo Spiralen Autor: H. Sporenberg Die Parametergleichung lautet: to FermatSpirale :xko :yko if :phi>1800*3.14[stop] setpos(list :xko :yko) make "phi :phi+2 make "b1 :a1*:phi make "xko (Sqrt :b1)*cos(:phi) make "yko (Sqrt :b1)*sin(:phi) FermatSpirale :xko :yko end

139 Die Hyperbolische Spirale Einführung in MSWLogo Spiralen Autor: H. Sporenberg Wählt man in Polarkoordinaten Gleichungen, bei denen zwischen Radius und Polarwinkel eine umgekehrte Proportionalität besteht, so erhält man ebenfalls Spiralen. Wegen der Ähnlichkeit zu Hyperbeln im kartesischen Koordinaten- system spricht man hier von hyperbolischen Spiralen. Nähert sich die Größe des Winkels phi dem Wert 0, so zeigen hyperbolische Spiralen ein asymptotisches Verhalten und können Wendepunkte besitzen. Wird phi nahezu unendlich groß, so wird das Zentrum in immer enger werdenden Windungen umrundet, jedoch nie erreicht. Die Parameter- gleichung lautet: Die Gleichung in Polarkoordinaten lautet:

140 Die Hyperbolische Spirale Einführung in MSWLogo Spiralen Autor: H. Sporenberg to HyperboSpirale :xko :yko if :phi<8[stop] setpos(list :xko :yko) make "phi :phi-2 make "xko (:a1/:phi)*cos(:phi) make "yko (:a1/:phi)*sin(:phi) HyperboSpirale :xko :yko end Da die Werte für xko und yko phi im Nenner haben, muss beim Aufruf von HyperboSpirale phi einen großen Wert haben. Dann wird der Wert von phi verkleinert und bei der Abfrage die Bedingung phi<4 ausgewertet.

141 Die Hyperbolische Spirale Einführung in MSWLogo Spiralen Autor: H. Sporenberg to main cs setpensize[3 3] setpc [20 20 220] make "phi 2000 make "a1 12000 HyperboSpirale 0 0 end Aufruf aus dem Hauptprogramm

142 Die Galileische Spirale Einführung in MSWLogo Spiralen Autor: H. Sporenberg Diese Spirale ergibt sich aus einer Abwandlung der archimedischen Spirale. Erhöht man den Grad in phi, so wird der Abstand der aufeinander folgenden Windungen immer größer. Die Parametergleichung lautet: Die Gleichung in Polarkoordinaten lautet:

143 Die Galileische Spirale Einführung in MSWLogo Spiralen Autor: H. Sporenberg to GalileiSpirale :xko :yko if :phi>15*30*3.14[stop] setpos(list :xko :yko) make "phi :phi+1 make "xko :a1*:phi*:phi*cos(:phi) make "yko :a1*:phi*:phi*sin(:phi) GalileiSpirale :xko :yko end

144 Lituus Einführung in MSWLogo Spiralen Autor: H. Sporenberg Roger Cotes gab der hyperbolischen Spirale zweiter Ordnung, d.h. der Inversen der fermatschen Spirale wegen ihrer Ähnlichkeit mit einem bischöflichen Krummstab den Namen Lituus. Wegen der Ähnlichkeit zu Hyperbeln im kartesischen Koordinatensystem spricht man von Hyperbolsichen Spiralen. Nähert sich die Größe des Winkels phi dem Wert 0, so zeigen hyperbolischen Spiralen ein asymptotisches Verhalten. Wird phi nahezu unendlich groß, so wird das Zentrum in immer enger werdenden Windungen umrundet, jedoch nie erreicht Die Parameter- gleichung lautet: Die Gleichung in Polarkoordinaten lautet:

145 Lituus Einführung in MSWLogo Spiralen Autor: H. Sporenberg to Lituus :xko :yko if :phi<4[stop] setpos(list :xko :yko) make "phi :phi-2 make "xko 2*((:a1/Sqrt :phi)*cos(:phi)) make "yko 2*((:a1/Sqrt :phi)*sin(:phi)) Lituus :xko :yko end Aufruf to main cs setpensize[5 5] setpc [200 20 220] make "phi 1000 make "a1 500 Lituus 0 0 end

146 Sound[ ] Sound[440 200] spielt den Ton a 200 * 1/60 Sekunde (das sind ungefähr 3 Sekunden) playwave „startup.wav 0 Dieser Befehl spielt die Wave-Datei startup.wav einmal ab (Flag 0) Der Sound Einführung in MSWLogo Autor: H. Sporenberg

147 playwave „startup.wav 0 The “flags” indicate how you want the sound played: 0 = Synchronous does not return until completed. (ie wait until done) 1 = Asynchronous returns immediately while sound is still playing. (ie concurrent) 2 = Don’t use the default sound if the specified one cannot be found. 8 = Continue to loop the sound until another sound command is issued. 16 = Don’t stop an already playing sound. The “flags” indicate how you want the sound played: Einführung in MSWLogo Der Sound Autor: H. Sporenberg

148 Der Sound und Buttons in MSWLogo to Ton_Button windowcreate „main „mywindow „Buttons 10 0 300 150[] x-Koordinate y-Koordinate Länge Höhe Dieser Befehl erzeugt in Unter-Fenster mit Namen Buttons. groupboxcreate „mywindow „mygroupbox 10 10 275 110 x1-Koord. y1-Koord. x2-Koord. y2-Koord. Dieser Befehl erzeugt ein Unter-Fenster mit Namen Buttons. Einführung in MSWLogo Autor: H. Sporenberg

149 buttoncreate „mywindow „A 1 25 25 10 10 [sound[100 200]] x-Koordinate y-Koordinate Länge Höhe Dieser Befehl erzeugt einen Control-Button. A ist der Name des Buttons, erscheint aber nirgendwo. 1 erscheint als Beschriftung des Buttons buttoncreate „mywindow „Close[Close Window]255 125 60 10 [windowdelete „mywindow] x-Koordinate y-Koordinate Länge Höhe Dieser Befehl schließt das Unter-Fenster aus der ersten Zeile Einführung in MSWLogo Der Sound und Buttons in MSWLogo Autor: H. Sporenberg

150 staticcreate „mywindow „W [Sound 1] 45 25 80 10 x-Koordinate y-Koordinate Länge Höhe Dieser Befehl erzeugt ein Unter-Fenster in mywindow und schreibt den Text Sound 1 an die entsprechende Stelle. Einführung in MSWLogo Der Sound und Buttons in MSWLogo Autor: H. Sporenberg

151 Das Labyrinth to Schritt ; falls der Rand erreicht ist wird die Turtle gedreht forward 1 wait 1 ifelse Rand? [back 1 left 90][back 1 pendown forward 1] ; dreht man hier um einen Wert 1, ; läuft die Turtle nicht am Rand entlang end to setze :x :y ;setzt die Turtle auf ihren Startpunkt penup setxy :x :y pendown end to Rand? output equalp pixel 4 end Einführung in MSWLogo Autor: H. Sporenberg

152 Erzeugen eines animierten Gif-Files to gifanimation setpencolor[255 0 0] cs setpensize[4 4] setactivearea[-100 -100 100 350] setscreencolor[100 100 100] make "append "false repeat 15[setpencolor[255 0 0] repeat 5[fd 50 rt 72] (gifsave "quadratgif.gif 0 :append 0) make "append "true wait 100 setpencolor[100 100 100] repeat 5[fd 50 rt 72] penup fd 20 pendown] make "append "true end Die aktive Fläche wird vereinbart Das Fünfeck wird gezeichnet Einführung in MSWLogo Autor: H. Sporenberg

153 to gifanimation setpencolor[255 0 0] cs setpensize[4 4] setactivearea[-100 -100 100 350] setscreencolor[100 100 100] make "append "false repeat 15[setpencolor[255 0 0] repeat 5[fd 50 rt 72] (gifsave "quadratgif.gif 0 :append 0) make "append "true wait 100 setpencolor[100 100 100] repeat 5[fd 50 rt 72] penup fd 20 pendown] make "append "true end Mit Hilfe von gifsave wird jedes Frame gespeichert, indem es an das bestehende Gif-File angefügt wird. Erzeugen eines animierten Gif-Files Einführung in MSWLogo Autor: H. Sporenberg

154 (gifsave "quadratgif.gif 0 :append 0) Die Syntax von gifsave: GIFSAVE bitmapname delay append loop maxcolor transcolorvector Dabei ist bitmapname der Name des Files, delay ist die Verzögerung der einzelnen Frames, append bewirkt das Anhängen, loop gibt an 1. Keine Schleife (-1) 2. Endlosschleife (0) 3. Schleife mit n Wiederholungen (n), maxcolor bestimmt, wie viele Farben angezeigt werden. Dabei gibt es: 1 (2 Farben) 2 (4 Farben) 4 (8 Farben) Standareinstellung ist 4. transcolorvector gibt an, welche Farben transparent sein sollen. Die Angabe erfolgt in [RED GREEN BLUE] Wenn kein Parameter angegeben ist, ist keine Farbe transparent Erzeugen eines animierten Gif-Files Einführung in MSWLogo Autor: H. Sporenberg

155 Erzeugen eines animierten Gif-Files Einführung in MSWLogo Autor: H. Sporenberg

156 Erzeugen eines animierten Gif-Files Einführung in MSWLogo to GifAnimLok cs setactivearea [-450 -150 450 150] ; Flag to indicate we do not append the first frame make "xko -400 make "append "False repeat 120 ~ [lokvariable :xko ;;hier wird die Lok mit der Farbe schwarz gezeichnet ; Save a frame (no delay and loop forever) (gifsave "lok.gif 0 :append 0) lokvariablewhite :xko ;;hier wird die Lok mit der Farbe weiß gezeichnet make "append "True make "xko :xko+5 ] end Autor: H. Sporenberg

157 Erzeugen eines animierten Gif-Files Einführung in MSWLogo Die beiden Aufrufe, um die Lok zu zeichnen to lokVariable :xko setpc 0 ;; Zeichenstiftfarbe wird auf schwarz gesetzt pu setpos(list :xko 10) pd setpos(list :xko+150 10) setpos(list :xko+150 50) setpos(list :xko+60 50) setpos(list :xko+60 90) setpos(list :xko 90) setpos(list :xko 10) pu setpos(list :xko+50 50) pd setpos(list :xko+50 80) setpos(list :xko+10 80) setpos(list :xko+10 50) setpos(list :xko+50 50) pu setpos(list :xko+20 70) pd setfc 2 fill pu setpos(list :xko+30 10) pd circle 15 pu setpos(list :xko+120 10) pd circle 15 ht end Autor: H. Sporenberg

158 Erzeugen eines animierten Gif-Files Einführung in MSWLogo Die beiden Aufrufe, um die Lok mit der Farbe weiß zu zeichnen to lokVariablewhite :xko setpc 7 ;; Zeichenstiftfarbe wird auf weiß gesetzt pu setpos(list :xko 10) pd setpos(list :xko+150 10) setpos(list :xko+150 50) setpos(list :xko+60 50) setpos(list :xko+60 90) setpos(list :xko 90) setpos(list :xko 10) pu setpos(list :xko+50 50) pd setpos(list :xko+50 80) setpos(list :xko+10 80) setpos(list :xko+10 50) setpos(list :xko+50 50) pu setpos(list :xko+20 70) pd setfc 2 fill pu setpos(list :xko+30 10) pd circle 15 pu setpos(list :xko+120 10) pd circle 15 ht end Autor: H. Sporenberg

159 Die fertige GIF-Animation Einführung in MSWLogo Autor: H. Sporenberg

160 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Die Überlegungen des vor- angegangenen Beispiels (Be- wegung einer Lokomotive) lassen Raum für weitere Pro- jekte. Hier sei die Möglichkeit erwähnt, das altbekannte Spiel TETRIS einmal in MSWLogo zu programmieren. Man beginnt mit einem ein- fachen Programm, mit dem man einen Stein (2 Kästchen lang) nach unten fallen lässt. Jedes Kästchen für die Figuren soll 20 Pixel x 20 Pixel sein. to figur1 cs setpensize[3 3] pu setpos[-200 200] pd setpos[-160 200] setpos[-160 220] setpos[-200 220 ] setpos[-200 200] pu setpos[-190 210] setfc[255 0 0]fill pu setpos[-180 200] pd setpos[-180 220] ht end Autor: H. Sporenberg

161 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Wie bei der Lokomotive, müssen die Koordinaten als Variable vereinbart werden, damit der Stein nach unten fallen kann. Da der Stein sich zuerst nur in y- Richtung bewegen soll, kann die x-Koordinate konstant gehalten werden. Wie beim sich bewegenden Objekt sieht das Programm für eine flexible Figur, dieses Mal aber in y-Richtung wie folgt aus: to figur1Variable :yko cs setpensize[3 3] pu setpos(list -200 :yko) pd setpos(list -160 :yko) setpos(list -160 :yko+20) setpos(list -200 :yko+20) setpos(list -200 :yko) pu setpos(list -190 :yko+10) setfc[255 0 0]fill pu setpos(list -180 :yko) pd setpos(list -180 :yko+20) ht end Ein Aufruf sähe dann so aus: figur1Variable 20 Autor: H. Sporenberg

162 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Wenn die Figur nach links und rechts bewegt werden soll, empfiehlt es sich, nicht nur die y- Koordinate sondern auch die x-Koordinate als Variable anzugeben. Dies ist in dem folgenden Programm geschehen. to figur1BlackH :xko :yko setpc 0 pu setpos(list :xko :yko) pd setpos(list :xko+40 :yko) setpos(list :xko+40 :yko+20) setpos(list :xko :yko+20) setpos(list :xko :yko) pu setpos(list :xko+10 :yko+10) setfc[255 0 0]fill pu setpos(list :xko+20 :yko) pd setpos(list :xko+20 :yko+20) ht end Autor: H. Sporenberg

163 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo to figur1BlackH :xko :yko setpc 0 pu setpos(list :xko :yko) pd setpos(list :xko+40 :yko) setpos(list :xko+40 :yko+20) setpos(list :xko :yko+20) setpos(list :xko :yko) pu setpos(list :xko+10 :yko+10) setfc[255 0 0]fill pu setpos(list :xko+20 :yko) pd setpos(list :xko+20 :yko+20) ht end to figur1WhiteH :xko :yko setpc 7 pu setpos(list :xko :yko) pd setpos(list :xko+40 :yko) setpos(list :xko+40 :yko+20) setpos(list :xko :yko+20) setpos(list :xko :yko) pu setpos(list :xko+10 :yko+10) setfc 7 fill pu setpos(list :xko+30 :yko+10) setfc 7 fill pu setpos(list :xko+20 :yko) pd setpos(list :xko+20 :yko+20) ht end Autor: H. Sporenberg

164 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Der Rahmen, in dem die Figuren fallen, wird mit Hilfe von setpos gezeichnet. Die Umrisslinien des Bodens sollten nicht mit derselben Farbe wie die Seitenwände gezeichnet werden. Hier werden die Seitenwände mit blau, der Boden mit schwarz gezeichnet, damit die Abfrage mit pixel die Figur korrekt stoppt. (Es könnte passieren, wenn die Figur auf den Rand kommt, dass dann schon gestoppt würde). Schwarz auch deshalb, weil die Figuren einen schwarzen Rahmen besitzen. Autor: H. Sporenberg

165 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo to rahmen setpensize[2 2] setpc 1 ;;das ist die Farbe blau Pu setpos[-110 200] pd setpos[-100 200] setpos[-100 -200] setpos[-110 -200] setpos[-110 200] pu setpos[-105 0] pd setfc[180 180 180] fill pu setpos[100 200] pd setpos[110 200] setpos[110 -200] setpos[100 -200] setpos[100 200] pu setpos[105 0] pd setfc[180 180 180] fill setpc 0 ;;hier wird die Farbe schwarz eingestellt pu setpos[-110 -201] pd setpos[110 -201] setpos[110 -210] setpos[-110 -210] setpos[-110 -201] pu setpos[0 -205] pd setfc [180 180 180] fill ht end Autor: H. Sporenberg

166 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Die Figur soll sich nach unten bewegen. Dieses geschieht durch einen rekursiven Aufruf, bei dem der Wert der y-Koordinate verringert wird. Um sicher zu stellen, dass in der Testphase die Figur wirklich gestoppt wird, fragt man über die y-Koordinate ab. Die Figur wird dann an der Stelle :yko noch einmal in schwarz gezeichnet. to bewegung :xko :yko if :yko<-250 [figur1BlackH :xko :yko stop] <- Abbruchbedingung figur1BlackH :xko :yko figur1WhiteH :xko :yko bewegung :xko :yko-5 <- rekursiver Aufruf end Autor: H. Sporenberg

167 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Um die Farbe schwarz des unteren Rahmens abzufragen, wird der Cursor mit Hilfe von setpos um einen Pixel tiefer an die Stelle der gerade gültigen y-Koordinate gesetzt und über pixel wird die Farbe schwarz (=0) abgefragt. Falls die Farbe schwarz erkannt wird, wird die Figur an der Stelle :yko noch einmal in schwarz gezeichnet. to bewegung :xko :yko if :yko<-250 [figur1BlackH :xko :yko stop] pu setpos(list :xko+10 :yko-1) pd if pixel=1 [ figur1BlackH :xko :yko stop] ….. end Autor: H. Sporenberg

168 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Steuerung der Figur von rechts nach links 1 to bewegung :xko :yko 2 if :yko<-250 [figur1Black :xko :yko stop] 3 pu setpos(list :xko :yko-1) pd 4 if pixel=0 [ figur1Black :xko :yko stop] 5 setfocus[MSWLogo Screen] 6 keyboardon[make "keypress keyboardvalue keyboardoff] 7 figur1Black :xko :yko 8 figur1White :xko :yko 9 if And (:xko>-90) (:keypress=44) [make "xko :xko-10 ] 10 if And (:xko<50) (:keypress=46) [make "xko :xko+10] 11 make "keypress 12 12 bewegung :xko :yko-3 13 end Autor: H. Sporenberg

169 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Steuerung der Figur von rechts nach links 5 setfocus[MSWLogo Screen] 6 keyboardon[make "keypress keyboardvalue keyboardoff] Hier wird der Focus auf den MSWLogo-Bildschirm gesetzt und die gedrückte Taste abgefragt. 9 if And (:xko>-90) (:keypress=44) [make "xko :xko-10 ] 10 if And (:xko<50) (:keypress=46) [make "xko :xko+10] Da die Figur innerhalb des Rahmens bleiben muss, lautet die Abfrage für Nach- rechts-bewegen bzw. Nach-links-bewegen: Die Figur wird beim Drücken der entsprechenden Taste um (44 -> Komma und 46 -> Punkt) jeweils 10 Pixel bewegt. Autor: H. Sporenberg

170 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Steuerung der Figur von rechts nach links 09 make "keypress 12 Danach muss die Variable keypress, die den ASCII-Code der gedrückten Taste speichert, wieder auf einen anderen Wert gesetzt werden, sonst bewegt sich die Figur weiter nach links bzw. rechts, da keypress immer noch den Wert der gedrückten Taste (links bzw. rechts) gespeichert hat – die IF-Abfrage ist, soweit die Figur sich im Rahmen befindet, immer noch TRUE. Autor: H. Sporenberg

171 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Die senkrechte Figur Die Figur muss nicht nur nach links und rechts bewegt werden, sondern auch gedreht werden können. Dazu wird eine weitere Figur definiert, die senkrecht zur Ausgangsfigur steht. Hier müssen natürlich zwei Figuren vereinbart werden, zum einen eine schwarz gezeichnete zum anderen eine weiß gezeichnete Figur (figur1BlackV und figur1WhiteV) Autor: H. Sporenberg

172 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Die senkrechte (vertikale) Figur to figur1BlackV :xko :yko setpc 0 pu setpos(list :xko :yko) pd setpos(list :xko+20 :yko) setpos(list :xko+20 :yko+40) setpos(list :xko :yko+40) setpos(list :xko :yko) pu setpos(list :xko+10 :yko+10) setfc[255 0 0]fill ht end to figur1WhiteV :xko :yko setpc 7 pu setpos(list :xko :yko) pd setpos(list :xko+20 :yko) setpos(list :xko+20 :yko+40) setpos(list :xko :yko+40) setpos(list :xko :yko) pu setpos(list :xko+10 :yko+10) setfc 7 fill ht end Autor: H. Sporenberg

173 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Die Figur wird gedreht 1 to bewegung :xko :yko 2 if :yko<-250 [figur1VariableH :xko :yko stop] 3 pu setpos(list :xko :yko-1) pd 4 if And (pixel=1) (:vertikal=0) [ figur1BlackH :xko :yko stop] 5 if And (pixel=1) (:vertikal=1) [ figur1BlackV :xko :yko stop] 6 setfocus[MSWLogo Screen] 7 keyboardon[make "keypress keyboardvalue keyboardoff] 8 if And (:keypress=97) (:vertikal=0) [make "vertikal 1 make "keypress 12] 9 if And (:keypress=97) (:vertikal=1) [make "vertikal 0 make "keypress 12] 10 if And (:xko>-90) (:keypress=44) [make "xko :xko-10 ] 11 if And (:xko<50) (:keypress=46) [make "xko :xko+10] 12 if :vertikal=0 [figur1BlackH :xko :yko figur1WhiteH :xko :yko] 13 if :vertikal=1 [figur1BlackV :xko :yko figur1WhiteV :xko :yko] 14 make "keypress 12 15 bewegung :xko :yko-2 16 end Autor: H. Sporenberg

174 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Die Figur wird gedreht ….. 4 if And (pixel=1) (:vertikal=0) [ figur1BlackH :xko :yko stop] 5 if And (pixel=1) (:vertikal=1) [ figur1BlackV :xko :yko stop] ….. 8 if And (:keypress=97) (:vertikal=0) [make "vertikal 1 make "keypress 12] 9 if And (:keypress=97) (:vertikal=1) [make "vertikal 0 make "keypress 12] ….. 12 if :vertikal=0 [figur1BlackH :xko :yko figur1WhiteH :xko :yko] 13 if :vertikal=1 [figur1BlackV :xko :yko figur1WhiteV :xko :yko] ….. Im Einzelnen: In Zeile 8 bzw. 9 wird der ASCII-Code der gedrückten Taste abgefragt. Beim Drücken der Taste a (=ASCII(97)) wird die Figur gedreht. Da beim Drehen berücksichtigt werden muss ob die derzeitige Figur waagerecht oder senkrecht ist, wird eine Variable vertikal eingeführt, die angibt ob die Figur horizontal oder vertikal ist. (vertikal=0 -> Figur ist horizontal, vertikal=1 -> Figur ist vertikal) Autor: H. Sporenberg

175 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Die Figur wird gedreht ….. 4 if And (pixel=1) (:vertikal=0) [ figur1BlackH :xko :yko stop] 5 if And (pixel=1) (:vertikal=1) [ figur1BlackV :xko :yko stop] ….. 8 if And (:keypress=97) (:vertikal=0) [make "vertikal 1 make "keypress 12] 9 if And (:keypress=97) (:vertikal=1) [make "vertikal 0 make "keypress 12] ….. 12 if :vertikal=0 [figur1BlackH :xko :yko figur1WhiteH :xko :yko] 13 if :vertikal=1 [figur1BlackV :xko :yko figur1WhiteV :xko :yko] ….. Im Einzelnen: Ist die Figur horizontal (vertikal=0) wird die Variable vertikal=1, zusätzlich wird die Variable keypress=12. In den Zeilen 12/13 wird die Variable vertikal abgefragt. Ist vertikal=0 muss die waagerechte Figur nach unten bewegt werden, ist dagegen vertikal=1 handelt es sich um die vertikale Figur. Autor: H. Sporenberg

176 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Die Figur wird gedreht ….. 4 if And (pixel=0) (:vertikal=0) [ figur1BlackH :xko :yko stop] 5 if And (pixel=0) (:vertikal=1) [ figur1BlackV :xko :yko stop] ….. 8 if And (:keypress=97) (:vertikal=0) [make "vertikal 1 make "keypress 12] 9 if And (:keypress=97) (:vertikal=1) [make "vertikal 0 make "keypress 12] ….. 12 if :vertikal=0 [figur1BlackH :xko :yko figur1WhiteH :xko :yko] 13 if :vertikal=1 [figur1BlackV :xko :yko figur1WhiteV :xko :yko] ….. Im Einzelnen: Die Figur muss angehalten werden, wenn der Boden bzw. wenn eine bereits vorhandene Figur erreicht wurde. Dies geschieht in Zeile 4/5. Auch hier muss berücksichtigt werden, ob die zu stoppende Figur horizontal oder vertikal ist (Abfrage über den Wert von vertikal). Entsprechend der Belegung von vertikal wird die horizontale bzw. vertikale Figur dann noch einmal gezeichnet. Autor: H. Sporenberg

177 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Die zweite Figur to figur2Black :xko :yko setpc 0 pu setpos(list :xko :yko) pd setpos(list :xko+40 :yko) setpos(list :xko+40 :yko+40) setpos(list :xko :yko+40) setpos(list :xko :yko) pu setpos(list :xko+10 :yko+10) setfc[0 0 255]fill ht end Als nächstes soll eine zweite Figur eingebaut werden. Dieses soll ein blaues Quadrat sein mit der Seitenlänge 40 Pixel. Die Konstruktion bzw. Bewegung gestaltet sich etwas einfacher. So muss diese Figur z.B. nicht gedreht wer- den. Wie bei der anderen Figur benötigen wir auch hier eine weiße und schwarze Figur to figur2White :xko :yko setpc 7 pu setpos(list :xko :yko) pd setpos(list :xko+40 :yko) setpos(list :xko+40 :yko+40) setpos(list :xko :yko+40) setpos(list :xko :yko) pu setpos(list :xko+10 :yko+10) setfc 7 fill ht end Autor: H. Sporenberg

178 Tetris – ein Versuch in MSWLogo Einführung in MSWLogo Die zweite Figur – die Bewegung Wie schon erwähnt, gestaltet sich auch die Bewegung dieser Figur einfacher. Es muss jetzt nicht abgefragt werden, ob die Figur horizontal oder vertikal vorliegt. to bewegungFigur2 :xko :yko if :yko<-250 [figur2Black :xko :yko stop] pu setpos(list :xko+18 :yko-1) pd if pixel=0 [ figur2Black :xko :yko stop] setfocus[MSWLogo Screen] keyboardon[make "keypress keyboardvalue keyboardoff] figur2Black :xko :yko figur2White :xko :yko if And (:xko>-90) (:keypress=44) [make "xko :xko-10 ] if And(:xko<50) (:keypress=46) [make "xko :xko+10] make "keypress 12 bewegungFigur2 :xko :yko-2 end Autor: H. Sporenberg

179 Erzeugen eines 3D-Frames to 3d_frame ; draw "3D" frame reset setpc 7 sph -110 -110 0 fd 220 rt 90 fd 220 sph -109 -109 0 fd 218 rt 90 fd 218 sph -102 -102 90 fd 204 lt 90 fd 204 setpc 0 sph -110 -110 90 fd 220 lt 90 fd 220 sph -109 -109 90 fd 218 lt 90 fd 218 sph -102 -102 0 fd 204 rt 90 fd 204 sph 0 0 0 setfc 0 fill end Einführung in MSWLogo Wird noch erweitert Autor: H. Sporenberg

180 Langtons Ameisen to ant cs make "start 100 make "finish 300 for [i :start :finish] [for [j :start :finish] [make (word "field :i :j) 0]] make "n 20000 make "antx (:start+:finish)/2 make "anty (:start+:finish)/2 make "jump 3 make "stepcount 0 make "framedelay 20 setactivearea [-260 -260 260 260] make "append "false for [a 1 :n] [ifelse (or :antx :finish :anty>:finish) ~ [print[error: ant went to far] stop] [move]] end to move ifelse (thing (word "field :antx :anty))=0 [squareblack :jump rt 90 fd :jump make (word "field :antx :anty) 1] [squarewhite :jump lt 90 fd :jump make (word "field :antx :anty) 0] ifelse or heading=90 heading=270 [ifelse heading=90 [make "antx :antx+1][make "antx :antx-1]]~ [ifelse heading=0 [make "anty :anty+1][make "anty :anty-1]] end Einführung in MSWLogo Autor: H. Sporenberg

181 Langtons Ameisen to squareblack :size penpaint fd (:size-1)/2 rt 90 repeat :size-1 [fd (:size-1)/2 bk :size-1 fd (:size-1)/2 rt 90 fd 1 lt 90] fd (:size-1)/2 bk :size-1 fd (:size-1)/2 lt 90 fd (:size-1)/2 penup make "stepcount :stepcount +1 ;if :stepcount = :framedelay [(gifsave "ant.gif 0 :append 0) make "stepcount 0 make "append "true] end to squarewhite :size penerase fd (:size-1)/2 rt 90 repeat :size-1 [fd (:size-1)/2 bk :size-1 fd (:size-1)/2 rt 90 fd 1 lt 90] fd (:size-1)/2 bk :size-1 fd (:size-1)/2 lt 90 fd (:size-1)/2 penup make "stepcount :stepcount +1 ;if :stepcount = :framedelay [(gifsave "ant.gif 0 :append 0) make "stepcount 0 make "append "true] end Einführung in MSWLogo Autor: H. Sporenberg

182 Langtons Ameisen Mit Hilfe des Befehls gifsave kann man eine Animation erstellen. Dazu muss in den beiden Prozeduren Squareblack und Squarewhite jeweils die Zeile ;if :stepcount = :framedelay [(gifsave "ant.gif 0 :append 0) make "stepcount 0 make "append "true] für den Programmcode freigegeben werden, d.h. das Semikolon muss entfernt werden. Mit dem Befehl gifsave wird dann die Datei ant.gif erzeugt, die alle Bilder enthält. Diese Gif-Datei kann dann aufgerufen werden. Einführung in MSWLogo Autor: H. Sporenberg

183 Langtons Ameisen – kurze Version to langton1 :anzahl if :anzahl>20000[stop] ifelse pixel = [0 0 0] [ setpixel[255 255 255] rt 90 fd 2 ]~ [ if pixel = [255 255 255] [ setpixel[0 0 0]lt 90 fd 2 ] ] langton1 :anzahl+1 end to main cs setpensize[4 4] setfloodcolor[0 0 0] fill langton1 1 end Einführung in MSWLogo Autor: H. Sporenberg

184 Langtons Ameisen – kurze Version – Mit Gif- Animation to langton1 :anzahl if :anzahl>20000[stop] ifelse pixel = [0 0 0] [ setpixel[255 255 255] rt 90 fd 2 ]~ [ if pixel = [255 255 255] [ setpixel[0 0 0]lt 90 fd 2 ] ] make "stepcount :stepcount +1 if :stepcount = :framedelay [(gifsave "ant.gif 0 :append 0)~ make "stepcount 0 make "append "true] langton1 :anzahl+1 end to main cs setpensize[4 4] setfloodcolor[0 0 0] Fill make "stepcount 0 make "framedelay 20 setactivearea [-260 -260 260 260] make "append "false langton1 1 end Einführung in MSWLogo Autor: H. Sporenberg

185 Dreidimensionale Darstellung Mit dem Befehl PERSPECTIVE wird der 3D Modus eingeschaltet. Zur Bewegung im Raum gibt es folgende Befehle: 1.Schrittweise Drehung um die z-Achse : right, left (diese stammen von den 2D- Bewegungen) Winkel absolut setzen mit SETHEADING 2.Schrittweise Drehung um die x-Achse : uppitch, downpitch Winkel absolut setzen mit SETPITCH 3. Schrittweise Drehung um die y-Achse: rightroll, leftroll Winkel absolut setzen mit SETROLL Einführung in MSWLogo Autor: H. Sporenberg

186 Das Koordinatensystem – der Befehl setposxyz Einführung in MSWLogo Dreidimensionale Darstellung In der 2D-Darstellung wird die Turtle (bzw. der Cursor) mit Hilfe des Befehls setpos[100 50] an die Stelle x=100 und y=50 auf dem Bildschirm bewegt. Der Befehl setposxyz bewirkt dies entsprechend für die 3D- Darstellung. Syntax: setposxyz[100 50 10] bzw. wenn die Koordinaten über Variable angesprochen werden setposxyz(list :xko :yko :zko) Autor: H. Sporenberg

187 1. Einrichten des Interface unter Windows XP Fischer-Technik 2. Einrichten des Interface unter Windows 2000 3. Allgemeine Hinweise 4. Programmierbeispiel in MSWLogo Einführung in MSWLogo Autor: H. Sporenberg

188 Die Datei WinRT.SYS nach *\Windows\system32\drivers kopieren Fischer-Technik Die Datei mswfish.zip kann von der Seite http://www.ulrich- mueller.de/download.htm heruntergeladen werden. Dann wird sie mit Winzip entzipped.http://www.ulrich- mueller.de/download.htm Eintragen in die Registry durch Doppelklick auf die Datei WinRTSYS.REG Die Datei mswFish.DLL in *\Windows\system32 einfügen. Neu booten Für Windows XP Einführung in MSWLogo Autor: H. Sporenberg

189 Die Datei WinRT.SYS nach *\WinNT\system32\drivers kopieren Fischer-Technik Die Datei mswfish.zip kann von der Seite http://www.ulrich- mueller.de/download.htm heruntergeladen werden. Dann wird sie mit Winzip entzipped.http://www.ulrich- mueller.de/download.htm Eintragen in die Registry durch Doppelklick auf die Datei WinRTSYS.REG Die Datei mswFish.DLL in *\WinNT\system32 einfügen. Neu booten Für Windows 2000 Einführung in MSWLogo Autor: H. Sporenberg

190 Das Interface wird über eine serielle Schnittstelle mit dem Computer verbunden (am Computer z.B. Com1,Com2) Fischer-Technik Das Interface verfügt über vier digitale Ausgänge (M1 – M4), acht digitale Eingänge ( E1 – E8) und zwei analoge Eingänge (EX, EY). Das Interface Während das Interface durch z.B. ein Programm geöffnet ist können Druckertreiber zwar laufen es kann jedoch nicht gedruckt werden Einführung in MSWLogo Autor: H. Sporenberg

191 Bei diesem Beispiel sind drei Lampen an die digitalen Ausgänge M1-M3 angeschlossen.Es soll erst die erste dann die zweite und dann die dritte Lampe aufleuchten und wieder ausgehen. Aus diesem Programm lassen sich dann auch verschiedene Dinge machen z.B. eine Art Ampelschaltung. Fischer-Technik Programmbeispiel Einführung in MSWLogo Autor: H. Sporenberg

192 Zu Beginn schreibt man die Programme zum Öffnen und Schließen des Interface. Das sieht dann so aus: Fischer-Technik Programmbeispiel to ftOpen :Port dllload "mswFish.DLL dllcall (list "v "mswSetDCB "1 "8 "1 "1) dllcall (list "v "mswOpenInterface "s :Port) end Das Programm zum Öffnen nennen wir hier ftOpen für die die Variable :Port angegeben werden muss(z.B.Com1) Danach wird die DLL geöffnet. Einführung in MSWLogo Autor: H. Sporenberg

193 Zum Schalten der Lampen dient das Programm ftLampe Fischer-Technik Programmbeispiel to ftLampe :Lampe :AnAus dllcall (list "v "mswSetMotor "1 :Lampe "1 :AnAus) end Beim Aufruf müssen die Variablen Lampe und AnAus übergeben werden. Das ist zum einen die Nummer der Lampe (in diesem Falle sind die Werte 1-3 möglich, weil drei Lampen angeschlossen sind), zum anderen der Zustand der Lampe (Wert 1 ist an, 0 ist aus). Einführung in MSWLogo Autor: H. Sporenberg

194 Fischer-Technik Programmbeispiel to Light1Off ftLampe 1 0 end to Light1On ftLampe 1 1 end Diese beiden Programme benutzen das Programm ftLampe, um die Lampe 1 ein- bzw. auszuschalten. Für die Lampe 2 und Lampe 3 werden entsprechende Programme zum Ein- und Ausschalten geschrieben. Einführung in MSWLogo Autor: H. Sporenberg

195 Fischer-Technik Programmbeispiel to main ftOpen "COM1 Lampe1on wait 50 Lampe1off Lampe2on wait 50 Lampe2off Lampe3on wait 50 Lampe3off ftClose end Als erstes wird das Interface hier an Com1 mit dem Programm ftOpen geöffnet. Danach wird die erste Lampe eingeschaltet, es wird gewartet und die erste Lampe wird wieder ausgeschaltet. Dann geschieht das selbe mit der zweiten und der dritten Lampe. Dann wird das Interface durch das Programm ftClose wieder geschlossen. Einführung in MSWLogo Autor: H. Sporenberg

196 Fischer-Technik Hello Fish Als erstes wird das Interface hier an Com1 mit dem Programm ftOpen geöffnet. Danach wird die erste Lampe eingeschaltet, es wird gewartet und die erste Lampe wird wieder ausgeschaltet. Dann geschieht das selbe mit der zweiten und der dritten Lampe. Dann wird das Interface durch das Programm ftClose wieder geschlossen. Einführung in MSWLogo Autor: H. Sporenberg

197 Fischer-Technik Ein einfacher Roboter Einführung in MSWLogo Autor: H. Sporenberg

198 Fischer-Technik Ein einfacher Roboter Einführung in MSWLogo Autor: H. Sporenberg

199 Fischer-Technik Ein einfacher Roboter Einführung in MSWLogo Autor: H. Sporenberg

200 Fischer-Technik Ein einfacher Roboter Einführung in MSWLogo Autor: H. Sporenberg

201 Fischer-Technik Ein einfacher Roboter Einführung in MSWLogo Autor: H. Sporenberg

202 Fischer-Technik Ein einfacher Roboter Einführung in MSWLogo Autor: H. Sporenberg

203 Fischer-Technik Ein einfacher Roboter Einführung in MSWLogo Autor: H. Sporenberg

204 Fischer-Technik Das ROBO Interface Die beiden Dateien umFish40.DLL und umFish40.lib müssen in c:\WINDOWS\system32 kopiert werden. Die Datei kann heruntergeladen werden, von der Seite http://www.ftcomputing.de/sitemape.htm Hier geht man auf MSWLogo. Um umFish40.DLL und umFish40.lib zu erhalten, muss man umFish41.zip downloaden und entzippen. Einführung in MSWLogo Autor: H. Sporenberg

205 Fischer-Technik Das ROBO Interface Um zu überprüfen, ob das Interface richtig angeschlossen ist, kann das Programm umFishDP40.exe aufgerufen werden. Das Interface muss an den 1. USB- Anschluss angeschlossen werden (Achtung – wo ist die Maus?). Nach dem Button START können die Anschlüsse entsprechend den Vorgaben geprüft werden. Einführung in MSWLogo Autor: H. Sporenberg

206 Fischer-Technik Das ROBO Interface Die Installation des USB-Treibers für das ROBO Interface Zur Installation des Treibers sollte die ROBO Pro Software installiert sein (wenn nicht die komplette Software, dann sollte es wenigstens die Demo-Version sein). Beim Anschluss des ROBO Interface an der USB-Schnittstelle wird eine neue Hardware erkannt und es öffnet sich der Hardware-Assistent Einführung in MSWLogo Autor: H. Sporenberg

207 Fischer-Technik Das ROBO Interface Den Punkt Nein, diesmal nicht auswählen Einführung in MSWLogo Autor: H. Sporenberg

208 Fischer-Technik Das ROBO Interface Den Punkt Software von einer Liste oder bestimmten Quelle installieren auswählen. Einführung in MSWLogo Autor: H. Sporenberg

209 Fischer-Technik Das ROBO Interface Die gezeigten Punkte auswählen und unter Durchsuchen das Unterverzeichnis USB-Treiber Installation in dem Verzeichnis, in dem ROBO Pro installiert ist, auswählen (Standardverzeichnis: C:\Programme\ROBOPro\USB-Treiber Installation). Nach dem Bestätigen mit Weiter wird der Treiber installiert. Einführung in MSWLogo Autor: H. Sporenberg

210 Fischer-Technik Das ROBO Interface Softwareinstallation Einführung in MSWLogo Autor: H. Sporenberg

211 Fischer-Technik Das ROBO Interface Softwareinstallation Einführung in MSWLogo Autor: H. Sporenberg

212 Fischer-Technik Das ROBO Interface Die Befehle: Einführung in MSWLogo Autor: H. Sporenberg

213 Fischer-Technik Das ROBO Interface Die Befehle: rbOpenInterface Einführung in MSWLogo Autor: H. Sporenberg

214 to ccc ; --- ROBO Starter Kit first program, mswFish40 rbOpenInterface rbSetMotor 1 1 wait 100 rbSetMotor 1 0 rbCloseInterface pr "Beendet end Fischer-Technik Programmbeispiel Im selben Verzeichnis müssen sich die folgenden 2 Dateien befinden: mswFish40 mswFish40.lgo Einführung in MSWLogo Autor: H. Sporenberg

215 Fischer-Technik Programmbeispiel Einführung in MSWLogo Autor: H. Sporenberg

216 Fischer-Technik Das ROBO Interface – Windows 7 bzw. Windows 8 Folgende Vorbreitungen für die Roboterpro- grammierung mit MSWLogo sind notwendig Einführung in MSWLogo Autor: H. Sporenberg 1.Installation der Software MSWLogo. Die letzte Version hat die Nummer 6.5. Nachfolger von MSWLogo ist FMSLogo 6.32

217 Fischer-Technik Das ROBO Interface – Windows 7 bzw. Windows 8 Folgende Vorbreitungen für die Roboterpro- grammierung mit MSWLogo sind notwendig Einführung in MSWLogo Autor: H. Sporenberg 2.Installation der Software RoboPro. Bei mir ist es die Version 1.1.2.41. Wenn man keine gekaufte Version besitzt, muss man eine Demo-Version herunterladen und installieren. „http://www.fischertechnik.de/home/info/Computing/ROBO-Pro- Software.aspx/usetemplate-1_column_no_pano/

218 Fischer-Technik Das ROBO Interface – Windows 7 bzw. Windows 8 Folgende Vorbreitungen für die Roboterpro- grammierung mit MSWLogo sind notwendig Einführung in MSWLogo Autor: H. Sporenberg 3.Nach der Installation der Demo- oder Originalversion sollte ein Update durchgeführt werden. Die entsprechende Datei kann von der Fischertechnikseite heruntergeladen werden. Der Name der Datei ist ROBOProUpdate326.zip (ca. 83 MB). Diese muss noch entzipped werden und man erhält: ROBOProUpdate326.msi (ca. 84 MB). „http://www.fischertechnik.de/home/downloads/Computing.aspx/

219 Fischer-Technik Das ROBO Interface – Windows 7 bzw. Windows 8 Folgende Vorbreitungen für die Roboterpro- grammierung mit MSWLogo sind notwendig Einführung in MSWLogo Autor: H. Sporenberg 4.Die DDL-Dateien müssen in den Windows- Ordner kopiert werden. Dieses sind: 1.UmFish40.dll und 2.UmFish40.lib Bei Windows 7 ist das der Ordner: C:\Windows\System32 Bei Windows 8.1 ist das der Ordner: C:\Windows\SysWOW64

220 Fischer-Technik Das ROBO Interface – Windows 7 bzw. Windows 8 Folgende Vorbreitungen für die Roboterpro- grammierung mit MSWLogo sind notwendig Einführung in MSWLogo Autor: H. Sporenberg 5.Um zu überprüfen, ob das Interface am USB-Anschluss angeschlossen ist, muss dies mit einem Programm überprüft werden. Es handelt sich dabei um das Programm: Cs2005fish40setup.exe (1,7 MB) Dieses Programm muss installiert und dann aufgerufen werden. Es erscheint folgendes Fenster. Im ersten Eingabefenster muss USB first USB eingestellt werden. 6.Die beiden Dateien umFish40 und mswFish40.lgo müssen in das Verzeichnis kopiert werden, in dem nachher die MSWLogo- Dateien abgespeichert werden.

221 Fischer-Technik Das ROBO Interface – Windows 7 bzw. Windows 8 Folgende Vorbreitungen für die Roboterpro- grammierung mit MSWLogo sind notwendig Einführung in MSWLogo Autor: H. Sporenberg Jetzt wird MSWLogo aufgerufen. Das Programm muss in das Verzeichnis abgespeichert werden, in dem sich die Dateien umFish40 und mswfish40.lgo befinden. to ccc mswFish40 rbOpenInterface rbSetMotor 1 1 wait 100 rbSetMotor 1 0 rbCloseInterface pr "Beendet end

222 Nützliche Internetadressen http://http://www.keslian.co.uk/logoarts/top/progs.html Einführung in MSWLogo Autor: H. Sporenberg

223 XLogo - Bäume to Blossom Make "myPenCol PenColor Make "myHeading Heading SetPC 6 SetHeading 180 Forward 5 Back 5 SetPC :myPenCol SetHeading :myHeading end to Go Repeat 4 [New Back 160 PenDown Tree 80 Wait 200] end to New cs setactivearea [-300 -300 300 300] setfloodcolor[0 0 0] fill Setpencolor[0 255 0] PenUp HideTurtle end to Tree :Length If :Length< 10 [Blossom Stop] ;; ends recursion if branch too small SetPensize[3 3] ;; reduce pen width as branch length gets smaller SetPC TreeCol :Length ;; branch color depends on length LocalMake "Angle Pick [24 32 40 48 56 64 72] LocalMake "TreeAngle :Angle*Pick [0.25 0.375 0.5 0.625 0.75] Forward :Length Left :TreeAngle Tree :Length * Pick [0.7 0.75 0.8] Right :Angle Tree :Length * Pick [0.7 0.75 0.8] Left :Angle Right :TreeAngle PenUp Back :Length PenDown ;; return to starting point end to TreeCol :Length Make "Green Round 2.5*(100-:Length) ;;green depends on length Output ( List 255 :Green 0 ) ;;red set to 255 and blue to 0 end Einführung in MSWLogo Autor: H. Sporenberg

224 XLogo - Bäume Trees1.mht Einführung in MSWLogo Autor: H. Sporenberg

225 XLogo - Farn To Fern :Size If :Size < 5 [Stop] Forward :Size / 20 Left 80 Fern :Size * 0.3 Right 82 Forward :Size / 20 Right 80 Fern :Size * 0.3 Left 78 Fern :Size * 0.9 Left 2 Back :Size / 20 End To Go New SetPos [-50 -170] PenDown Fern 440 End To Hue :Angle ;; Green from 187 to 252 Make "Green 0.18*:Angle + 187 Output ( List 215 :Green 88 ) End To New ;; set defaults, screen, pen and ;;turtle cs setactivearea [-300 -300 300 300] setfloodcolor[0 0 0] fill Setpencolor[0 255 0] setpensize[2 2] PenUp HideTurtle End Fractals1.mht im Ordner keslian_logo Einführung in MSWLogo Autor: H. Sporenberg

226 XLogo – Knuth-Kurve To Go :Order New Init :Order SetPos List Minus 190 Minus 184 ;;Setpencolor[0 255 255] PenDown Knuth :Order Minus 90 45 ;; angle -90 turn 45 End To Init :Order Make "Pause Abs 11-:Order Make "Ord Round :Order/2 Make "Size 3 * Power 2 (6-:Ord) ;; make Size a global value End Fractals14.mht im Ordner keslian_logo To Knuth :Order :Angle :Turn If :Order < 1 [Right 45+:Turn Forward :Size Left 45+:Turn Wait :Pause Stop] Right 2*:Turn+:Angle Knuth :Order-1 2*:Turn Minus :Turn Right 45-3*:Turn-:Angle Forward :Size Left 45-:Turn+:Angle Knuth :Order-1 0 Minus :Turn Right :Angle End To New ;; set defaults, screen, pen and turtle cs setactivearea [-300 -300 300 300] setfloodcolor[0 0 0] fill Setpencolor[255 255 0] setpensize[4 4] PenUp HideTurtle End Einführung in MSWLogo Autor: H. Sporenberg

227 Auf der Motivate-Homepage http://motivate.maths.org/conferences/conf107/c107_Logo_fractals.shtml Einführung in MSWLogo Autor: H. Sporenberg

228 Auf der Motivate-Homepage to allvonkoch ; draws 6 stages on same screen cs pu fd 280 lt 90 fd 300 rt 90 pd vonkoch2 200 0 pu rt 90 fd 250 lt 90 pd vonkoch2 200 1 pu rt 90 fd 250 lt 90 pd vonkoch2 200 2 pu bk 300 lt 90 fd 500 rt 90 pd vonkoch2 200 3 pu rt 90 fd 250 lt 90 pd vonkoch2 200 4 pu rt 90 fd 250 lt 90 pd vonkoch2 200 5 ht end to side :x :y if :y = 0 [fd :x stop] side :x/3 :y-1 lt 60 side :x/3 :y-1 rt 120 side :x/3 :y-1 lt 60 side :x/3 :y-1 end to vonkoch1 ; superimposes 6 stages cs pu lt 90 fd 200 rt 90 pd vonkoch2 500 0 vonkoch2 500 1 vonkoch2 500 2 vonkoch2 500 3 vonkoch2 500 4 vonkoch2 500 5 end to side :x :y if :y = 0 [fd :x stop] side :x/3 :y-1 lt 60 side :x/3 :y-1 rt 120 side :x/3 :y-1 lt 60 side :x/3 :y-1 end to vonkoch2 :x :y ; draws single curve size :x stage :y at current cursor position repeat 3 [side :x :y rt 120] end to vonkoch3 ; draws sixth stage cs pu bk 300 lt 90 fd 200 rt 90 pd vonkoch2 500 5 end Einführung in MSWLogo Autor: H. Sporenberg

229 Auf der Motivate-Homepage to allgasket ; note - draws 7 stages one after the other cs gasket 1024 1024 gasket1 1024 512 gasket1 1024 256 gasket1 1024 128 gasket1 1024 64 gasket1 1024 32 gasket1 1024 16 ht end to gasket :x :n ;note - clears screen, positions cursor, draws gasket size x, smallest triangle size y cs pu bk 30 lt 90 fd 200 rt 90 pd gasket1 :x :n end to gasket1 :x :n ; note - draws gasket size x, smallest triangle size y, from current position if :x < :n [stop] repeat 3 [gasket1 :x/2 :n fd :x/2 rt 120] end Sierpinski-Dreieck Einführung in MSWLogo Autor: H. Sporenberg

230 Auf der Motivate-Homepage to allcesaro ; notes - draws 4 stages on same screen cs pu fd 200 rt 90 fd 200 lt 90 pd cesaro1 150 1 pu lt 90 fd 300 rt 90 pd cesaro1 150 2 pu bk 200 pd cesaro1 150 3 pu rt 90 fd 300 lt 90 pd cesaro1 150 4 ht end to cesaro1 :s :n ; notes - draws cesaro size :s stage :n from cursor position ; start cesaro1 350 3 - positions cursor and draws stage3 repeat 4 [spike :s :n lt 90] end to singlecesaro :s :n ; notes - positions cursor, draws cesaro size :s stage :n cs pu bk 250 rt 90 fd 150 lt 90 pd cesaro1 :s :n end to spike :s :n if :n = 0 [fd :s stop] spike :s*0.453 :n - 1 lt 84 spike :s*0.453 :n - 1 rt 168 spike :s*0.453 :n - 1 lt 84 spike :s*0.453 :n - 1 end Cesaro-Fraktal Einführung in MSWLogo Autor: H. Sporenberg

231 Auf der Motivate-Homepage Cesaro-Fraktal Stufe 1Stufe 2 Stufe 5 Einführung in MSWLogo Autor: H. Sporenberg

232 Auf der Motivate-Homepage to broccoli :x :y ; largest square has side x and smallest square has side y ; for example type broccoli 120 2 cs pu lt 90 fd 50 rt 90 pd broccoli1 :x :y ht end to broccoli1 :x :y if :x < :y [stop] square :x fd :x lt 45 broccoli1 :x/sqrt(2) :y pu rt 90 fd :x/sqrt(2) pd broccoli1 :x/sqrt(2) :y pu bk :x/sqrt(2) lt 45 pd bk :x end to square :x repeat 4 [fd :x rt 90] end Broccoli-Fraktal Einführung in MSWLogo Autor: H. Sporenberg

233 Auf der Motivate-Homepage Broccoli-Fraktal Aufruf: broccoli 90 10 Aufruf: broccoli 90 5 Aufruf: broccoli 90 2 Einführung in MSWLogo Autor: H. Sporenberg

234 Auf der Motivate-Homepage to forest cs pu fd 500 pd sycamore1 150 tree 350 -310 120 20 6 tree 200 -290 80 25 6 tree -320 -280 110 27 7 ht end to tree :x :y :u :a :s ; draws tree1 at position (x,y) pu setpos (list :x :y) pd tree1 :u :a :s end to tree1 :u :a :s ; note - draws tree in current cursor position with size :u, angle :a, stage :s if :s = 0 [stop] fd :u rt :a tree1 :u*(0.5+0.04*random 10) :a :s - 1 lt 2*:a tree1 :u*(0.5+0.04*random 10) :a :s - 1 rt :a bk :u end to sycamore1 :x cs pu bk 300 pd sycamore2 :x end to sycamore2 :x if :x < 12 [stop] fd :x rt 25 sycamore2 :x*0.7 lt 25 sycamore2 :x*0.6 lt 28 sycamore2 :x*0.7 rt 28 bk :x end Forest of trees fractal Einführung in MSWLogo Autor: H. Sporenberg

235 2.Arbeit Differenzierung 8/1 – 11.12.2001 Einführung in MSWLogo Thema: Logo-Programmierung 1.Aufgabe: a) Schreibe jeweils ein Logo-Programm, mit dem ein Quadrat bzw. ein gleichseitiges Dreieck der Seitenlänge 100 gezeichnet wird. (Ohne repeat) b) Verändere die beiden Programme, indem du eine Wiederholungsschleife einbaust. c) Verändere beide Programme, so dass bei Eingabe die Länge des Quadrats bzw. des Dreiecks gewählt werden kann. 2.Aufgabe: a) Schreibe ein Programm, mit Hilfe dessen man ein regelmäßiges n-Eck zeichnen kann. Dabei soll bei der Eingabe die Anzahl der Ecken und die Länge der Seiten veränderbar sein. b) Wie lässt sich mit diesem Programm ein Kreis zeichnen? Erläutere! 3. Aufgabe: a) Schreibe ein Logo-Programm, mit dem das Haus- vom-Nikolaus gezeichnet werden kann. b) Schreibe ein Logo-Programm, das ein Parallelogramm zeichnet. Autor: H. Sporenberg

236 2.Arbeit Differenzierung 8/1 – 11.12.2001 Einführung in MSWLogo 4.Aufgabe: Schreibe ein Logo-Programm, das die folgenden Figuren zeichnet. Du kannst dazu das Programm aus 2a) zum Zeichnen der n-Ecke benutzen. Autor: H. Sporenberg 5.Aufgabe: Entwickle ein Programm, das nebenstehendes Haus zeichnet. Das Dach ist ein gleichseitiges Dreieck. Die Breite der Tür beträgt ein Drittel der Hausbreite, die Höhe der Tür die Hälfte der Höhe des Hauses.

237 2.Aufgabe: Einführung in MSWLogo to nEck :anzahl :laenge setpensize[5 5] setpencolor[100 50 255] repeat :anzahl [FD :laenge Left 360/:anzahl] end to vielekreise cs repeat 6[lt 60 neck 100 5] end Aufruf: vielekreise Autor: H. Sporenberg 2.Arbeit Differenzierung 8/1 – 11.12.2001 -Lösung

238 3.Aufgabe b) Einführung in MSWLogo to parallelogramm cs setpensize[5 5] setpencolor[100 50 255] lt 55 fd 100 lt 125 fd 200 lt 55 fd 100 lt 125 fd 200 end Autor: H. Sporenberg 2.Arbeit Differenzierung 8/1 – 11.12.2001 -Lösung

239 2.Arbeit Differenzierung 8/1 7.Aufgabe: Einführung in MSWLogo to reflexion :xwert :ywert :addy if :ywert>250[make "addy -:addy setpc[255 0 0]] if :ywert<-250[make "addy -:addy setpc[255 255 0]] wait 2 setpos(list :xwert :ywert) reflexion :xwert :ywert+:addy :addy end to spiegel cs wandoben wandunten reflexion 0 0 5 end Aufruf: spiegel to WandOben setpensize[4 4] setpencolor [139 119 101] pu setpos[-400 250] pd setpos[400 250] setpos[400 280] setpos[-400 280] setpos[-400 250] pu setpos [-380 260] setfc[255 160 132] fill setpc[150 150 150] home pd end to WandUnten setpensize[4 4] setpencolor [139 119 101] pu setpos[-400 -250] pd setpos[-400 -280] setpos[400 -280] setpos[400 -250]setpos[-400 -250] pu setpos [-380 -260] setfc[255 160 132] fill setpc[150 150 150] home pd end Autor: H. Sporenberg

240 1.Arbeit Differenzierung 8/2 vom 27.03.09 Einführung in MSWLogo 1.Aufgabe: a) Folgendes Programm liegt vor: to unbekannt1 :laenge repeat 6[fd :laenge back :laenge rt 60] end Wie sieht die Figur beim Aufruf unbekannt1 100 aus? Zeichne. b) Die Schleife aus a) wird benutzt, um einen rekursiven Aufruf durchzuführen. Wie sieht die Figur beim Aufruf unbekannt2 100 aus? Skizziere. to unbekannt2 :laenge if :laenge<1[stop] repeat 6[fd :laenge unbekannt2 :laenge/3 back :laenge rt 60] end c) Erläutere die Programmiermethode REKURSIV an einem selbstge- wählten Beispiel. Autor: H. Sporenberg

241 1.Arbeit Differenzierung 8/2 vom 27.03.09 Einführung in MSWLogo 2. Aufgabe: a) Folgendes MSWLogo-Programm ist gegeben: to unbekannt3 :laenge if :laenge <5[stop] pu fd :laenge pd fd :laenge back :laenge rt 90 fd :laenge back :laenge lt 90 pu back :laenge pd fd :laenge back :laenge rt 90 fd :laenge back :laenge lt 90 pu rt 90 fd :laenge lt 90 pd fd :laenge back :laenge rt 90 fd :laenge back :laenge lt 90 pu rt 90 back :laenge lt 90 pd end Wie sieht die Figur beim Aufruf unbekannt3 100 aus? Zeichne. Autor: H. Sporenberg

242 1.Arbeit Differenzierung 8/2 vom 27.03.09 Einführung in MSWLogo 2.b) In die Leerzeilen des obigen Programms werden jetzt jeweils rekursive Aufrufe eingebaut. Skizziere die dann entstehende Figur beim Aufruf von unbekannt4 100. to unbekannt4 :laenge if :laenge <5[stop] pu fd :laenge pd fd :laenge back :laenge rt 90 fd :laenge back :laenge lt 90 unbekannt4 :laenge /2 pu back :laenge pd fd :laenge back :laenge rt 90 fd :laenge back :laenge lt 90 unbekannt4 :laenge /2 pu rt 90 fd :laenge lt 90 pd fd :laenge back :laenge rt 90 fd :laenge back :laenge lt 90 unbekannt4 :laenge /2 pu rt 90 back :laenge lt 90 pd end Autor: H. Sporenberg

243 1.Arbeit Differenzierung 8/2 vom 27.03.09 Einführung in MSWLogo 3. Aufgabe: a) Erläutere ausführlich, wie man mit Hilfe der Tastatur den Cursor auf dem Graphikbildschirm steuert. b) Schreibe dazu die wichtigen Prozeduren und erläutere diese ausführlich. c) Erläutere, wie beim Körner-Sammeln erreicht wird, dass die überfahrenen Körner auf dem Bildschirm verschwinden. Schreibe dazu ein Programm und erläutere die einzelnen Befehle. 4.Aufgabe: a) Erläutere den Befehl setpos (1. Angabe der Koordinaten durch Zahlen 2. Angabe der Koordinaten durch Variable) b) Programmiere die nebenstehende Figur. Erstelle dazu eine Skizze des Fahrzeuges und beschrifte die Punkte mit den entsprechenden Koordinaten (der linke untere Punkt hat die Koordinaten (-400/10)). Schreibe dazu das entsprechende Programm. Das Fenster ist mit der Farbe Grün ausgefüllt. Für die Zeichnung muss der Befehl setpos verwendet werden. Autor: H. Sporenberg

244 Einführung in MSWLogo 4b) Programmiere die nebenstehende Figur. Erstelle dazu eine Skizze des Fahrzeuges und beschrifte die Punkte mit den entsprechenden Koordinaten (der linke untere Punkt hat die Koordinaten (-400/10)). Schreibe dazu das entsprechende Programm. Das Fenster ist mit der Farbe Grün ausgefüllt. Für die Zeichnung muss der Befehl setpos verwendet werden. c) Die linke untere Ecke wird jetzt mit Hilfe zweier Variablen (XKoordinate und YKoordinate) angesprochen. Schreibe dazu das entsprechende Programm LokomotiveVariable. Der Aufruf sollte dann wie folgt erfolgen: LokomotiveVariable -400 10 d) Die Lokomotive soll jetzt von links nach rechts bewegt werden. Erläutere das Verfahren, wie dies realisiert werden kann. Schreibe dazu die entsprechenden Prozeduren. 1.Arbeit Differenzierung 8/2 vom 27.03.09 Autor: H. Sporenberg

245 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo 2. Arbeit Marl, 6.05.009 Diff9 – Informatik - Fachlehrer: H.Sporenberg 1.Aufgabe: a) Erläutere den Befehl setpos (1. Angabe der Koordinaten durch Zahlen 2. Angabe der Koordinaten durch Variable) b) Programmiere die nebenstehende Figur. Erstelle dazu eine Skizze des Fahrzeuges und beschrifte die Punkte mit den entsprechenden Koordinaten (die linke untere Ecke hat die Koordinaten (-300/20)). Schreibe dazu das entsprechende Programm. Für die Zeichnung muss der Befehl setpos verwendet werden. c) Die linke untere Ecke wird jetzt mit Hilfe zweier Variablen (XKoordinate und YKoordinate) angesprochen. Schreibe dazu das entsprechende Programm AutoMitVariable. Der Aufruf sollte dann wie folgt erfolgen: AutoMitVariable -300 20 Autor: H. Sporenberg

246 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo 2.Aufgabe: Auf einem waagerechten Holzbrett (s. Abbildung) soll ein Rad von rechts nach links rollen. a) Schreibe eine Prozedur, die das Brett zeichnet (Breite des Brettes: 800 Pixel, Höhe des Brettes: 20 Pixel). b) Schreibe eine Prozedur, die das Rad (Radius des Kreises: 40 Pixel) so zeichnet wie in der Abbildung. Dabei soll der Mittelpunkt des Kreises die Koordinaten xko und yko haben. Die Prozedur hat folgende vorgegebene Struktur: to KreisSchwarz :xko :yko ….. end c) Schreibe eine Prozedur, die den Kreis in der Farbe weiß zeichnet. d) Schreibe jetzt eine rekursive Prozedur, die den Kreis von rechts nach links bewegt. Überlege dir, welche Koordinate verändert werden muss und begründe dies. Die Prozedur hat folgende vorgegebene Struktur: to Bewegung :xko :yko ….. end Autor: H. Sporenberg

247 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo 3. Aufgabe: Ein Ball, dargestellt durch einen Kreis, fällt aus einer bestimmten Höhe auf die Wiese und bleibt dort unten liegen. Unterteile dieses Problem in kleinere Teilprobleme und beschreibe diese ausführlich. Schreibe dann zu diesen Teilproblemen jeweils die entsprechenden MSWLogo- Prozeduren. Autor: H. Sporenberg

248 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo 4. Aufgabe: Im Wasser befinden sich zwei Luftblasen (rot und grün) unterschied- licher Größe, s. Abbildung. Beide Luftblasen sollen jetzt (im Wasser) gleichzeitig nach oben steigen. Dabei steigt die kleine Luftblase schneller als die große nach oben. Unterteile dieses Problem in kleinere Teilprobleme und beschreibe diese ausführlich. Schreibe dann zu diesen Teilproblemen jeweils die entsprechenden MSWLogo- Prozeduren. Autor: H. Sporenberg

249 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo setpos bei Angabe der Koordinaten über konstante Werte mit eckigen Klammern: Beispiel -> setpos[-200 100] Bei Angabe durch Variable mit runden Klammern: Beispiel -> setpos(list :xko :xko) Wenn nur eine Koordinate als Variable angegeben wird, so muss ebenfalls mit runden Klammern geschrieben werden: Beispiel: -> setpos(list 0 :yko) LÖSUNG 1.Aufgabe a): Autor: H. Sporenberg

250 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo to auto Cs setpensize[2 2] setpc 0 pu setpos[-260 20] pd circle 20 pu setpos[-260 20] setfc [0 0 255] fill pu setpos[-140 20] pd circle 20 pu setpos[-140 20] setfc [0 0 255] fill pu setpos[-300 20] pd setpos[-100 20] setpos[-100 55] setpos[-160 55] setpos[-180 85] setpos[-220 85] setpos[-240 55] setpos[-300 55] setpos[-300 20] ht end LÖSUNG 1.Aufgabe b): Autor: H. Sporenberg

251 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo to autoVariable :xko :yko Cs setpensize[2 2] setpc 0 pu setpos(list :xko+40 :yko) pd circle 20 pu setpos(list :xko+40 :yko) setfc [0 0 255] fill pu setpos(list :xko+160 :yko) pd circle 20 pu setpos(list :xko+160 :yko) setfc [0 0 255] fill pu setpos(list :xko :yko) pd setpos(list :xko+200 :yko) setpos(list :xko+200 :yko+35) setpos(list :xko+140 :yko+35) setpos(list :xko+120 :yko+65) setpos(list :xko+80 :yko+65) setpos(list :xko+60 :yko+35) setpos(list :xko :yko+35) setpos(list :xko :yko) ht end Aufruf: autoVariable -300 20 LÖSUNG 1.Aufgabe c): Autor: H. Sporenberg

252 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo Das Holzbrett to Fahrbahn setpensize[3 3] setpc 0 pu setpos[-400 0] pd setpos[400 0] setpos[400 20] setpos[-400 20] setpos[-400 0] pu setpos[-390 10] setfc[100 100 220] fill ht end LÖSUNG KreisSchwarz mit gelber Füllung: to kreisBlack :xko :yko setpc 0 setpensize[3 3] pu setpos(list :xko :yko) pd circle 20 pu setpos(list :xko :yko) setfc[255 255 0]fill ht end Kreis-Weiß mit weißer Füllung: to kreisWhite :xko :yko setpc 7 setpensize[3 3] pu setpos(list :xko :yko) pd circle 20 pu setpos(list :xko :yko) setfc 7 fill ht end 2.Aufgabe: Autor: H. Sporenberg

253 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo to bewegungHorizontal :xko :yko if :xko<-250[kreisBlack :xko :yko stop] kreisBlack :xko :yko kreisWhite :xko :yko bewegunghorizontal :xko-1 :yko end LÖSUNG to mainHorizontal cs Fahrbahn bewegungHorizontal 300 44 end 2.Aufgabe: Autor: H. Sporenberg

254 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo Teilprobleme sind: 1.Zeichnen des Bodens 2.Zeichnen des Balles (schwarz und weiß) 3.Bewegung nach unten LÖSUNG Die Prozeduren für das Zeichnen der Kreise kann aus der Aufgabe 2 ohne Abstriche übernommen werden. to main cs Fahrbahn bewegung 40 300 end to bewegung :xko :yko if :yko<40[kreisBlack :xko :yko stop] kreisBlack :xko :yko kreisWhite :xko :yko bewegung :xko :yko-1 end 3.Aufgabe: Autor: H. Sporenberg

255 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo 4.Aufgabe: LÖSUNG to Luftblase1 :xko :yko pu setpensize[1 1] setpc 0 setpos(list :xko :yko) pd circle 25 pu setpos(list :xko :yko) setfc[250 0 0]fill ht end to main cs Fahrbahn bewegung 40 300 end Die beiden Luftblasen werden mit Hilfe des Befehls circle gezeich- net. Die Programme unterscheiden sich dabei durch die Angabe des Ra- dius und durch die Füllfarbe. Die An- gabe der Teilprobleme kann aus Aufgabe 3 übernommen werden. to Luftblase1White :xko :yko pu setpensize[1 1] setpc 7 setpos(list :xko :yko) pd circle 25 pu setpos(list :xko :yko) setfc 7 fill ht end Autor: H. Sporenberg

256 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo LÖSUNG to Luftblase2 :xko :yko pu setpensize[1 1] setpc 0 setpos(list :xko :yko) pd circle 15 pu setpos(list :xko :yko) setfc[0 255 0]fill ht end Die beiden Luftblasen werden mit Hilfe des Befehls circle gezeichnet. Die Programme unterscheiden sich dabei durch die Angabe des Radius und durch die Füllfarbe. to Luftblase2White :xko :yko pu setpensize[1 1] setpc 7 setpos(list :xko :yko) pd circle 15 pu setpos(list :xko :yko) setfc 7 fill ht end 4.Aufgabe: Autor: H. Sporenberg

257 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo LÖSUNG to main cs Fahrbahn bewegung 40 300 end Die Bewegungsprozedur muss ein wenig geändert werden, da zwei Objekte sich bewegen. Diese sollen sich an zwei verschiedenen Positionen befinden und unterschiedlich schnell aufsteigen. 4.Aufgabe: to bewegung :xko :yko make "yko2 :yko*2 if :yko>150[ Luftblase1 :xko :yko Luftblase2 :xko-100 :yko2+30 stop] Luftblase1 :xko :yko Luftblase1White :xko :yko Luftblase2 :xko-100 :yko2+30 Luftblase2White :xko-100 :yko2+30 bewegung :xko :yko+3 end Autor: H. Sporenberg

258 2.Arbeit Differenzierung 9/2 vom 06.05.09 Einführung in MSWLogo LÖSUNG to main cs Fahrbahn bewegung 40 300 end Das Main-Programm ist dann wieder identisch mit dem aus Aufgabe 2 bzw. Aufgabe 3. 4.Aufgabe: to main cs Boden bewegung 50 60 end Autor: H. Sporenberg

259 2.Arbeit Differenzierung 8/2 vom 05.06.09 Einführung in MSWLogo a) Erläutere den Befehl setpos (1. Angabe der Koordinaten durch Zahlen 2. Angabe der Koordinaten durch Variable) b) Programmiere die nebenstehende Figur. Erstelle dazu eine Skizze des Hauses und beschrifte die Punkte mit den entsprechenden Koordinaten (die linke untere Ecke hat die Koordinaten (-80/0)). Schreibe dazu das entsprechende Programm. Für die Zeichnung muss der Befehl setpos verwendet werden. c) Die linke untere Ecke wird jetzt mit Hilfe zweier Variablen (XKoordinate und YKoordinate) angesprochen. Schreibe dazu das entsprechende Programm HausMitVariable. Der Aufruf sollte dann wie folgt erfolgen: HausMitVariable -80 0 1.Aufgabe: Autor: H. Sporenberg

260 2.Arbeit Differenzierung 8/2 vom 05.06.09 Einführung in MSWLogo LÖSUNG 1.Aufgabe a): setpos bei Angabe der Koordinaten über konstante Werte mit eckigen Klammern: Beispiel -> setpos[-200 100] Bei Angabe durch Variable mit runden Klammern: Beispiel -> setpos(list :xko :yko) Wenn nur eine Koordinate als Variable angegeben wird, so muss ebenfalls mit runden Klammern geschrieben werden: Beispiel: -> setpos(list 0 :yko) Autor: H. Sporenberg

261 2.Arbeit Differenzierung 8/2 vom 05.06.09 Einführung in MSWLogo LÖSUNG 1.Aufgabe c): to HausMitVariable :xko :yko setpensize[3 3] setpc 0 pu setpos(list :xko :yko) pd setpos(list :xko+160 :yko) setpos(list :xko+160 :yko+150) setpos(list :xko :yko+150)setpos(list :xko :yko) pu setpos(list :xko :yko+151)pd setpos(list :xko+160 :yko+151) setpos(list :xko+80 :yko+300)setpos(list :xko :yko+151) pu setpos(list :xko+80 :yko)pd setpos(list :xko+130 :yko)setpos(list :xko+130 :yko+80) setpos(list :xko+80 :yko+80) setpos(list :xko+80 :yko) pu setpos(list :xko+70 :yko+10) setfc[255 0 0]fill setpos(list :xko+80 :yko+160)setfc[0 255 0]fill setpos(list :xko+100 :yko+10)setfc[0 0 255]fill pd ht end Autor: H. Sporenberg

262 Aufgabe – 07.02.2012 Einführung in MSWLogo 1.Aufgabe: a) Konstruiere das in der Abbildung dargestellte Haus mit Hilfe von setpos. b) Färbe jetzt die einzelnen Teile des Hauses ein. Vorschlag: 1.Hauswand: rot 2.Dach: dunkelrot 3.Fenster: helles grau 4.Tür: dunkles grau Autor: H. Sporenberg

263 Aufgabe – 07.02.2012 Einführung in MSWLogo 2.Aufgabe: Unten siehst du einige ungewöhnliche, menschliche Figuren, die aus geometrischen Objekten wie Kreis, Quadrat usw. zusammengebaut sind. Versuche anhand dieser Bilder eine eigene menschliche Figur in MSWLogo zu programmieren. Autor: H. Sporenberg

264 Aufgabe – 07.02.2012 - Lösung Einführung in MSWLogo Die Programmierung erfordert einigen zeitlichen Aufwand, da nicht nur die Koordinaten ermittelt werden müssen. Auch die Einfärbung mit Hilfe des Befehls setfc[r g b]fill muss einige Male durchgeführt werden. Dazu benötigt man wieder die Koordinaten innerhalb der jeweiligen Fläche, um diese mit der angegebenen Farbe einzufärben. pu setpos[0 320] setfc[255 255 0]fill pu setpos[0 120] setpensize[5 5] setpencolor[255 255 0] pd circle 80 setfc[0 0 0]fill to Model cs setpensize[3 3] setpc[0 0 0] pu setpos[150 200] pd setpos[0 400] setpos[-150 200] setpos[150 200] pu setpos[75 300] setpc[150 150 0] setpensize[4 4] pd setpos[-75 300] setpos[0 200] setpos[75 300] pu setpos[0 220] setfc[50 50 50]fill pu setpos[75 100] setpc[10 10 10] pd setpos[0 200] setpos[-75 100] setpos[75 100] pu setpos[0 160] setfc[255 255 255]fill pu setpos[75 100] setpc[100 0 0] pd setpos[-75 100] setpos[0 10] setpos[75 100] Autor: H. Sporenberg

265 Aufgabe – 07.02.2012 - Lösung Einführung in MSWLogo pu setpos[0 340] pd setpensize[2 2] circle 25 setfc[255 255 255]fill pu home pd end pu setpos[77 100] setpc[100 60 10] pd setpos[147 10] setpos[0 10] setpos[77 100] pu setpos[90 20] setfc[0 255 0]fill pu setpos[0 10] setpensize[20 20] pd setpos[70 -120] setpos[90 -120] pu setpos[0 20] setfc[255 255 0]fill pu setpos[0 50] setfc[255 255 0]fill pu setpos[-77 100] setpc[100 0 100] pd setpos[-147 10] setpos[0 10] setpos[-77 100] pu setpos[-90 20] setfc[0 255 0]fill Autor: H. Sporenberg

266 Aufgabe – 07.02.2012 - Lösung Einführung in MSWLogo Autor: H. Sporenberg

267 Aufgaben zum Thema Rekursion – 05.06.2012 Einführung in MSWLogo Autor: H. Sporenberg Steuerung über die Iterationsstufe to Fraktal :stufe :laenge if :stufe<1 [fd :laenge stop] Fraktal :stufe-1 :laenge/3 … die rekursiven Aufrufe ….. end Der Aufruf: Fraktal 2 200 ergibt die Darstellung von 2 Iterationsstufen 1. Wende dieses Verfahren der Steuerung über die Iterationsstufe auf die Koch-Kurve an (1) to main (2) cs setpensize[4 4] (3) rt 90 pu bk 400 pd (6) Fraktal 3 600 (7) end

268 Aufgaben zum Thema Rekursion – 05.06.2012 Einführung in MSWLogo Autor: H. Sporenberg ww Steuerung über die Länge und Animation der fraktalen Kurve (mit einer Farbe) – hier die Kochkurve to Fraktal :laenge if :laenge<10 [fd :laenge (gifsave „Fraktal.gif 0 :append 0) make "append "true stop] Fraktal :laenge/3 … die rekursiven Aufrufe ….. end (1) to main (2) cs setpensize[4 4] (3) rt 90 pu bk 400 pd (4) setactivearea[-450 -300 450 300] (5) make "append "false (6) Fraktal 600 (7) end Der Aufruf: Fraktal 600 ergibt eine Animation bis die laenge kleiner als 10 Pixel ist. Im main-Programm müssen dafür 2 Zeilen eingefügt werden (Zeile 4 und 5) 2. Wende dieses Verfahren der Animation auf die Koch-Kurve an

269 Aufgaben zum Thema Rekursion – 05.06.2012 Einführung in MSWLogo Autor: H. Sporenberg 3. Schreibe ein MSWLogo-Programm (Start durch ein MAIN- Programm), das die folgende kochähnliche Figur erzeugt. Ausgangselement ist wieder eine Strecke, die dieses Mal in 4 gleiche Teile geteilt wird. Die beiden Dreiecke sind gleichseitig. Dargestellt ist der 1. Iterationsschritt. Man erkennt 6 Teilstücke – also auch 6 rekursive Aufrufe.

270 Aufgaben zum Thema Rekursion – 05.06.2012 Einführung in MSWLogo Autor: H. Sporenberg 4. Schreibe ein MSWLogo-Programm (Start durch ein MAIN- Programm), das die sog. Peano-Kurve Figur erzeugt. Die Abbruchbedingung soll über die Iterationsstufe gesteuert werden Ausgangselement ist wieder eine Strecke, die in drei Teile geteilt wird. Der Verlauf der Kurve wird durch die Nummerierung deutlich gemacht. 5. Verändere das Programm, so dass bis zur 3. Iterationsstufe eine Animation über gifsave erzeugt wird.

271 Ein Wald – mit Hilfe der Random-Funktion Einführung in MSWLogo Autor: H. Sporenberg Mit Hilfe eines Baumes, dessen Stammlänge und Krone variabel sind, soll eine Wald erzeugt werden. Als erstes die Prozedur für den Baum. (1) to tree1 :xko1 :yko1 :a (2) seth 0 pu (3) setpos(list :xko1 :yko1) pd (4) setpc [150 055 055] setpensize [10 10] (5) repeat 10 [ fd :a ] (6) lt 85 setpc [100 155 100] setpensize [5 5] (7) repeat 36 [ fd :a rt 10 ] (8) end Erläuterung: Zeile (3): An dieser Stelle beginnt der Stamm des Baumes Zeile (5): Hier wird der Stamm gezeichnet und zwar 10-mal die Länge von a in Pixel (Beispiel: sei a= 10, dann ist der Stamm 100 Pixel lang) Zeile (7): Die Krone des Baumes wird gezeichnet (im Prinzip ein 36-Eck).

272 Ein Wald – mit Hilfe der Random-Funktion Einführung in MSWLogo Autor: H. Sporenberg Der Wald wird mit Hilfe einer Repeat-Schleife erstellt. (1) to trees1 :n (2) repeat :n [make "xko -250+random 500 ~ (3) make "yko -180+random 300 ~ (4) make "hoehe 3+random 4 ~ (5) tree1 :xko :yko :hoehe ] (6) end Erläuterung: Zeile (2): Die Schleife wird n-Mal durchlaufen, der xko-Koordinate wird ein Wert zwischen -250 und 350 zugewiesen. Zeile (3): Der yko-Koordinate wird ein Wert zwischen -180 und 120 zugewiesen. Zeile (4): Der Höhe wird ein Wert zwischen 3 und 7 zugewiesen. Zeile (5): tree1 wird mit diesen Werten aufgerufen. to main cs trees1 10 end Und hier das Hauptprogramm

273 Ein Wald – mit Hilfe der Random-Funktion Einführung in MSWLogo Autor: H. Sporenberg Der Wald wird mit Hilfe einer Repeat-Schleife erstellt. Und so könnte der Wald aussehen

274 Dreiecke – mit der Random-Funktion rekursiv Einführung in MSWLogo Autor: H. Sporenberg Auf der Zeichenfläche sollen unterschiedlich große Dreiecke mit unterschiedlicher Färbung zufällig angeordnet werden. to DreieckRegen :stufe if :stufe<1[stop] setpensize[3 3] dreieck 130+random 100 setpensize[1 1] pu rt 30 fd 5 make "wert1 random 255 make "wert2 random 255 make "wert3 random 255 make "wert4 random 12 setfc(list :wert1 :wert2 :wert3) make "xwert -300+random 500 make "ywert -300+random 500 pu setpos(list :xwert :ywert) pd wait 30 DreieckRegen :stufe-1 end to Dreieck :laenge rt 40 repeat 3[fd :laenge rt 120] end to main cs setpensize[2 2] DreieckRegen 20 end Im Hauptprogramm wird die Datei DreieckRegen. Die Konstante 20 gibt an, wie viele Dreiecke gezeichnet werden sollen.

275 Dreiecke – mit der Random-Funktion rekursiv Einführung in MSWLogo Autor: H. Sporenberg Auf der Zeichenfläche sollen unterschiedlich große Dreiecke mit unterschiedlicher Färbung zufällig angeordnet werden. to DreieckRegen :stufe if :stufe<1[stop] setpensize[3 3] dreieck 130+random 100 setpensize[1 1] pu rt 30 fd 5 make "wert1 random 255 make "wert2 random 255 make "wert3 random 255 setfc(list :wert1 :wert2 :wert3) make "xwert -300+random 500 make "ywert -300+random 500 pu setpos(list :xwert :ywert) pd wait 30 DreieckRegen :stufe-1 ;;rekursiver Aufruf end to Dreieck :laenge rt 40 repeat 3[fd :laenge rt 120] end to main cs setpensize[2 2] DreieckRegen 20 end Das Programm Dreieck zeichnet ein Dreieck mit der Länge laenge.

276 Dreiecke – mit der Random-Funktion rekursiv Einführung in MSWLogo Autor: H. Sporenberg Auf der Zeichenfläche sollen unterschiedlich große Dreiecke mit unterschiedlicher Färbung zufällig angeordnet werden. to DreieckRegen :stufe if :stufe<1[stop] setpensize[3 3] dreieck 130+random 100 ;; ein Dreieck mit der Länge 130+Zufallszahl zwischen 0 und 100 setpensize[1 1] ;; Stiftdicke wird festgelegt pu rt 30 fd 5 ;; die Richtung wird verändert make "wert1 random 255 ;; hier werden die Werte für die Farbe für das Innere make "wert2 random 255 ;; des Dreiecks festgelegt make "wert3 random 255 setfc(list :wert1 :wert2 :wert3) ;; das Innere des Dreiecks wird eingefärbt make "xwert -300+random 500 ;; der nächste x-Wert für den nächsten Punkt des Dreiecks make "ywert -300+random 500 ;; der nächste y-Wert für den nächsten Punkt des Dreiecks pu setpos(list :xwert :ywert) pd ;; mit Hilfe von setpos wird an den nächsten Punkt wait 30 ;; des nächsten Dreiecks DreieckRegen :stufe-1 ;;rekursiver Aufruf end

277 Dreiecke – mit der Random-Funktion rekursiv Einführung in MSWLogo Autor: H. Sporenberg Beispiel

278 Einführung in MSWLogo Autor: H. Sporenberg to fillpoly :sides :size :color poly :sides :size setfloodcolor :color fill end to gesicht :size local "dxEye local "dyEye local "dyMouth local "dzMouth local "ptCenter make "dxEye :size/5 make "dyEye :size/8 make "dyMouth :size/3 make "dzMouth :size/8 make "ptCenter pos setpensize [5 5] head :size tri :size move -:dxEye :dyEye rt 180 tri :size move -2*:dxEye 0 tri :size pu setpos :ptCenter fd :dyMouth rt 180 mouth :size pu setpos :ptCenter end Ein Smiley

279 Einführung in MSWLogo Autor: H. Sporenberg to head :size fillpoly 50 :size [255 255 0] end to mouth :size local "dzMouth local "ptSave make "dzMouth :size/8 make "ptSave pos pd lt 45 fd :dzMouth lt 90 fd :dzMouth rt 90 fd :dzMouth rt 45 pu setpos :ptSave pd rt 45 fd :dzMouth rt 90 fd :dzMouth lt 90 fd :dzMouth lt 45 pu setpos :ptSave end to move :dx :dy pu fd :dy rt 90 fd :dx lt 90 end to poly :sides :size local "step make "step 3.14*:size/:sides pu bk :size/2 lt 90 bk :step/2 pd repeat :sides [fd :step rt 360/:sides] pu fd :step/2 rt 90 fd :size/2 end to smiley cs gesicht 400 ht end to tri :size fillpoly 3 :size/6 [0 0 0] end

280 Ein Smiley Einführung in MSWLogo Autor: H. Sporenberg

281 Einfache Parkettierung Einführung in MSWLogo Autor: H. Sporenberg to main cs setpensize[3 3] repeat 4[ParkettVV pu lt 90 fd 200 pd] end to Parkett fd 50 lt 45 fd 71 lt 135 fd 50 rt 45 fd 71 rt 135 end to ParkettVV repeat 4[Parkett lt 90] end

282 Was noch eingefügt werden soll Einführung in MSWLogo Autor: H. Sporenberg „F:\Sporenberg\PowerPoint_Einfuehrungen\MSWLogo\NochEinzufuegen\MSWLo go3DBefehle\Help Contents - Graphics - Absolute Turtle Motion - setPitch.mht „F:\Sporenberg\Info\NetLogo\Modelle_27_09_2007\NetLogo User Community Models ARS-Genetics.mht

283 Bundestagswahl Einführung in MSWLogo Autor: H. Sporenberg to bundestagswahl setpensize[6 6] setpc[100 100 100] ;;Erste Säule pu setpos[-200 0] pd setpos[-140 0] setpos[-140 120] setpos[-200 120] setpos[-200 0] pu setpos[-180 10]pd setfc[255 0 0]fill ;;Zweite Säule pu setpos[-120 0]pd setpos[-60 0] setpos[-60 180] setpos[-120 180] setpos[-120 0] pu setpos[-100 10] setfc[0 0 255]fill 12.12.2012 ;; Beschriftung Parteiname SPD setlabelfont[[Verdana]30 0 0 400 0 0 0 0 3 2 1 18] pu setpos[-192 -20] setpc[50 50 50] setheading 90 pd label "SPD ;; Beschriftung Parteiname CDU pu setpos[-112 -20] setpc[50 50 50] setheading 90 pd label "CDU

284 Bundestagswahl Einführung in MSWLogo Autor: H. Sporenberg ;;Beschriftung Prozentzahlen SPD setlabelfont[[Arial]25 0 0 400 0 0 0 0 3 2 1 18] pu setpos[-192 160] setpc[50 50 50] setheading 90 pd label "23% ;;Beschriftung Prozentzahlen CDU pu setpos[-112 220] setpc[50 50 50] setheading 90 pd label "34% 12.12.2012 ;;Balken setpensize[2 2] pu setpos[-220 -10]pd setpos[200 -10] setpos[200 -18] setpos[-220 -18] setpos[-220 -10] end to main cs bundestagswahl end

285 Bundestagswahl Einführung in MSWLogo Autor: H. Sporenberg 12.12.2012

286 Häuser mit Hilfe von setpos Einführung in MSWLogo Autor: H. Sporenberg to Haus setpensize[6 6] setpc[100 100 100] pu setpos[-160 -80] pd setpos[-40 -80] setpos[-40 120] setpos[-100 200] setpos[-160 120] setpos[-160 -80] ;; Tür setpensize[3 3] pu setpos[-120 -80]pd setpos[-120 0] setpos[-80 0] setpos[-80 -80] 12.12.2012 ;;Farbe der Tür grün pu setpos[-100 -40] setfc[0 255 0]fill ;; Farbe des Hauses: ein helleres Rot pu setpos[-100 20] setfc[255 50 50]fill ;; das rechte Haus pu setpc[0 0 0] setpos[-20 -80] pd setpos[220 -80] setpos[220 60] setpos[100 140] setpos[-20 60] setpos[-20 -80] ;; linkes Fenster im rechten Haus pu setpos[20 40]pd setpos[80 40] setpos[80 -20] setpos[20 -20] setpos[20 40]

287 Häuser mit Hilfe von setpos Einführung in MSWLogo Autor: H. Sporenberg ;; rechtes Fenster im rechten Haus pu setpos[120 40]pd setpos[180 40] setpos[180 -20] setpos[120 -20] setpos[120 40] ;; sehr helles Rot des rechten Hauses pu setpos[100 20]pd setfc[255 150 150]fill end 12.12.2012 to main cs Haus end

288 Schriftausgabe Einführung in MSWLogo Autor: H. Sporenberg Mit Hilfe von label können Texte und Inhalte von Variablen auf dem Graphikbildschirm ausgegeben werden. Beispiel: label „ASGSG Achtung: Es wird immer in Richtung der Turtle geschrieben. Da die Turtle in der Grundstellung (home) nach oben zeigt und man den Text normalerweise in der Waagerechten haben möchte, muss die Turtle vor der Ausgabe mit label um 90 Grad nach rechts gedreht werden. Wenn nicht klar ist, in welche Richtung die Turtle zeigt, kann die Turtle ohne left oder right zu benutzen immer in die richtige Richtung gesetzt werden. Dieses geschieht mit setheading. Dabei gelten folgende Richtungen (angelehnt an die Windrose): sethaeding 0: Norden setheading 90: Osten setheading 180: Süden setheading 270: Westen setheading 360: Norden 12.12.2012 Achtung: Die Zeichenkette, die ausgegeben werden soll, darf keine Leerzeichen enthalten. Es geht nicht: label „ASGSG Marl

289 Figurinen - Kandinsky Einführung in MSWLogo Autor: H. Sporenberg 09.01.2013

290 Figurinen - Kandinsky Einführung in MSWLogo Autor: H. Sporenberg 12.12.2012

291 Variablen-Verwaltung Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 Um ein Quadrat mit einer bestimmten Seitenlänge zu zeichnen, muss im forward-Befehl die Anzahl der Pixel verändert werden. Soll das Quadrat eine Seitenlänge von 100 Pixel haben, so lautet der Befehl: repeat 4[fd 100 lt 90] Ist jetzt aber ein Quadrat mit der Seitenlänge 200 Pixel gewünscht, so muss im Programm-Code der Befehl in fd 200 verändert werden. Noch schwieriger wird es, wenn zu Beginn nicht bekannt ist, welche Länge der Benutzer des Programms haben möchte. Die Länge soll also von jedem Benutzer variabel eingegeben werden können.

292 Variablen-Verwaltung Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 1. Die erste wenig flexible Möglichkeit ist, beim Aufruf des Programms die Länge des Quadrats zu übergeben. Dazu schreiben wir das Main-Programm (=Hauptprogramm) und das Programm, das das Quadrat zeichnen soll. to main cs quadrat 100 end to quadrat :laenge repeat 4[fd :laenge lt 90] end

293 Variablen-Verwaltung Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 2. Eine Variable kann mit einem Wert belegt werden. Dies geschieht mit dem Befehl make. make „laenge 100 Hinweis: Die Variable laenge wird mit dem Wert 100 belegt. to main cs quadrat end to quadrat make „laenge 100 repeat 4[fd :laenge lt 90] end

294 Variablen-Verwaltung Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 3. Die Möglichkeit für den Benutzer, selbstständig den Wert einzugeben. Mit Hilfe des Befehls make „laenge first questionbox[Benutzer Eingabe][Geben Sie die Länge ein] wird ein Eingabefeld erzeugt und der eingegebene Wert in der Variablen laenge gespeichert to main cs quadrat end to quadrat make „laenge first questionbox[Benutzer Eingabe][Geben Sie die Länge ein] repeat 4[fd :laenge lt 90] end

295 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 1.Aufgabe: a)Schreibe ein Programm, das ein Quadrat mit der Seitenlänge 100 zeichnet. Dabei soll links gedreht werden. Der Befehl WIEDERHOLE darf hier nicht verwendet werden. b)Verändere das Programm aus a) so, dass der Befehl REPEAT verwendet wird. c)Schreibe ein Programm, das ein gleichseitiges Dreieck mit der Seitenlänge 100 zeichnet. Dabei soll links gedreht werden. (Mit REPEAT) d)Schreibe ein Programm, das ein regelmäßiges Fünfeck mit der Seitenlänge 100 zeichnet. Fertige eine Skizze an und überlege dir, wie groß der Winkel sein muss. Dabei soll links gedreht werden. (Mit REPEAT) 2. Arbeit DiffKurs 8 Informatik - Sporenberg Schuljahr 2012/13 Marl, 19.12.2012

296 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 2.Aufgabe: Programmiere die nebenstehende Figur. Ergänze die Koordinaten der nicht beschrifteten Punkte auf dem Aufgabenblatt (die linke untere Ecke hat die Koordinaten (-350/20)). Schreibe dazu das entsprechende Programm. Für die Zeichnung muss der Befehl setpos verwendet werden.

297 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 3.Aufgabe: Für die Darstellung von Gewinn/Verlust bei der Bundestagswahl 2009 werden Säulen entsprechend der Prozentzahl und Zunahme/Abnahme mit einer Beschriftung der Parteien und der entsprechenden Prozentzahl gebildet. Schreibe dazu das entsprechende MSWLogo-Programm. Übertrage die Graphik in das vorgefertigte Koordinatensystem. Die Säulen sind 100 Pixel breit, der Abstand der Säulen beträgt 40 Pixel, 1% entsprechen 10 Pixel.

298 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 4.Aufgabe: a) Schreibe ein Programm mit Hilfe von setpos, das die Deutsche Flagge wie in der Abbildung dargestellt, erzeugt. Die Flagge soll dabei 400 Pixel breit und jeder Streifen 60 Pixel breit sein. b) Schreibe ein Programm mit Hilfe von setpos, das die Schweizer Flagge wie in der Abbildung dargestellt, erzeugt. Die Flagge soll dabei 440 Pixel breit, die anderen Angaben entnehme man der Abbildung. Übertrag die Schweizer Flagge in das Koordinatenkreuz und beschrifte jeweils die Eckpunkt, indem du die x- und y-Koordinate angibst.

299 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 5.Aufgabe: Übertrage den Weihnachtsbaum in das Koordinatenkreuz und beschrifte jeweils die Eckpunkt, indem du die x- und y-Koordinaten angibst. Schreibe dann ein MSWLogo- Programm, das den Weihnachtsbaum darstellt.

300 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 ;;Einfügen eines Kommentars ~ (sog. Tilde)Verkettung zweier Zeilen print print "Hallo / erscheint im Commandfeld cleartextlöscht den Textschirm clearscreen, csLöscht den Graphikbildschirm

301 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013

302 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 to … endBeginn … Ende einer Prozedur make speichert einen Wert, make "laenge 100 stopbeendet die aktuelle Prozedur

303 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013

304 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 1.Aufgabe: a)to quadrat cs fd 100 lt 90 end b) to quadrat cs repeat 4[fd 100 lt 90] end c) to dreieck cs repeat 3[fd 100 lt 120] end d) to fuenfeck cs repeat 5[fd 100 lt 72] end Lösung

305 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 2.Aufgabe: to auto cs setpensize[4 4] setpc 0 pu setpos[-200 20] pd circle 50 pu setpos[-200 20] setfc [0 0 255] fill pu setpos[200 20] pd circle 50 pu setpos[200 20] setfc [0 0 255] fill pu setpos[-350 20] pd setpos[350 20] setpos[350 120] setpos[200 120] setpos[100 220] setpos[-100 220] setpos[-200 120] setpos[-350 120] setpos[-350 20] ht end

306 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 3.Aufgabe: to GewinnVerlust pu setpos[-200 10] pd setpos[-200 -10] setpos[200 -10] setpos[200 10] setpos[-200 10] pu setpos[ 0 0] setfc[50 50 50]fill setpos[-200 -20] pd setpos[-100 -20] setpos[-100 -112] setpos[-200 -112] setpos[-200 -20] pu setpos[-150 -30] setfc[255 0 0]fill pu setpos[-60 20] pd setpos[40 20] setpos[40 83] setpos[-60 83] setpos[-60 20] pu setpos[0 40] setfc[0 0 255]fill ;; Parteinamen pu setpos[-170 35] rt 90 label "SPD pu setpos[-30 -30] label "CDU ;; Prozentzahlen pu setpos[-170 -135] label "-9,2% pu setpos[-35 120] label "+6,3% hideturtle end to main cs GewinnVerlust end

307 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013

308 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 4.Aufgabe: a) Deutschlandflagge to FlaggeDeutsch pu setpos[-160 120] pd setpos[-160 -120] setpos[160 -120] setpos[160 120] setpos[-160 120] pu setpos[-160 40] pd setpos[160 40] pu setpos[-160 -40] pd setpos[160 - 40] pu setpos[-100 100] setfc[0 0 0]fill setpos[-100 0] setfc[255 0 0]fill setpos[-100 -100] setfc[255 255 0]fill hideturtle end b) Schweizer Flagge to FlaggeSchweiz pu setpos[-220 -220] pd setpos[220 -220] setpos[220 220] setpos[-220 220] setpos[-220 -220] pu setpos[-60 -140] pd setpos[60 -140] setpos[60 -60] setpos[140 -60] setpos[140 60] setpos[60 60] setpos[60 140] setpos[-60 140] setpos[-60 60] setpos[-140 60] setpos[-140 -60] setpos[-60 -60] setpos[-60 -140] pu setpos[-100 -100] setfc[255 0 0]fill hideturtle end

309 2.Arbeit - MSWLogo Einführung in MSWLogo Autor: H. Sporenberg 16.01.2013 5.Aufgabe: Weihnachtsbaum to Weihnachtsbaum pu setpos[0 260] pd setpos[-80 200] setpos[-20 200] setpos[-140 140] setpos[-60 140] setpos[-200 60] setpos[-20 60] setpos[-20 0] setpos[20 0] setpos[20 60] setpos[200 60] setpos[60 140] setpos[140 140] setpos[20 200] setpos[80 200] setpos[0 260] pu setpos[0 100] setfc[0 255 0]fill setpos[0 280] pd circle 20 setfc[255 0 0]fill end

310 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to main cs ladeBild make "keypress 12 Setpensize[0 0] make "start timemilli windowcreate "main "stopwatch "time 300 20 80 50 [] staticcreate "stopwatch "currenttime [Vergangene Zeit] 5 5 50 20 fahren 1 end Das komplette Programm mit Uhr Mit Uhr Autor: H. Sporenberg

311 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to fahren :speed setfocus [MSWLogo Screen] keyboardon [make "keypress keyboardvalue steuerung :keypress keyboardoff] if :keypress=113 [finish stop] wait 2 pd fd :speed kornweg localmake "currenttime timemilli-:start staticupdate "currenttime sentence [Vergangene Zeit] :currenttime fahren :speed end Das komplette Programm mit Uhr Mit Uhr Autor: H. Sporenberg

312 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to korn_weg if pixel= [255 255 0] [setfc[255 255 255]fill make "anzahl :anzahl-1 print :anzahl] if :anzahl<1 [finish] ;;setfc[160 51 51]fill ; Farbiger Hintergrund end Das komplette Programm mit Uhr to steuerung :richtung if :richtung=44 [lt 10 stop] if :richtung=46 [rt 10 stop] if :richtung=97 [make "speed :speed+1] if :richtung=115 [make "speed :speed-1] end Mit Uhr Autor: H. Sporenberg

313 Projekt: Aufnahme von Getreidekörner Einführung in MSWLogo to finish staticdelete "currenttime windowdelete "stopwatch localmake "laptime timemilli-:start/1000 throw "toplevel end Das komplette Programm mit Uhr Mit Uhr Autor: H. Sporenberg

314 Animation eines Kreises Einführung in MSWLogo Ein Kreis soll sich von links nach rechts bewegen. Dazu wird als erstes der Kreis in der gewünschten Farbe (hier: gelb) gezeichnet. Dieser Kreis bleibt jetzt einige Millisekunden sichtbar. Anschließend wird an derselben Stelle ein Kreis mit der Hintergrundfarbe (hier: weiß) gezeichnet. Damit verschwindet der farbige Kreis. Dann wird die x-Koordinate erhöht (Bewegung nach rechts bedeutet ja, dass die x-Koordinate größer wird) und der Kreis wird wieder in der gewünschten Farbe gezeichnet usw. So entsteht die Illusion der Bewegung eines Kreises. Ein gelber Kreis bewegt sich von links nach rechts Autor: H. Sporenberg UR 06.02.2013

315 Animation eines Kreises Einführung in MSWLogo to KreisAnimation setactivearea [-450 -150 450 150] make "xko -400 make "yko 0 hideturtle repeat 100 ~ [kreisGelb :xko :yko wait 5 kreisWeiss :xko :yko make "xko :xko+5 ] kreisGelb :xko :yko end Ein gelber Kreis bewegt sich von links nach rechts Autor: H. Sporenberg to kreisGelb :xko :yko pu setpos(list :xko :yko) pd setpc[255 255 0] circle 20 setfc[255 255 0]fill end to kreisWeiss :xko :yko pu setpos(list :xko :yko) pd setpc[255 255 255] circle 20 setfc[255 255 255]fill end to main cs KreisAnimation end UR 06.02.2013

316 Gif-Animation Einführung in MSWLogo to KreisGifAnimation setactivearea [-450 -150 450 150] make "xko -400 make "yko 0 make “append “False hideturtle repeat 100 ~ [kreisGelb :xko :yko (gifsave “KreisAnimation.gif 0 :append 0) kreisWeiss :xko :yko make “append “True make "xko :xko+5 ] kreisGelb :xko :yko end Ein gelber Kreis bewegt sich von links nach rechts Autor: H. Sporenberg Jetzt soll diese Animation als Gif-Datei gespeichert werden. Diese kann dann im Internet-Browser aufgerufen und ausgeführt werden. Eingefügt werden müssen die fett markierten Zeilen. Die Prozeduren KreisGelb und KreisWeiss können unverändert übernommen werden. to main cs KreisGifAnimation end UR 06.02.2013

317 Bewegung eines Schriftzuges Einführung in MSWLogo to main cs make "xko -400 make "yko 100 hideturtle pu setpos(list :xko :yko) rt 90 setlabelfont[[Verdana]180 0 0 400 0 0 0 0 3 2 1 18] repeat 100 [pu setpos(list :xko :yko) pd setpc[0 0 0] rt 90 label "ASGSG wait 5 cs make "xko :xko+5 ] Autor: H. Sporenberg UR 06.02.2013 rt 90 setpc[0 0 0] label "ASGSG end

318 Gif-Animation eines Schriftzuges Einführung in MSWLogo to main cs make "xko -400 make "yko 100 hideturtle pu setpos(list :xko :yko) rt 90 setlabelfont[[Verdana]180 0 0 400 0 0 0 0 3 2 1 18] repeat 100 [pu setpos(list :xko :yko) pd setpc[0 0 0] rt 90 label "ASGSG wait 5 cs make "xko :xko+5 ] Autor: H. Sporenberg UR 06.02.2013 rt 90 setpc[0 0 0] label "ASGSG end

319 Bewegung eines Autos Einführung in MSWLogo to autoVariable :xko :yko cs setpensize[2 2] setpc 0 pu setpos(list :xko+40 :yko) pd circle 20 pu setpos(list :xko+40 :yko) setfc [0 0 255] fill pu setpos(list :xko+160 :yko) pd circle 20 pu setpos(list :xko+160 :yko) setfc [0 0 255] fill pu setpos(list :xko :yko) pd setpos(list :xko+200 :yko) setpos(list :xko+200 :yko+35) setpos(list :xko+140 :yko+35) setpos(list :xko+120 :yko+65) setpos(list :xko+80 :yko+65) setpos(list :xko+60 :yko+35) setpos(list :xko :yko+35) setpos(list :xko :yko) ht end Aufruf: autoVariable -300 20 Autor: H. Sporenberg UR 06.02.2013 Mit diesem Programmteil wird das nebenstehende Auto erzeugt

320 Bewegung eines Autos Einführung in MSWLogo to autoVariableWeiss :xko :yko cs setpensize[2 2] setpc[255 255 255] pu setpos(list :xko+40 :yko) pd circle 20 pu setpos(list :xko+40 :yko) setfc [255 255 255] fill pu setpos(list :xko+160 :yko) pd circle 20 pu setpos(list :xko+160 :yko) setfc [255 255 255] fill pu setpos(list :xko :yko) pd setpos(list :xko+200 :yko) setpos(list :xko+200 :yko+35) setpos(list :xko+140 :yko+35) setpos(list :xko+120 :yko+65) setpos(list :xko+80 :yko+65) setpos(list :xko+60 :yko+35) setpos(list :xko :yko+35) setpos(list :xko :yko) ht end Autor: H. Sporenberg UR 06.02.2013 Mit diesem Programmteil wird ein weißes Auto gezeichnet

321 Bewegung eines Autos Einführung in MSWLogo to main cs make "xko -400 make "yko 100 hideturtle repeat 100 ~ [autovariable :xko :yko wait 5 autovariableWeiss :xko :yko make "xko :xko+5 ] autovariable :xko :yko end Autor: H. Sporenberg UR 06.02.2013 Hier ist das main-Programm, das die Bewegung durch Aufruf von autoVariable und autoVariableweiss die Animation erzeugt.

322 Memory bzw- Kartenlegespiel Einführung in MSWLogo to DiaSchau windowcreate "main "Window1 "Steuerfenster 10 10 120 150 [] buttoncreate "Window1 "bt1 [Bild1] 10 20 50 15 [cs pu setpos[-200 -200] pd bitload "RollingStones1.bmp] buttoncreate "Window1 "bt2 [Bild2] 10 40 50 15 [cs pu setpos[-200 -200] pd bitload "RollingStones2.bmp] buttoncreate "Window1 "bt3 [Bild3] 10 60 50 15 [cs pu setpos[-200 -200] pd bitload "RollingStones3.bmp] buttoncreate "Window1 "bt4 [Bild4] 10 80 50 15 [cs pu setpos[-200 -200] pd bitload "RollingStones4.bmp] buttoncreate "Window1 "bt5 [Ende] 10 100 50 15 [fensterzu] end Autor: H. Sporenberg UR 20.03.2013 Über ein Button gesteuertes Menue werden ausgewählte Bilder angezeigt. to fensterzu windowdelete "Window1 end to main cs DiaSchau end

323 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 20.03.2013 Über ein Button gesteuertes Menue werden ausgewählte Bilder angezeigt.

324 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 20.03.2013 Eine verbesserte Version:

325 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 20.03.2013 Eine verbesserte Version: Es gibt nur noch zwei bzw. drei Schaltflächen. 1.Button: Die Bilder werden nach vorn geblättert 2.Button. Die Bilder werden nach rückwärts geblättert. 3.Button: Der Reset-Button setzt auf den Anfang

326 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 20.03.2013 to DiaSchau windowcreate "main "Window1 "Steuerfenster 10 10 100 150 [] buttoncreate "Window1 "bt1 [Next] 10 20 50 15 [cs pu setpos[-400 -100] pd make "Nr :Nr+1 LadeBild :Nr] buttoncreate "Window1 "bt2 [Back] 10 40 50 15 [cs pu setpos[-400 -100] pd make "Nr :Nr-1 LadeBild :Nr] buttoncreate "Window1 "bt3 [Reset] 10 60 50 15 [cs pu setpos[-400 -100]pd make "Nr 1 LadeBild :Nr] buttoncreate "Window1 "bt5 [Ende] 10 80 50 15 [fensterzu] end to fensterzu windowdelete "Window1 end to main cs make "Nr 1 cs pu setpos[-400 -100] pd bitload "RollingStones1.bmp DiaSchau end

327 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 20.03.2013 to LadeBild :Nummer If :Nummer<1 [bitload "RollingStones1.bmp] If :Nummer=1 [bitload "RollingStones1.bmp] If :Nummer=2 [bitload "RollingStones2.bmp] If :Nummer=3 [bitload "RollingStones3.bmp] If :Nummer=4 [bitload "RollingStones4.bmp] If :Nummer>4 [bitload "RollingStones4.bmp] end to fensterzu windowdelete "Window1 end to main cs DiaSchau end

328 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 20.03.2013 Die Spielstrategie: Zu Beginn sind alle Karten umgedreht. Mit Hilfe des Mauszeigers werden dann zwei umgedrehte Karten angeklickt und dadurch das Bild der jeweiligen Karte angezeigt. Stellen die umgedrehten Karten dasselbe Bild dar, werden die nächsten beiden Karten aufgedeckt usw. Sind hingegen die umgedrehten Karten nicht gleich, werden die beiden Karten wieder umgedreht und es werden zwei neue Karten angeklickt. Wenn nicht mit zwei Personen gespielt wird, könnte die Zeit gemessen werden, die benötigt wird, um alle Pärchen aufzudecken. Das Spiel für zwei Personen wäre dann eine andere Variante. Der erste Schritt: Von 16 Karten wird das Rückbild angezeigt. Dazu benötigt man die Koordinaten des linken unteren Eckpunkts. Dann wird mit Hilfe des Befehls bitload das entsprechende Bild platziert. Die Bilder müssen alle dieselbe Größe haben (100 Pixel x 100 Pixel).

329 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 20.03.2013 to bilder_umgedreht cs pu setpos[-400 100] pd bitload "memory00.bmp pu setpos[-290 100] pd bitload "memory00.bmp pu setpos[-180 100] pd bitload "memory00.bmp pu setpos[-70 100] pd bitload "memory00.bmp pu setpos[-400 -10] pd bitload "memory00.bmp pu setpos[-290 -10] pd bitload "memory00.bmp pu setpos[-180 -10] pd bitload "memory00.bmp pu setpos[-70 -10] pd bitload "memory00.bmp pu setpos[-400 -120] pd bitload "memory00.bmp pu setpos[-290 -120] pd bitload "memory00.bmp pu setpos[-180 -120] pd bitload "memory00.bmp pu setpos[-70 -120] pd bitload "memory00.bmp pu setpos[-400 -230] pd bitload "memory00.bmp pu setpos[-290 -230] pd bitload "memory00.bmp pu setpos[-180 -230] pd bitload "memory00.bmp pu setpos[-70 -230] pd bitload "memory00.bmp end

330 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 20.03.2013 2. Als nächstes muss das Umdrehen der Bilder beim Mausklick programmiert werden. In MWSLogo wird mit Hilfe des Befehls mouseon die Kontrolle der Mausbewegung eingeschaltet. Die Syntax lautet: MOUSEON leftbuttondown leftbuttonup rightbuttondown rightbuttonup move for [i 1 4 1][mouseon[mouse_down][][][][]]

331 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 20.03.2013 Werden zwei Bilder angeklickt, muss überprüft werden können, ob die Bilder gleich oder unterschiedlich sind. Einfach wäre es, wenn man die Dateinamen der Bilder für den Vergleich heranziehen könnte. Dazu eignet sich eine Liste, in der alle Namen der Bilder angeordnet sind (jeweils zwei Bilder haben ja den gleichen Namen, nur der Platz in der Reihenfolge ist unterschiedlich). make "BilderListe {memory01.bmp memory02.bmp memory03.bmp memory04.bmp memory05.bmp memory06.bmp memory07.bmp ~ memory08.bmp memory01.bmp memory02.bmp memory03.bmp memory04.bmp memory05.bmp memory06.bmp ~ memory07.bmp memory08.bmp } Mit Hilfe des Befehls item kann gezielt auf ein bestimmtes Element der Liste zugegriffen werden: make „Bild item 4 :BilderListe print :Bild Ergibt: memory04.bmp

332 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 15.05.2013 Mit Hilfe der linken Maustaste soll jetzt das umgedrehte Bild angeklickt werden. An dieser Stelle erscheint dann das verdeckte Bild. In Vorbereitung auf die endgültige Version wird der Aufruf zum Anklicken in einer For-Schleife realisiert. Die Struktur einer FOR-Schleife For [i 1 10 1][wait 30 print :i*:i] In der ersten Klammer wird der Variablenname (hier i) angegeben. Es folgt der erste (hier 1) und der letzte Wert (hier 10), den die Variable annimmt. Dann wird die Schrittweite angegeben (hier 1). Ist diese 1, kann dies auch entfallen. Mit der obigen Schleife werden die ersten zehn Quadratzahlen in der Command-Zeile ausgegeben.

333 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 15.05.2013 for [i 1 2 1][mouseon[mouse_down][][][][] ] Hier wird die Prozedur mouse_down aufgerufen, wenn die linke Maustaste gedrückt wird. to mouse_down pu make "nr 0 setpos mousepos pd localmake "x first mousepos localmake "y last mousepos if (and :x>-400 :x 100) [make "nr 1] if (and :x>-290 :x 100) [make "nr 2] if (and :x>-180 :x 100) [make "nr 3] if (and :x>-70 :x 100) [make "nr 4]

334 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 15.05.2013 if (and :x>-400 :x -10) [make "nr 5] if (and :x>-290 :x -10) [make "nr 6] if (and :x>-180 :x -10) [make "nr 7] if (and :x>-70 :x -10) [make "nr 8] if (and :x>-400 :x -120) [make "nr 9] if (and :x>-290 :x -120) [make "nr 10] if (and :x>-180 :x -120) [make "nr 11] if (and :x>-70 :x -120) [make "nr 12] if (and :x>-400 :x -230) [make "nr 13] if (and :x>-290 :x -230) [make "nr 14] if (and :x>-180 :x -230) [make "nr 15] if (and :x>-70 :x -230) [make "nr 16] zeige_bild :nr end Fortsetzung von mouse_down

335 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 15.05.2013 to zeige_bild :nr make "Bild item :nr :BilderListe if :nr=1 [pu setpos[-400 100] pd bitload :bild] if :nr=2 [pu setpos[-290 100] pd bitload :bild] if :nr=3 [pu setpos[-180 100] pd bitload :bild] if :nr=4 [pu setpos[-70 100] pd bitload :bild] if :nr=5[pu setpos[-400 -10] pd bitload :bild] if :nr=6[pu setpos[-290 -10] pd bitload :bild] if :nr=7[pu setpos[-180 -10] pd bitload :bild] if :nr=8[pu setpos[-70 -10] pd bitload :bild] Mit dem Befehl item wird der Name des Bildes aufgrund der Nummer aus der BilderListe in die Variable Bild geholt. Dann wird in Abhängigkeit von der Bildernummer (Variable nr) das ent- sprechende Bild mit Hilfe von bitload an die ange- klickte Stelle gezeigt.

336 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 15.05.2013 if :nr=9[pu setpos[-400 -120] pd bitload :bild] if :nr=10[pu setpos[-290 -120] pd bitload :bild] if :nr=11[pu setpos[-180 -120] pd bitload :bild] if :nr=12[pu setpos[-70 -120] pd bitload :bild] if :nr=13[pu setpos[-400 -230] pd bitload :bild] if :nr=14[pu setpos[-290 -230] pd bitload :bild] if :nr=15[pu setpos[-180 -230] pd bitload :bild] if :nr=16[pu setpos[-70 -230] pd bitload :bild] end Fortsetzung von zeige_bild

337 Maus-Bewegungen Einführung in MSWLogo Autor: H. Sporenberg UR 23.04.2013 Wenn ein verdecktes Bild angeklickt wird, muss dieses Bild mit dem entsprechen- den Gegenstand erscheinen. Als Information dazu dient die Position der Maus. Sobald die linke Maustaste gedrückt wird, wird das Bild umgedreht. MSWLogo stellt einen Befehl zur Verfügung, der die Mausposition ermittelt und die x- und y-Werte speichert. MOUSEON hat 5 Eingaben, jede stellt einen Mauszustand dar. MOUSEON[leftbuttondown][leftbutonup][rightbuttondown][rightbuttonup][movemouse] MOUSEOFF schaltet die Mauskontrolle ab.

338 Maus-Bewegungen Einführung in MSWLogo Autor: H. Sporenberg UR 23.04.2013 Beispiele to beispiel1 MOUSEON[fd 10][][rt 30][][] end In diesem Beispiel bewegt die Turtle sich 10 Pixel nach vorn, wenn die linke Maustaste gedrückt wird, und dreht sich um 10 Grad nach rechts, wenn die rechte Maustaste gedrückt wird to beispiel2 MOUSEON[show mousepos][][][][] end In diesem Beispiel werden die Koordinaten der Maus in der Kommandozeile angezeigt

339 Maus-Bewegungen Einführung in MSWLogo Autor: H. Sporenberg UR 23.04.2013 Beispiele to beispiel3 MOUSEON[setpos mousepos][][][][] end In diesem Beispiel bewegt sich die Turtle zu der Position an der sich die Maus befindet, wenn man die linke Maustaste drückt to beispiel4 MOUSEON[][][][][setpos mousepos] end In diesem Beispiel wird eine durchgehende Linie gezeichnet, wenn die Maus bewegt wird.

340 Maus-Bewegungen Einführung in MSWLogo Autor: H. Sporenberg UR 23.04.2013 Beispiele to beispiel5 MOUSEON[pd][pu][][][setpos mousepos] end In diesem Beispiel wird eine Linie gezeichnet, wenn die linke Maustaste gedrückt wird. Wenn diese losgelassen wird, wird der Pen angehoben to beispiel6 Setpc [255 0 0] Cs pu MOUSEON[pd][pu][][][setpos mousepos] end In diesem Beispiel wird eine durchgehende Linie gezeichnet.

341 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 22.05.2013 (1) to main (2) cs penup hideturtle (3) make "Punkte 0 (4) make "zaehler 1 (5) make "merker1 0 (6) make "merker2 0 (6) Bilder_umgedreht ;; Hiermit werden die Rückseiten angezeigt (7) make "BilderListe {memory01.bmp memory02.bmp memory03.bmp memory04.bmp (8) memory05.bmp memory06.bmp memory07.bmp memory08.bmp memory01.bmp (9) memory02.bmp memory03.bmp memory04.bmp memory05.bmp memory06.bmp (10) memory07.bmp memory08.bmp } (11) windowcreate "main "w1 "Memory: 100 100 200 100[] (12) staticcreate "w1 "st1 "- 10 20 180 15 (13) buttoncreate "w1 "bt1 "Ende 10 40 180 15 [mouseoff windowdelete "w1 cs ] (14) mouseon[mouse_down][][][][] (15) repeat 16[loesche_bild repcount] (16) end Das Main-Programm

342 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 22.05.2013 to mouse_down make "nr 0 Pu setpos mousepos pd localmake "x first mousepos localmake "y last mousepos if (and :x>-400 :x 100) [make "nr 1] if (and :x>-290 :x 100) [make "nr 2] if (and :x>-180 :x 100) [make "nr 3] if (and :x>-70 :x 100) [make "nr 4] if (and :x>-400 :x -10) [make "nr 5] if (and :x>-290 :x -10) [make "nr 6] if (and :x>-180 :x -10) [make "nr 7] if (and :x>-70 :x -10) [make "nr 8] if (and :x>-400 :x -120) [make "nr 9] if (and :x>-290 :x -120) [make "nr 10] if (and :x>-180 :x -120) [make "nr 11] if (and :x>-70 :x -120) [make "nr 12] if (and :x>-400 :x -230) [make "nr 13] if (and :x>-290 :x -230) [make "nr 14] if (and :x>-180 :x -230) [make "nr 15] if (and :x>-70 :x -230) [make "nr 16] ifelse :zaehler>1[zeige_Bild :nr Auswertung][Nochmal] end Das mouse_down-Programm Mit Hilfe dieser Prozedur wird abgefragt, welche Rückseite angeklickt wurde. An die Prozedur zeige_Bild wird dann die Nummer des Bildes übergeben und dieses dann angezeigt.

343 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 22.05.2013 (1) to Auswertung (2) make "merker2 :nr (3) make "zaehler 1 (4) localmake "Treffer equalp item :merker1 :BilderListe item :merker2 :BilderListe (5) if :treffer[make "Punkte :Punkte+1] (6) staticupdate "st1 (sentence "Treffer= :treffer "...Punkte= :Punkte) (7) settimer 1 2000[loesche_Bild :merker1 loesche_Bild :merker2 (8) staticupdate "st1 (sentence "Punkte= :Punkte)cleartimer 1] (9) end Das Auswertung-Programm In Zeile (4) wird abgefragt, ob die beiden Bilder gleich sind (dies geschieht über den Namen des Bildes). Der Wert wird in treffer als Boolesche Variable gespeichert. In der Abfrage in Zeile (5) wird die Anzahl der Punkte erhöht, wenn treffer den Wert true hat.

344 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 22.05.2013 to Nochmal make "merker1 :nr zeige_Bild :nr make "zaehler :zaehler+1 end Das Nochmal-Programm und Loesche_Bild-Programm to Loesche_Bild :nr make "Bild "memory00.bmp if :nr=1 [pu setpos[-400 100] pd bitload :bild] if :nr=2 [pu setpos[-290 100] pd bitload :bild] if :nr=3 [pu setpos[-180 100] pd bitload :bild] if :nr=4 [pu setpos[-70 100] pd bitload :bild] if :nr=5[pu setpos[-400 -10] pd bitload :bild] if :nr=6[pu setpos[-290 -10] pd bitload :bild] if :nr=7[pu setpos[-180 -10] pd bitload :bild] if :nr=8[pu setpos[-70 -10] pd bitload :bild] if :nr=9[pu setpos[-400 -120] pd bitload :bild] if :nr=10[pu setpos[-290 -120] pd bitload :bild] if :nr=11[pu setpos[-180 -120] pd bitload :bild] if :nr=12[pu setpos[-70 -120] pd bitload :bild] if :nr=13[pu setpos[-400 -230] pd bitload :bild] if :nr=14[pu setpos[-290 -230] pd bitload :bild] if :nr=15[pu setpos[-180 -230] pd bitload :bild] if :nr=16[pu setpos[-70 -230] pd bitload :bild] end

345 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 22.05.2013 to Auswertung make "merker2 :nr make "zaehler 1 localmake "Treffer equalp item :merker1 :BilderListe item :merker2 :BilderListe if :treffer[make "Punkte :Punkte+1] staticupdate "st1 (sentence "Treffer= :treffer "...Punkte= :Punkte) settimer 1 2000[loesche_Bild :merker1 loesche_Bild :merker2 staticupdate "st1 (sentence "Punkte= :Punkte)cleartimer 1] end to bilder_umgedreht cs pu setpos[-400 100] pd bitload "memory00.bmp pu setpos[-290 100] pd bitload "memory00.bmp pu setpos[-180 100] pd bitload "memory00.bmp pu setpos[-70 100] pd bitload "memory00.bmp pu setpos[-400 -10] pd bitload "memory00.bmp pu setpos[-290 -10] pd bitload "memory00.bmp pu setpos[-180 -10] pd bitload "memory00.bmp pu setpos[-70 -10] pd bitload "memory00.bmp pu setpos[-400 -120] pd bitload "memory00.bmp pu setpos[-290 -120] pd bitload "memory00.bmp pu setpos[-180 -120] pd bitload "memory00.bmp pu setpos[-70 -120] pd bitload "memory00.bmp pu setpos[-400 -230] pd bitload "memory00.bmp pu setpos[-290 -230] pd bitload "memory00.bmp pu setpos[-180 -230] pd bitload "memory00.bmp pu setpos[-70 -230] pd bitload "memory00.bmp end Das komplette Programm

346 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 22.05.2013 to Loesche_Bild :nr make "Bild "memory00.bmp if :nr=1 [pu setpos[-400 100] pd bitload :bild] if :nr=2 [pu setpos[-290 100] pd bitload :bild] if :nr=3 [pu setpos[-180 100] pd bitload :bild] if :nr=4 [pu setpos[-70 100] pd bitload :bild] if :nr=5[pu setpos[-400 -10] pd bitload :bild] if :nr=6[pu setpos[-290 -10] pd bitload :bild] if :nr=7[pu setpos[-180 -10] pd bitload :bild] if :nr=8[pu setpos[-70 -10] pd bitload :bild] if :nr=9[pu setpos[-400 -120] pd bitload :bild] if :nr=10[pu setpos[-290 -120] pd bitload :bild] if :nr=11[pu setpos[-180 -120] pd bitload :bild] if :nr=12[pu setpos[-70 -120] pd bitload :bild] if :nr=13[pu setpos[-400 -230] pd bitload :bild] if :nr=14[pu setpos[-290 -230] pd bitload :bild] if :nr=15[pu setpos[-180 -230] pd bitload :bild] if :nr=16[pu setpos[-70 -230] pd bitload :bild] end to main cs penup hideturtle Make "Punkte 0 make "zaehler 1 Make "merker1 0 Make "merker2 0 Bilder_umgedreht make "BilderListe {memory01.bmp memory02.bmp memory03.bmp memory04.bmp memory05.bmp memory06.bmp memory07.bmp memory08.bmp memory01.bmp memory02.bmp memory03.bmp memory04.bmp memory05.bmp memory06.bmp ~ memory07.bmp memory08.bmp } windowcreate "main "w1 "Memory: 100 100 200 100[] staticcreate "w1 "st1 "- 10 20 180 15 buttoncreate "w1 "bt1 "Ende 10 40 180 15 [mouseoff windowdelete "w1 cs ] mouseon[mouse_down][][][][] repeat 16[loesche_bild repcount] end Das komplette Programm

347 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 22.05.2013 to mouse_down make "nr 0 pu setpos mousepos pd localmake "x first mousepos localmake "y last mousepos if (and :x>-400 :x 100) [make "nr 1] if (and :x>-290 :x 100) [make "nr 2] if (and :x>-180 :x 100) [make "nr 3] if (and :x>-70 :x 100) [make "nr 4] if (and :x>-400 :x -10) [make "nr 5] if (and :x>-290 :x -10) [make "nr 6] if (and :x>-180 :x -10) [make "nr 7] if (and :x>-70 :x -10) [make "nr 8] if (and :x>-400 :x -120) [make "nr 9] if (and :x>-290 :x -120) [make "nr 10] if (and :x>-180 :x -120) [make "nr 11] if (and :x>-70 :x -120) [make "nr 12] if (and :x>-400 :x -230) [make "nr 13] if (and :x>-290 :x -230) [make "nr 14] if (and :x>-180 :x -230) [make "nr 15] if (and :x>-70 :x -230) [make "nr 16] ifelse :zaehler>1[zeige_Bild :nr Auswertung][Nochmal] end to Nochmal make "merker1 :nr zeige_Bild :nr make "zaehler :zaehler+1 end Das komplette Programm

348 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 22.05.2013 to zeige_bild :nr make "Bild item :nr :BilderListe if :nr=1 [pu setpos[-400 100] pd bitload :bild] if :nr=2 [pu setpos[-290 100] pd bitload :bild] if :nr=3 [pu setpos[-180 100] pd bitload :bild] if :nr=4 [pu setpos[-70 100] pd bitload :bild] if :nr=5[pu setpos[-400 -10] pd bitload :bild] if :nr=6[pu setpos[-290 -10] pd bitload :bild] if :nr=7[pu setpos[-180 -10] pd bitload :bild] if :nr=8[pu setpos[-70 -10] pd bitload :bild] if :nr=9[pu setpos[-400 -120] pd bitload :bild] if :nr=10[pu setpos[-290 -120] pd bitload :bild] if :nr=11[pu setpos[-180 -120] pd bitload :bild] if :nr=12[pu setpos[-70 -120] pd bitload :bild] if :nr=13[pu setpos[-400 -230] pd bitload :bild] if :nr=14[pu setpos[-290 -230] pd bitload :bild] if :nr=15[pu setpos[-180 -230] pd bitload :bild] if :nr=16[pu setpos[-70 -230] pd bitload :bild] end Das komplette Programm

349 Memory bzw- Kartenlegespiel Einführung in MSWLogo Autor: H. Sporenberg UR 22.05.2013 Das komplette Programm Die Grafik Es handelt sich um 16 umgedeckte Karten. Beim Mausklick werden diese umgedreht. Wurden zwei gleiche Bilder umgedreht, wird im Fenster folgendes angezeigt: Treffer = true und die Anzahl der Punkte wird um 1 erhöht.

350 Ausgabe des ASCII-Codes Einführung in MSWLogo Autor: H. Sporenberg Manchmal wünscht man sich, den ASCII-Code einzelner Zeichen zu kennen. Bevor man wieder einmal im Netz nachsieht, hilft dieses kleine Programm. Der ASCII-Code

351 Ausgabe des ASCII-Codes Einführung in MSWLogo Autor: H. Sporenberg to asctable cs ht setsc 7 setpc 1 headers setpensize[2 2]lines setpc 4 seth 90 pu chars End to chars setlabelfont[[Arial] -18 0 0 400 0 0 0 0 3 2 1 42] for[y 126 -130 -20][ setxy -233 :y repeat 20[ label char 125+repcount-:y setx xcor+24 if (125-:y+repcount)=255[stop]]] end to headers setlabelfont[[Verdana] -15 0 0 400 0 0 0 0 3 2 1 57] sph -240 150 90 pu for[n 0 19 ][label form :n 2 0 setx xcor+24] sph -273 126 90 pu for[n 0 240 20][label form :n 3 0 sety ycor-20 ] end to lines sph -273 130 90 fd 505 ; top line sph -240 148 180 fd 276 ; left line end to sph :x :y :head ; sets position and heading pu setxy :x :y pd ; library procedure seth :head end

352 Achtung Einführung in MSWLogo Autor: H. Sporenberg Normalerweise gilt in der Mathematik im Zahlenraum der rellen Zahlen das Kommutativgesetz sowohl für die Addition als auch für die Multiplikation. In MSWLogo ist das offensichtlich nicht immer der Fall, so z.B. bei der Programmierung der Kardioide. Für dessen Parametergleichung gilt: x(t)= radius * cos(t) * ( 1 + cos (t)) y(t)= radius * sin(t) * ( 1 + cos (t)) Berechnet man in dieser Reihenfolge die Werte für x(t) und y(t) so erhält man für: radius = 100 und t = 0 für: x(t) den Wert 100. Richtig müsste es aber 200 sein. Stellt man die Berechnung jedoch um, so ergeben sich die richtigen Werte. Also: x(t)= ( 1 + cos (t))* radius * cos(t) y(t)= ( 1 + cos (t))* radius * sin(t)

353 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg to main cs setpensize[3 3] setpc [255 51 0] make "phi 1 penup make "radius 100 make "xk1 (1+cos(:phi))* :radius*cos(:phi) make "yk1 (1+cos(:phi))*:radius*sin(:phi) setpos(list :xk1 :yk1) pendown Kardioide :xk1 :yk1 100 end to Kardioide :xko :yko :radius if :phi>360[stop] setpos(list :xko :yko) make "phi :phi+1 make "xko (1+cos(:phi))* :radius*cos(:phi) make "yko (1+cos(:phi))*:radius*sin(:phi) Kardioide :xko :yko :radius end Die Kardioide

354 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Das Cartesische Blatt ist die Lösung der Gleichung x 3 + y 3 – 3 a x y = 0 mit a>0. Formt man diese implizite Gleichung in die Parameterform um, so erhält man: Das Cartesische Blatt

355 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg to main cs setpensize[7 7] setpc [50 50 50] pu setpos[-400 0] pd setpos [400 0] pu setpos[0 -300] pd setpos [0 300] setpensize[4 4] setpc [255 153 0] make "t -30.1 pu make "radius 100 make "xk1 3*:radius*:t/(1+:t*:t*:t) make "yk1 3*:radius*:t*:t/(1+:t*:t*:t) setpos(list :xk1 :yk1) pd Cartesi1 :xk1 :yk1 100 end Das Cartesische Blatt - einzeln to Cartesi1 :xko :yko :radius if :t>31[stop] wait 1 setpos(list :xko :yko) make "t :t+0.12 make "xko 3*:radius*:t/(1+:t*:t*:t) make "yko 3*:radius*:t*:t/(1+:t*:t*:t) Cartesi1 :xko :yko :radius end

356 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg to main cs setpensize[5 5] setpc [50 50 50] pu setpos[-400 0] pd setpos [400 0] pu setpos[0 -300] pd setpos [0 300] setpensize[3 3] setpc [255 153 0] make "t -30.1 pu make "radius 100 make "xk1 3*:radius*:t/(1+:t*:t*:t) make "yk1 3*:radius*:t*:t/(1+:t*:t*:t) setpos(list :xk1 :yk1) pendown Cartesi1 :xk1 :yk1 100 Das Cartesische Blatt - mehrere make "t -20.1 pu make "radius 150 make "xk1 3*:radius*:t/(1+:t*:t*:t) make "yk1 3*:radius*:t*:t/(1+:t*:t*:t) setpc [0 204 51] setpos(list :xk1 :yk1) pendown Cartesi1 :xk1 :yk1 150 make "t -20.1 pu make "radius 200 make "xk1 3*:radius*:t/(1+:t*:t*:t) make "yk1 3*:radius*:t*:t/(1+:t*:t*:t) setpc [0 102 255] setpos(list :xk1 :yk1) pendown Cartesi1 :xk1 :yk1 200 end Hier werden jetzt drei verschiedene Cartesische Blätter mit den Werten 100, 150 und 200 für a in ein gemeinsames Koordinatenkreuz gezeichnet.

357 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg to Cartesi1 :xko :yko :radius if :t>31[stop] wait 1 setpos(list :xko :yko) make "t :t+0.12 make "xko 3*:radius*:t/(1+:t*:t*:t) make "yko 3*:radius*:t*:t/(1+:t*:t*:t) Cartesi1 :xko :yko :radius end Das Cartesische Blatt - mehrere

358 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Das Cartesische Blatt - mehrere

359 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die Zykloide ist der geometrische Ort, der von einem Punkt eines Kreises vom Radius a beschrieben wird, wenn dieser ohne zu gleiten auf einer Geraden rollt. Die Zykloide Die Parameterdarstellung lautet: x(t) = radius * (t – sin t) y(t) = radius * (1 –cos t) mit 0  t  2 

360 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg to main cs setpensize[7 7] setpc [50 50 50] pu setpos[-450 0] pd setpos [450 0] pu setpos[0 -300] pd setpos [0 300] setpensize[4 4] setpc [255 153 0] make "bogen 0 pu make "radius 35 make "xk1 :radius*(:bogen - sin(:bogen*360/(2*pi))) make "yk1 :radius*(1 - cos(:bogen*360/(2*pi))) setpos(list :xk1 :yk1) pendown Zykloide :xk1 :yk1 35 end Die Zykloide to Zykloide :xko :yko :radius if :bogen>2*6.28[stop] wait 1 setpos(list :xko :yko) make "bogen :bogen+0.1 make "xko :radius*(:bogen - sin(:bogen*360/(2*pi))) make "yko :radius*(1 - cos(:bogen*360/(2*pi))) Zykloide :xko :yko :radius end

361 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die Zykloide

362 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die allgemeine Form der Zykloide Die Parameterdarstellung der allgemeinen Form einer Zykloide lautet: x(t) = radius * (a*t – b*sin t) y(t) = radius * (a*1 – b*cos t) mit 0  t  2  Diese allgemeine Zykloide ist der geometrische Ort, der von einem Punkt eines Kreises vom Radius b beschrieben wird, wenn ein zweiter konzentrischer, mit diesem ersten starr verbundenen Kreis vom Radius a, ohne zu gleiten, auf einer Geraden rollt. Dabei gibt es drei mögliche Beziehungen zwischen a und b: 1.a=b=1: Das ist die normale Zykloide 2.b>a: Diese Zykloide nennt man verschlungene Zykloide. 3.b<a: Diese Zykloide nennt man verkürzte Zykloide

363 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die allgemeine Form der Zykloide to ZykloideVerschl :xko :yko :radius if :bogen>2*6.28[stop] wait 1 setpos(list :xko :yko) make "bogen :bogen+0.1 make "xko :radius*(1*:bogen - 3*sin(:bogen*360/(2*pi))) make "yko :radius*(1 - 3*cos(:bogen*360/(2*pi))) ZykloideVerschl :xko :yko :radius end 2.verschlungene Zykloide -> b>a

364 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die allgemeine Form der Zykloide to main cs setpensize[7 7] setpc [50 50 50] pu setpos[-450 0] pd setpos [450 0] ;; x-Achse pu setpos[0 -300] pd setpos [0 300] ;; y-Achse setpensize[4 4] setpc [255 153 0] make "bogen 0 pu make "radius 20 make "xk1 :radius*(1*:bogen - 3*sin(:bogen*360/(2*pi))) make "yk1 :radius*(1 - 3*cos(:bogen*360/(2*pi))) setpos(list :xk1 :yk1) pendown ZykloideVerschl :xk1 :yk1 20 end 2.verschlungene Zykloide -> b>a

365 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die allgemeine Form der Zykloide to ZykloideVerk :xko :yko :radius if :bogen>2*6.28[stop] wait 1 setpos(list :xko :yko) make "bogen :bogen+0.1 make "xko :radius*(2*:bogen – 1*sin(:bogen*360/(2*pi))) make "yko :radius*(2 – 1*cos(:bogen*360/(2*pi))) ZykloideVerk :xko :yko :radius end 3.verkürzte Zykloide -> b<a

366 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die allgemeine Form der Zykloide to main cs setpensize[7 7] setpc [50 50 50] pu setpos[-450 0] pd setpos [450 0] pu setpos[0 -300] pd setpos [0 300] setpensize[4 4] setpc [255 153 0] make "bogen 0 pu make "radius 20 make "xk1 :radius*(2*:bogen - sin(:bogen*360/(2*pi))) make "yk1 :radius*(2 - cos(:bogen*360/(2*pi))) setpos(list :xk1 :yk1) pendown ZykloideVerk :xk1 :yk1 20 end 3.verkürzte Zykloide -> b<a

367 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Alle Zykloide in einer Graphik

368 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Der Asteroid Ein Asteroid ist der geometrische Ort eines Punktes, der an der Peripherie eines Kreises mit dem Radius r = R/4, welcher auf der inneren LInie eines Kreises mit dem Radius R entlang rollt x(t) = R * cos 3 t y(t) = R * sin 3 t mit 0  t  2 

369 Achtung Einführung in MSWLogo Autor: H. Sporenberg Offensichtlich kann MSWLogo Terme mit trígonometrischen Funktionen nicht richtig berechnen. Die Berechnung der x- und y-Koordinate sollte wie folgt erfolgen: make "xko 100*cos(:t*360/(2*pi))*cos(:t*360/(2*pi))*cos(:t*360/(2*pi)) make "yko 100*sin(:t*360/(2*pi))*sin(:t*360/(2*pi))*sin(:t*360/(2*pi)) Dabei durchläuft t die Werte von 0 bis 2 Pi. Die Angabe des Parameters bei sin und cos erfolgt in Winkelgeraden, darum die Umrechnung. Die berechneten Werte sind jedoch falsch. Änderung: Das Argument von sin und cos wird vorher berechnet und in einer Variablen abgespeichert. make "t :t+0.11 make "bogen1 cos(:t*360/(2*pi)) make "bogen2 sin(:t*360/(2*pi)) make "xko :bogen1*:bogen1*:bogen1*:radius make "yko :bogen2*:bogen2*:bogen2*:radius

370 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Der Asteroid to Asteroid :xko :yko :radius if :t>2*3.14[stop] setpos(list :xko :yko) make "t :t+0.11 make "bogen1 cos(:t*360/(2*pi)) make "bogen2 sin(:t*360/(2*pi)) make "xko :bogen1*:bogen1*:bogen1*:radius make "yko :bogen2*:bogen2*:bogen2*:radius Asteroid :xko :yko :radius end o main cs setactivearea[-500 -400 500 400] setpensize[5 5] setpc [50 50 50] pu setpos[-400 0] pd setpos [400 0] pu setpos[0 -300] pd setpos [0 300] setpensize[4 4] setpc [255 50 0] make "t 0 pu make "radius 250 make "bogen1 cos(:t*360/(2*pi)) make "bogen2 sin(:t*360/(2*pi)) make "xk1 :bogen1*:bogen1*:bogen1*:radius make "yk1 :bogen2*:bogen2*:bogen2*:radius setpos(list :xk1 :yk1) pendown Asteroid :xk1 :yk1 250 end

371 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Der Asteroid

372 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die Lemniskate von Bernoulli Die Parametergleichung der Lemniskate lautet: Jede Kurve mit dieser Parametergleichung wird Bernoullische Lemniskate genannt: Ähnlich einer Ellipse hat die Lemniskate Brennpunkte F1 und F2, aber die Lemniskate ist der geometrische Ort S aller Punkte P, für die das Produkt (und nicht die Summe wie bei der Ellipse) der Abstände F1 und F2 konstant ist.

373 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die Lemniskate von Bernoulli to Lemniskate :xko :yko if :t>2*3.28[stop] setpos(list :xko :yko) make "t :t+0.051 make "bogen1 cos(:t*360/(2*pi)) make "bogen2 sin(:t*360/(2*pi)) make "xko :bogen1/(1+:bogen2*:bogen2) make "yko :bogen1*:bogen2/(1+:bogen2*:bogen2) Lemniskate :xko*400 :yko*400 end Achtung: Wegen der Probleme mit der Berechnung von trigonome- trischen Funktionen müssen die Funktionen aufgespalten werden, z.B. Speicherung der einzelnen Sum- manden und anschließende Addition der Variablen zur endgültigen Formel

374 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die Lemniskate von Bernoulli to main cs setpensize[5 5] setpc [50 50 50] pu setpos[-400 0] pd setpos [400 0] pu setpos[0 -300] pd setpos [0 300] setpensize[4 4] setpc [255 50 0] make "t 0 pu make "bogen1 cos(:t*360/(2*pi)) make "bogen2 sin(:t*360/(2*pi)) make "xk1 :bogen1/(1+:bogen2*:bogen2) make "yk1 :bogen1*:bogen2/(1+:bogen2*:bogen2) setpos(list :xk1*400 :yk1*400) pendown Lemniskate :xk1*400 :yk1*400 end

375 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die Lemniskate von Bernoulli

376 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Das Kleeblatt Die Parametergleichung des Kleeblatts lautet: to Kleeblatt :xko :yko if :t>2*3.14[stop] setpos(list :xko :yko) make "t :t+0.11 make "bogen1 (:t*360/(2*pi)) make "bogen2 (2*:t*360/(2*pi)) make "bogenx1 cos(:bogen1) make "bogenx2 cos(:bogen2) make "bogeny1 sin(:bogen1) make "bogeny2 sin(:bogen2) make "xko :bogenx1+:bogenx2 make "yko :bogeny1-:bogeny2 Kleeblatt :xko*200 :yko*200 end Achtung: Wegen der Probleme mit der Berechnung von trigonome- trischen Funktionen müssen die Funktionen aufgespalten werden, z.B. Speicherung der einzelnen Sum- manden und anschließende Addition der Variablen zur endgültigen Formel

377 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Das Kleeblatt to main cs setactivearea[-500 -400 500 400] setpensize[5 5] setpc [50 50 50] pu setpos[-400 0] pd setpos [400 0] pu setpos[0 -300] pd setpos [0 300] setpensize[4 4] setpc [255 50 0] make "t 0 pu make "bogen1 (:t*360/(2*pi)) make "bogen2 (2*:t*360/(2*pi)) make "bogenx1 cos(:bogen1) make "bogenx2 cos(:bogen2) make "bogeny1 sin(:bogen1) make "bogeny2 sin(:bogen2) make "xk1 :bogenx1+:bogenx2 make "yk1 :bogeny1-:bogeny2 setpos(list :xk1*200 :yk1*200) pendown Kleeblatt :xk1*200 :yk1*200 end

378 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Das Kleeblatt

379 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die Deltoide Die Parametergleichung der Deltoide lautet: to Deltoide :xko :yko :konstante if :t>2*3.14[stop] setpos(list :xko :yko) make "t :t+0.11 make "bogen1 cos(:t*360/(2*pi)) make "bogen2 sin(:t*360/(2*pi)) make "xko 2*:konstante*:bogen1*(1+:bogen1)-:konstante make "yko 2*:konstante*:bogen2*(1-:bogen1) wait 2 Deltoide :xko :yko :konstante end Die Kurve trägt ihren Namen wegen der Ähnlichkeit mit dem großen griechischen Buchstaben Delta.

380 Parameterdarstellung von Funktionen Einführung in MSWLogo Autor: H. Sporenberg Die Deltoide to main Cs setactivearea[-500 -400 500 400] setpensize[5 5] setpc [50 50 50] pu setpos[-400 0] pd setpos [400 0] pu setpos[0 -300] pd setpos [0 300] setpensize[4 4] setpc [255 50 0] make "t 0 pu make "konstante 100 make "bogen1 cos(:t*360/(2*pi)) make "bogen2 sin(:t*360/(2*pi)) make "xk1 2*:konstante*:bogen1*(1+:bogen1)-:konstante make "yk1 2*:konstante*:bogen2*(1-:bogen1) setpos(list :xk1 :yk1) pendown Deltoide :xk1 :yk1 :konstante end


Herunterladen ppt "Einführung in MSWLogo Autor: H. Sporenberg. Nach dem Start erscheinen zwei Felder 1. Graphik- Ausgabefenster 2. Das Commander – Feld (Befehlsfeld) Um."

Ähnliche Präsentationen


Google-Anzeigen