Jython

Mehrere Turtles verwenden


In einem Turtlefenster können mehrere Turtleobjekte erzeugt werden. Bei der bisher verwendeten Turtle handelt es sich um ein anonymes Objekt, für welches man keinen Namen braucht. Wenn man mehrere Turtles gleichzeitig verwenden will, musst man jeder Turtle einen eigenen Namen geben.

joe = Turtle() erzeugt Turtle joe in einem neuen Fenster.

Damit ale Turtles im gleichen Fenster erscheinen, erzeugt man zuerst mit tf = TurtleFrame() ein leeres Turtlefenster und dann mit
joe = Turtle(tf) Turtle joe im Turtleframe tf, analog kann mit
luka = Turtle(tf) eine zweite Turtle luka im gleichen TurtleFrame erzeugt werden.

Damit joe einen bestimmten Befehl ausführt, muss der Name joe und ein Punkt vorangestellt werden. Man nennt dies einen Methodenaufruf.

Beispiel 1: Zwei Turtles joe und luka zeichnen Quadrate. Während die eine Turtle ein Quadrat zeichnet, muss die andere warten.


# Tu9.py

from gturtle import *

def square(t):
    for i in range(4):
        t.forward(40)
        t.right(90)
    t.forward(40)    

tf = TurtleFrame()
joe = Turtle(tf)
luka = Turtle(tf)
luka.setColor("red")
luka.setPenColor("green")
joe.setPos(-100, -100)
luka.setPos(50,-100)

for i in range(5):
    square(joe)
    square(luka)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Erklärungen zum Programmcode:

luka ist ein Objekt der Klasse Turtle und kennt damit alle Turtle-Methoden. Mit luka.setColor("red") wird die Methode setColor() für luka aufgerufen.
Mit def square(t) wird die Funktion square() für eine beliebige Turtle t definiert
square(joe) Aufruf der Funktion square für Turtle joe
square(luka) Aufruf der Funktion square für Turtle luka

 

Beispiel 2: Drei Turtles zeichnen farbige Sterne. Während die eine Turtle ein Segment zeichnet, stehen die anderen still (gleichzeitiges Zeichnen wird im Kapitel Threads erklärt).

# Tu9a.py

from gturtle import *

def segment(t):
    t.forward(140)
    t.right(160)

tf = TurtleFrame()
joe = Turtle(tf)
luka = Turtle(tf)
sara = Turtle(tf)
luka.setColor("red")
sara.setColor("green")
luka.setPenColor("red")
sara.setPenColor("green")
joe.setPos(-135, -50)
luka.setPos(-10,-50)
sara.setPos(115,-50)

for i in range(9):
    segment(joe)
    segment(luka)
    segment(sara)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Beispiel 3: Man kan für jede Turtle ein eigenes Bild verwenden. Der Pfad der Bilddatei wird beim Erzeugen der Turtle angegeben. Hier verwendet man die beiden Bilddateien beetle.gif und cuteturtle.gif, die sich in der TigerJython-Distribution befinden. Alle Bilder, die im Order "sprites" zur Verfügund stehen, sehen Sie in der TigerJython-IDE unter Hilfe-APLU Dokumentation-Bildbibliothek, oder in diesem Lehrgang unter dem Menüpunkt Dokumentation-Spritesbiblothek.

Sie können auch eigene Bilder verwenden. Ihr Bild muss im gif- oder png- Format sein und einen transparenten Hintergrund haben. Sie können im beliebigen Ordner auf Ihrem Computer gespeichert sein. Im Programm geben Sie den Pfad der Bilddatei an:
Unter Windows z.B.
makeTurtle("c:/users/UrsMeier/desktop/bilder/bild.gif")
oder makeTurtle("d:/bilder/bild.gif")

Unter MacOS z.B.
makeTurtle("/Users/UrsMeier/Desktop/Bilder/bild.gif")

 

Unter Windows können Sie die eigenen Bilder auch ein Unterverzeichnis sprites des Unterverzeichnises /bin des Installationsverzeichnisses speichern. Der Aufruf lautet dann:
makeTurtle("sprites/bild.gif")  

# Tu9b.py

from gturtle import *

def draw(t):
    t.forward(100)
    t.dot(20)
    t.back(100)
    t.right(45)
    
tf = TurtleFrame()
laura = Turtle(tf, "sprites/beetle.gif")
laura.setPenColor("red")
laura.setPos(-140, 0)
luka = Turtle(tf, "sprites/cuteturtle.gif")
luka.setPos(140, 0)

for i in range (8):
    draw(laura)
    draw(luka)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

Anmerkung:

Auch wenn man nur eine Turtle verwendet, kann bei makeTurtle() eine Datei angegeben werden, welche als Turtlebild verwendet werden soll:

makeTurtle("sprites/beetle.gif")
  

 

Beispiel 4: Vier Turtles sind zu Beginn in den Ecken eines Quadrates positioniert. Bei jedem Schritt verfolgt jede Turtle die im Uhrzeigersinn benachbarte Turtle und zeichnet dabei eine Spur. Bevor sie erneut die Verfolgung aufnimmt, bewegt sie sich um eine kurze Strecke vorwärts. Damit das Zeichnen schneller erfolgt, wird speed auf -1 gesetzt.

from gturtle import *

def drawLine(a, b):
    ax = a.getX()
    ay = a.getY()
    a.moveTo(b.getX(), b.getY())
    a.setPos(ax, ay)
    
tf = TurtleFrame()
t1 = Turtle(tf)
t2 = Turtle(tf)
t3 = Turtle(tf)
t4 = Turtle(tf)
t1.setPos(-110, -110)
t2.setPos(-110, 110)
t3.setPos(110, 110)
t4.setPos(110, -110)
t1.speed(-1)
t2.speed(-1)
t3.speed(-1)
t4.speed(-1)    

for i in range(44): 
    drawLine(t1, t2)
    drawLine(t2, t3)
    drawLine(t3, t4)
    drawLine(t4, t1)
    t1.forward(5)
    t2.forward(5)
    t3.forward(5)
    t4.forward(5)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Erklärungen zum Programmcode:

drawLine(a, b) zeichnet eine Linie von der aktuellen Position der Turtle a zur aktuellen Position der Turtle b

 


Aufgaben Serie 9

 

1)

Zwei Turtles zeichnen abwechslungsweise Treppenstufen.

 

 

2)

Eine grüne, rote und blaue Turtle zeichnen miteinander die nebenstehenden Figuren

Die Figuren sind aus einem Zick-Zack-Muster aufgebaut

 

 

 

3)

Zwei Turtles zeichnen abwechslungsweise Quadrate. Die erste Turtle mit einer blauen, die zweite Turtle mit einer roten Farbe.

 

4)

Die Quadrate können mit fill(), fillToPoint() oder mit fillToHorizontal() ausgefüllt werden.

   

5)


Die Turtle laura zeichnet (nicht gefüllte) Quadrate. Nach jedem gezeichneten Quadrat springt die zweite Turtle luka hinein und färbt es grün.

Verwende für die beiden Turtles verschiedene Turtlebilder. Im tigerjython.jar stehen die Bilder beetle.gif, beetle1.gif, beetle2.gif und spider.png zur Verfügung. Du kannst aber euch eigene Bilder verwenden. Du musst diese im Unterverzeichnis sprites des Verzeichnisses, in dem sich dein Programm befindet, speichern.