Seite 1 von 1

Turtle Fuktionen

Verfasst: Dienstag 13. Februar 2007, 18:41
von guter_hund
Einen Wunder schönen Nachmittag alle zusammen.
Habe mich seit kurzem entschlossen mich mit dem Turtle-Modul aus einander zu setzen(eigentlich muss ich :wink: ).

Leider komme ich nicht so recht voran. Folgende Befehle und deren Bedeutung sind mir bereits bekannt/geläufig:

Code: Alles auswählen

width()
forward()
back()
left()
right()
up()
down()
Soweit so gut, aber wie kann man z.B. ein Rechteck 'zeichnen' ohne vier mal forward() und drei mal right() zu schreiben?
Auch das Zeichnen eines Dreiecks und anderer Formen währe sehr interessant.

Hoffe das mir jemand helfen kann (gern auch per Def, etc.)


Danke im Voraus.

Gruß.

Edit (Leonidas): Highlighting eingeschaltet.

Verfasst: Dienstag 13. Februar 2007, 21:00
von apollo13
Geht nicht, du solltest dir am besten Funktionen schreiben, die dir Rechtecke etc. zeichnen. Es sei denn Tkinter hat dazugelernt, aber das glaube ich nicht ...

MfG apollo13

Re: Turtle Fuktionen

Verfasst: Dienstag 13. Februar 2007, 21:14
von Rebecca
guter_hund hat geschrieben:Auch das Zeichnen eines Dreiecks und anderer Formen währe sehr interessant.
Wenn du vor etwas Mathematik nicht zurueckschreckst, kannst du dir eine Funktion basteln, die dir ein n-Eck zeichnet. D.h. du hast dann eine while-Schleife von 1 bis n, und du musst dir dann ueberlegen, um welchen Winkel sich die Turtle in jedem Schritt drehen muss, damit sie nach n Schritten wieder an ihrem Ausgangspunkt angelangt.

Als Extra kannst du dir auch noch ueberlegen, wie man die Groesse eines n-Ecks steuern kann.

Verfasst: Dienstag 13. Februar 2007, 21:21
von pyStyler
apollo13 hat geschrieben: Es sei denn Tkinter hat dazugelernt, aber das glaube ich nicht ...
was hat das mit Tkinter zu tun?

Verfasst: Dienstag 13. Februar 2007, 21:51
von apollo13
pyStyler hat geschrieben:
apollo13 hat geschrieben: Es sei denn Tkinter hat dazugelernt, aber das glaube ich nicht ...
was hat das mit Tkinter zu tun?
Wie meinen? Ich meinte es in die Richtung, dass Tkinter vlt. inzwischen schon eine Funktion um N-Ecke zu zeichnen bereitstellt (auch wenn ich denn Sinn nicht sehe...).

MfG apollo13

Verfasst: Dienstag 13. Februar 2007, 22:18
von Leonidas
apollo13 hat geschrieben:Wie meinen? Ich meinte es in die Richtung, dass Tkinter vlt. inzwischen schon eine Funktion um N-Ecke zu zeichnen bereitstellt (auch wenn ich denn Sinn nicht sehe...).
Das hat doch nichts mit Tkinter zu tun.

Turtle implementiert Turtle-Grafik und dieses ist auch gar nicht dazu gedacht, n-Ecke zu zeichnen. Das ist nicht der Sinn der Turtle-Grafik, wenn man programmatorisch auf Tk-Fenstern zeichnen will nimmt man Canvas. Daher ist es auch nur richtig so, dass weder turtle, noch xturtle noch sdlturtle n-Ecke zeichnen können.

Verfasst: Mittwoch 14. Februar 2007, 10:47
von apollo13
Ah verdammt jetzt verstehe ich^^
Das war weil er im Tkinter Forum geschrieben hat. Meine Antwort war ja eh auf Turtle bezogen. Alles klar *gg*

Verfasst: Mittwoch 14. Februar 2007, 10:59
von BlackJack
Leonidas hat geschrieben:Turtle implementiert Turtle-Grafik und dieses ist auch gar nicht dazu gedacht, n-Ecke zu zeichnen.
Macht als Aufgabe aber schon Sinn. Man muss sich ja nur überlegen wieviele Schritte man für ein N-Eck braucht, wie lang die sein müssen und um wieviel Grad sich die Schildkröte an jeder Ecke drehen muss.

Verfasst: Mittwoch 14. Februar 2007, 14:23
von guter_hund
apollo13 hat geschrieben:...du solltest dir am besten Funktionen schreiben...
Okay. Nur bin ich in Python noch nicht so weit um Funktionen zu schreiben. Wie geht das?

Liebe Grüße...

Verfasst: Mittwoch 14. Februar 2007, 14:46
von BlackJack
Arbeite am besten mal das Tutorial aus der Dokumentation durch.

Verfasst: Mittwoch 14. Februar 2007, 14:46
von Rebecca

Code: Alles auswählen

>>> def meine_funktion():
...     print "Ich bin eine wichtige Funktion"
...
>>> # Nun koennen wir die Funktion aufrufen:
... meine_funktion()
Ich bin eine wichtige Funktion
>>>
>>> def meine_zweite_funktion(param):
...     print "Ich habe einen Parameter bekommen:", param
...
>>> # Dieser Funktion koennen wir einen Parameter uebergeben:
... meine_zweite_funktion(5)
Ich habe einen Parameter bekommen: 5
Versuche erstmal, eine Funktion zu schreiben, die ein Viereck macht:

