Seite 1 von 1

Haus vom Nikolaus / Farben

Verfasst: Mittwoch 24. Januar 2007, 12:11
von black hacker
alos wir studenten von der uni karlsruhe haben ein problem
ihr kennt sicher das haus vom nikolaus... wir haben auch schon alles bis auf eine aufgabe:
jede linie soll in einer verschiedenen farbe sein ,die vorher in einer liste definiert wurden. aus dieser liste werden die farben zyklisch entnommen
( 4 farben)
unser ansatz

Code: Alles auswählen

from turtle import *
width (5)
forward(50)
left(135)
forward(70)
right(90)
forward(70)
right(90)
forward(35)
right(90)
forward (70)
right(135)
forward(50)
right(90)
forward(50)
right(90)
forward(50)

Verfasst: Mittwoch 24. Januar 2007, 13:16
von BlackJack
Das ist aber nicht das Haus vom Nikolaus. Oder der Architekt hatte zuviel Glühwein. ;-)

Was genau ist denn jetzt die Frage? Die Farbe ändert man mit der `color()`-Funktion.

Ihr könntet da jetzt nach jeder Bewegung einen Befehl einfügen, der die entsprechende Farbe aus der Liste holt, aber eigentlich würde man für so etwas eine Schleife schreiben.

Am besten eine, die über eine Liste mit Tupeln mit geeigneten Bewegungsdaten iteriert, dann kann man die Bewegungen als Daten auffassen. Und nach jeder Vorwärtsbewegung muss man die nächste Farbe wählen. Dazu kann man manuell einen Index verwalten. Oder wenn die Bewegungsdaten passend gewählt wurden, mit `enumerate()` einen Index generieren, oder vielleicht auch Funktionen aus dem `itertools`-Modul benutzt, wie `izip()` und `cycle()`.

Verfasst: Mittwoch 24. Januar 2007, 20:24
von Sr4l

Code: Alles auswählen

import time
import turtle as t
from random import randint as rnd

colors = ["blue","red","green","yellow","grey","orange"] #moegliche farben
t.width (5) # linien staerke

def tl(winkel,mass):
    t.color(colors[rnd(0,len(colors)-1)])
    t.left(winkel)
    t.forward(mass)
            
def tr(winkel,mass):
    t.color(colors[rnd(0,len(colors)-1)])
    t.right(winkel)
    t.forward(mass)
        
# Programm ablauf
tl(180,50)
tr(135,70)
tl(135,50)
tr(135,35)
tr(90,35)
tr(45,50)
tr(135,70)
tl(135,50)

# Sleep dann geht Tk Fenster zu
time.sleep(5)
das hat mal spaß gemacht :-D
habe jetzt farben zufällig eingesetzt macht aber auch keinen großen unterschied.

Verfasst: Donnerstag 25. Januar 2007, 14:48
von BlackJack
Eine Lösung mit den Bewegungen als "Daten":

Code: Alles auswählen

import turtle
from turtle import left, right
from itertools import cycle, izip

def main():
    colors = ('black', 'red', 'green', 'blue')
    data = ((left, 0, 50), (left, 135, 70), (right, 90, 70),
            (right, 90, 35), (right, 90, 70), (right, 135, 50),
            (right, 90, 50), (right, 90, 50))
    
    turtle.width(5)
    
    for color, (rotate_func, angle, distance) in izip(cycle(colors), data):
        turtle.color(color)
        rotate_func(angle)
        turtle.forward(distance)
Man könnte es auch auf eine Drehrichtung beschränken und einfach die entsprechenden Winkel nehmen um den gleichen Effekt zu erhalten. Dann braucht man ein Datum weniger pro Schritt.

Verfasst: Donnerstag 25. Januar 2007, 14:59
von Sr4l
Es wäre einfach wenn man den Winkel immer absolute angibt 0° = rechts
90° = unten usw. einmal rum halt.