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
).
Leider komme ich nicht so recht voran. Folgende Befehle und deren Bedeutung sind mir bereits bekannt/geläufig:
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:
oder
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].