Code: Alles auswählen

>>>def viereck():
...     while i in range(1, 4):
...         # Hier kommen jetzt Turtle-Befehle hin...

Verfasst: Mittwoch 14. Februar 2007, 15:40
von HWK
Rebecca hat geschrieben:

Code: Alles auswählen

>>>def viereck():
...     while i in range(1, 4):
...         # Hier kommen jetzt Turtle-Befehle hin...
Eher:

Code: Alles auswählen

for i in range(4):
oder

Code: Alles auswählen

for i in range(1,5):
MfG
HWK

Verfasst: Mittwoch 14. Februar 2007, 16:29
von Leonidas
BlackJack hat geschrieben:
Leonidas hat geschrieben:Turtle implementiert Turtle-Grafik und dieses ist auch gar nicht dazu gedacht, n-Ecke zu zeichnen.
Macht als Aufgabe aber schon Sinn. Man muss sich ja nur überlegen wieviele Schritte man für ein N-Eck braucht, wie lang die sein müssen und um wieviel Grad sich die Schildkröte an jeder Ecke drehen muss.
Richtig, als Aufgabe ist das schon sinnvoll. Aber wenn Turtle das alles schon könnte, hätte es eigentlich keinen Sinn mehr es zu benutzen. Ich sehe Turtle jedenfalls als etwas an, womit man Programmieren lernen kann und von seinen Programmen visuelles Feedback bekommt.

Also ähnlich wie Robot Karol, Kara oder Robocode, wobei letzteres schon auch noch einige andere Sachen lehrt.

Verfasst: Mittwoch 14. Februar 2007, 18:51
von guter_hund
Hi.
Also ich bin schon relativ weit gekommen:

Code: Alles auswählen

from turtle import *

def viereck():
    a = 1
    b = 5
    okay = True
    while okay:
        if a < b:
            forward(pot)
            right(90)
            a = a + 1
            okay = True
        if a == b:
            okay = False
            break
             
width(2)
pot = 100
viereck()
pot ist hierbei die Variable mit der man bestimmen kann wie lang die Linie werden so(hier 100 Pixel). Aber was ist wenn ich keine Rechteck will in dem die Seite 'a' = 'b' ist, sondern die Seite 'a' 40 und die Seite 'b' 20 Pixel lang sein soll???

MFG.: Guter_Hund

Verfasst: Mittwoch 14. Februar 2007, 19:07
von Leonidas
Ungetestet hätte ich sowas anzubieten:

Code: Alles auswählen

import turtle

def quadrilateral(side_a, side_b):
    next_side = side_a
    for i in range(4):
        turtle.forward(next_side)
        turtle.right(90)
        
        if next_side == side_a:
            next_side = side_b
        else:
            next_side = side_a
         
turtle.width(2)
quadliteral(40, 20)
Ist warscheinlich selbsterklärend.

Verfasst: Mittwoch 14. Februar 2007, 19:13
von BlackJack
Das mit der ``while``-Schleife ist recht kompliziert. ``for``-Schleifen wurden hier doch schon gezeigt:

Code: Alles auswählen

from turtle import forward, right, width

def viereck(size):
    for dummy in xrange(4):
        forward(size)
        right(90)

def main():
    width(2)
    viereck(100)

if __name__ == '__main__':
    main()
Ausserdem sollte man in Funktionen möglichst nicht auf Werte im Modulnamensraum zugreifen, die man besser als Argument übergeben kann. Dann lassen sich Funktionen nicht mehr benutzen oder testen ohne dass man im gesamten Programm suchen muss, wo die benötigten Werte eigentlich herkommen.

Für ein Rechteck musst Du zwei Seiten in der einen Länge zeichnen und zwei in der anderen. Jeweils abwechselnd. Wenn man eine Schleife über die Zahlen 0 bis 3 hat, wie im Beispiel oben, kann man beispielsweise unter Verwendung des Modulo-Operators (``%``) testen, ob die Nummer der aktuellen Seite gerade oder ungerade ist, und entsprechend die erste oder zweite Längenangabe benutzen.

Verfasst: Mittwoch 14. Februar 2007, 20:44
von guter_hund
Ich habe es jetzt erst mal so gemacht:

Code: Alles auswählen

from turtle import *
def quadrilateral(side_a, side_b):
    next_side = side_a
    for i in range(4):
        forward(next_side)
        right(90)

        if next_side == side_a:
            next_side = side_b
        else:
            next_side = side_a        
width(2)
quadrilateral(100, 100)
up()
goto(40, -100)
left(90)
down()
quadrilateral(40, 20)             
up()
goto(20, -40)
down()
quadrilateral(20, 20)
up()
goto(60, -40)
down()
quadrilateral(20, 20)
up()
goto(0, 0)
down()
right(45)
forward(71)
left(90)
up()
goto(100, 0)
down()
forward(71)
right(45)
up()
goto(30, 40)

Aber ich versuche es mal mit deiner Variante wenn ich ein bisschen mehr Zeit habe...

MFG.

Edit (Leonidas): Code-Highlighting eingeschaltet.

Verfasst: Mittwoch 14. Februar 2007, 20:46
von Leonidas
Könntest du das mit dem *-Import lassen? Das ist schon Absicht, dass weder BlackJack noch ich *-Imports benutzt haben.

Infos gibts unter [wiki]Module[/wiki].