Turtlegrafik Frage zu Datenstruktur

Du hast eine Idee für ein Projekt?
Antworten
spätpythonier
User
Beiträge: 5
Registriert: Freitag 8. Januar 2021, 18:38

Für Buchstaben und Zeichenkombinationen in einem quadratischen Raster habe ich Turtlebefehle als Listen definiert, die von der Funktion "zeichne" wieder zu Turtlebefehlen umgesetzt werden. Das klappt.
Jetzt soll der ganze Text in der Liste "Text" festgelegt und von einer Funktion "zeichnetext" gezeichnet werden. Meine Frage, wie kann ich aus Text=["Le","o","t"] wieder die definierten Listen bekommen. Mit eval() ging's nicht . Gestern hat mir _blackjack_ geraten, das Problem hier nochmal zu posten, statt nur meine Vorstellung von einer möglichen Lösung preiszugeben. ;-))

from tkinter import *
from turtle import *
import turtle

breite=520
hoehe=520
screensize(breite,hoehe)

def zeichne(z):
# zeichnet das Zeichen (ein Buchstabe oder ein Diph- oder Triphtong),
# aus einer Liste mit Turtle-Bewegungen und den 4 Sonderbefehlen:
# begin_fill() 'b', end_fill() 'e',penup() 'u', pendown() 'd'
if z==[]:
return 0
elif z[0] in ['b','e','u','d']:
if z[0]=='b':
begin_fill()
if z[0]=='e':
end_fill()
if z[0]=='u':
pu()
if z[0]=='d':
pendown()
return zeichne(z[1:])
fd(x*int(z[0]));lt(int(z[1])*90)
return zeichne(z[2:])

def zeichnetext(liste):♯ funzt nicht
if liste==[]:
return
zeichen=liste[0]
if zeichen=="":
pu();fd(2*x);pd()
return zeichnetext(liste[1:])
zeichne(zeichen)
pu();fd(x);pd()
return zeichnetext(liste[1:])

def start():
speed(0);ht()
global ss,anz,x
ss=breite
anz=26
x=ss/anz #20
# Definition der Zeichen
Le=['b',5,1,1,1,4,-1,6,1,1,1,7,1,'e','u',2,1,2,-1,'d','b',
3,1,1,1,2,-1,1,-1,2,1,3,1,3,1,5,1,'u',1,1,3,0,'d',1,-1,1,-1,1,-1,1,-1,
'u',-3,-1,-1,0,'e','u',0,1,-2,-1,-2,0,'d','u',5,0,'d']
t=['b',2,1,1,1,1,-1,3,-1,1,1,1,1,1,-1,2,1,1,1,7,1,'e','u',2,0,'d']
O=['b',3,1,7,1,3,1,7,1,'u',1,1,1,0,'d',5,-1,1,-1,5,-1,1,-1,
'u',-1,-1,-1,0,'d','e','u',3,0,'d']
zeichne(Le); pu();fd(2*x);pd()
zeichne(O); pu();fd(x);pd()
zeichne(t)
'''alternativ sollte einmal
zeichnetext(["Le","","O","t"])
möglich sein'''
start()
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Rekursion ist kein Ersatz für einfache Schleifen. Globale Variablen darf man nicht benutzen. Strichpunkt sollte man auch nicht benutzen, sondern jede Anweisung in eine eigene Zeile schreiben.
Turtle ist leider so ausgerichtet, dass man *-importiert und mit kryptischen Namen arbeitet, aber für eigene Programme sollte man gute Variablennamen benutzen.

Code: Alles auswählen

def zeichne(zeichen, scaling=1):
    """ zeichnet das Zeichen (ein Buchstabe oder ein Diph- oder Triphtong),
    aus einer Liste mit Turtle-Bewegungen und den 4 Sonderbefehlen:
    begin_fill() 'b', end_fill() 'e',penup() 'u', pendown() 'd' """
    status = "len"
    for command in zeichen:
        if command == 'b':
            begin_fill()
        elif command == 'e':
            end_fill()
        elif command == 'u':
            pu()
        elif command == 'd':
            pendown()
        elif status == "len":
            fd(scaling * command)
            status = "dir"
        elif status == "dir":
            lt(90 * command)
            status = "len"
        else:
            assert False, "internal error"
Und was funktioniert bei zeichnetext nicht?

Code: Alles auswählen

LETTERS = {
    "Le": ['b',5,1,1,1,4,-1,6,1,1,1,7,1,'e','u',2,1,2,-1,'d','b',
           3,1,1,1,2,-1,1,-1,2,1,3,1,3,1,5,1,'u',1,1,3,0,'d',1,-1,1,-1,1,-1,1,-1,
           'u',-3,-1,-1,0,'e','u',0,1,-2,-1,-2,0,'d','u',5,0,'d']
    "t": ['b',2,1,1,1,1,-1,3,-1,1,1,1,1,1,-1,2,1,1,1,7,1,'e','u',2,0,'d']
    "O": ['b',3,1,7,1,3,1,7,1,'u',1,1,1,0,'d',5,-1,1,-1,5,-1,1,-1,
          'u',-1,-1,-1,0,'d','e','u',3,0,'d']
}

def zeichnetext(text, scaling=1):
    for zeichen in text:
        if zeichen == "":
            space = 2 * scaling
        else:
            zeichne(LETTERS[zeichen], scaling)
            space = scaling
        pu()
        fd(space)
        pd()
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: Es gibt ja etwas weniger kryptische Namen, im Code steht ja sogar einmal `pendown()` statt `pd()`. Genau so gibt es `penup()` statt `pu()`, `left()` statt `lt()`, `foward()` statt `fd()`, und so weiter.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
spätpythonier
User
Beiträge: 5
Registriert: Freitag 8. Januar 2021, 18:38

@Sirius3: Hast Du meinen Dank erhalten gestern, er ist für mich nicht mehr sichtbar.
Antworten