Pythonkara

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
strucki
User
Beiträge: 5
Registriert: Samstag 5. November 2016, 16:27

Hallo erstmal,
Also meine Aufgabe ist es ein Programm in Pythonkara zu schreiben:
Kara merkt sich die Uhrzeit mit einem Pilz, der schrittweise um einen Baum geschoben wird. Kara soll hier den Pilz - egal, wo er sich zunächst befindet - um einen Schritt weiterverschieben.
(a) Entwickle einen Algorithmus in Struktogrammform und übersetze ihn in ein Python-Programm.
(b) (noch schwieriger) Kara soll auch wieder zurück zur Ausgangsposition laufen.
//////////////
Bild
Dazu habe ich folgendes geschrieben:

Code: Alles auswählen

def back():
     kara.move()
     kara.move()
     kara.move()
     kara.turnLeft()
     kara.move()
     kara.turnRight()
     kara.turnRight()   
xBaum=4     
yBaum=4
world.setTree(xBaum,yBaum,True)
found=False   
while not found:
   kara.turnRight()
   kara.turnRight() 
   kara.move()
   kara.move()
   kara.turnLeft()
   kara.move()
   kara.turnLeft()
   if kara.mushroomFront():
       kara.move()
       kara.turnLeft()
       kara.move()
       kara.turnRight()
       kara.move()
       break
   kara.move() 
   if kara.mushroomFront():
       kara.move()
       kara.turnLeft()
       kara.move()
       kara.turnRight()
       break     
   kara.move()
   if kara.mushroomFront():
        kara.turnLeft()
        kara.move()
        kara.turnRight()
        kara.move()
        kara.turnRight()
        kara.move()
        kara.turnRight()
        kara.move()
        kara.turnRight()
        kara.move()
        kara.turnRight() 
        break
   kara.move()
   kara.turnRight()
   if kara.mushroomFront():
        kara.move()
        kara.turnRight()
        kara.turnRight()
        kara.move()
        kara.turnLeft()
        kara.move()
        kara.turnRight()
        kara.move()
        kara.turnRight()        
        break
   kara.move()
   if kara.mushroomFront(): 
        kara.turnLeft()
        kara.move()
        kara.turnRight()
        kara.move()
        kara.turnRight()
        kara.move()
        kara.turnRight()
        back() 
        break
   kara.move()
   kara.turnRight()
   if kara.mushroomFront():
        kara.move()
        kara.turnRight()
        kara.turnRight()
        kara.move()
        kara.turnLeft()
        back()
        break
   kara.move()
   if kara.mushroomFront():
       kara.turnLeft()
       kara.move()
       kara.turnRight()
       kara.move()
       kara.turnRight()
       kara.move()
       kara.turnRight()
       kara.move()
       kara.move()
       kara.turnLeft()
       back()
       break 
   kara.move()
   kara.turnRight()
   if kara.mushroomFront():
       kara.move()
       kara.turnLeft()
       kara.move()
       kara.turnRight()
       kara.move()
       kara.move()
       kara.turnRight()
       kara.move()
       kara.move()      
       break    
//////////////////////////
Und meine eigentlich Frage ist, ob ihr mit Tipps oder Ideen geben könntet wie ich diesen Code kürzer bekommen kann, weil
er nach meinem Geschmack einfach zu lang ist.(Kara und den Pilz platzieren ich manuell)
heiner88
User
Beiträge: 65
Registriert: Donnerstag 20. Oktober 2016, 07:29

1. Mehr Unterfunktionen wie zum Beispiel back()
2. oder eine Funktion supermove( ["left", "move", "right", "move", ...] )
heiner88
User
Beiträge: 65
Registriert: Donnerstag 20. Oktober 2016, 07:29

Code: Alles auswählen

def supermove(list):
    for elem in list:
        if elem == "move":
            kara.move()
        elif elem == "left":
            ...
        elif elem == "right":
            ...
        else:
            raise Exception("error")
BlackJack

@heiner88: Am besten gleich von Anfang an mit guten Namen arbeiten. `elem` und `list` sind hier viel zu allgemein und `element` hätte man auch ausschreiben können. Ausserdem geht das komplett in drei Zeilen:

Code: Alles auswählen

def supermove(moves):
    for move in moves:
        getattr(kara, move)()
strucki
User
Beiträge: 5
Registriert: Samstag 5. November 2016, 16:27

Okay vielen Dank das hat mir echt geholfen :) Da ich erst vor wenigen Tagen mit Python angefangen habe. :D
strucki
User
Beiträge: 5
Registriert: Samstag 5. November 2016, 16:27

Code: Alles auswählen

def DESU():
    moveturn()
    kara.turnRight()
def movex2():  
    kara.move()  
    kara.move()  
def movemove():
    kara.turnRight()
    kara.move()
    kara.move()
def moveturn():
    kara.move()
    kara.turnRight()  
def moveturnleft():
    kara.move()
    kara.turnLeft()
def MirGehenDieNamenAus():
    moveturn()
    DESU()
def back():
     movex2()
     moveturnleft()
     moveturnleft()         
def right():
    kara.turnLeft()
    moveturn()
    moveturn()
    kara.move() 
while not found:
   kara.turnRight()
   kara.move()
   moveturnleft()
   moveturnleft()
   if kara.mushroomFront():
       moveturnleft()
       moveturn()
       kara.move()
       kara.turnRight() 
       break
   kara.move()
   if kara.mushroomFront():
       moveturnleft()
       moveturn()
       kara.turnRight() 
       break    
   kara.move()
   if kara.mushroomFront():
        right()
        kara.turnRight()
        MirGehenDieNamenAus()
        break
   moveturn()
   if kara.mushroomFront():
        DESU()
        moveturnleft()
        MirGehenDieNamenAus()
        break
   kara.move()
   if kara.mushroomFront():
        right()
        kara.turnRight()
        back()
        break
   moveturn()
   if kara.mushroomFront():
        DESU()
        moveturnleft()
        back()
        break
   kara.move()
   if kara.mushroomFront():
       right()
       movemove()
       kara.turnLeft()
       back()
       break
   moveturn()
   if kara.mushroomFront():
       moveturnleft()
       kara.move()
       movemove()
       movemove()
       kara.turnRight()      
       break            
////////////
Also ich habe "Def's" gemacht und es schon ordentlich gekürzt. Das mit der "def supermove(list):" Habe ich leider doch nicht ganz hinbekommen..
Könnt ihr mir zeigen wie genau ich das anstelle ?
BlackJack

@strucki: `MirGehenDieNamenAus` ist *ganz* schlecht. Das Ziel ist ja nicht so kurz wie möglich, sondern so verständlich wie möglich und da sind schlechte Namen absolutes Gift. Verständliche Funktionsnamen sollten dann auch für Tätigkeiten stehen die tatsächlich ausgeführt werden: `back` bewegt den Käfer gar nicht zurück.

Zwischen Funktionsdefinitionen stehe üblicherweise zwei Leerzeilen.
strucki
User
Beiträge: 5
Registriert: Samstag 5. November 2016, 16:27

Hmm stimmt wohl. Könntet ihr mir denn Ideen für ein dynamischeres Programm geben ?
Welches dann wohl kürzer wäre als ein solches "manuelles" .
heiner88
User
Beiträge: 65
Registriert: Donnerstag 20. Oktober 2016, 07:29

So in etwa:

Code: Alles auswählen

def multimove(moves):
    for move in moves:
        if   move == "move":  kara.move()
        elif move == "left":  kara.turnLeft()
        elif move == "right": kara.turnRight()
        else: raise Exception("error: bad move")
...
...
...
while not found:
   multimove(["right", "right", "move", "move", "left", "move", "left"])
   if kara.mushroomFront():
       multimove(["move", "left", "move", "right", "move"])
...
...
 ...
strucki
User
Beiträge: 5
Registriert: Samstag 5. November 2016, 16:27

Vielen Dank, nun habe ich es verstanden! :)
Yukinekun
User
Beiträge: 1
Registriert: Mittwoch 21. Dezember 2022, 20:18

Hallo.
Ich muss für eine Aufgabe einen Baum von beliebiger Form Ausfüllen. Ich bekomme dies aber nicht hin.Ich bin auch noch ein Anfänger in Python Kara und kenne nur Fallunterscheidungen, Schleifen, logische Operatoren wie not, and und or. Ich habe jetzt schon über 3h daran verschwendet, verschiedenste Dinge auszuprobieren, ich scheitere aber immer.Hier ist ein beispiel von Bäumen, die mit dem gleichen Code ausgefüllt werden sollen. Bild Kann mir jemand bitte Tipps geben bevor ich hier noch komplett verzweifel.
Benutzeravatar
__blackjack__
User
Beiträge: 14067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Bei Bildern muss man eine URL zum *Bild* angeben, nicht eine URL zu einer Webseite die (unter anderem) das Bild enthält. Da ist dann ja auch gar nicht klar welches Bild auf der Webseite überhaupt gemeint war, denn das erste Bild auf der Seite ist ja beispielsweise das Logo des Image-Hosters.

Also das hier sollte es sein:
Bild

Was hast Du denn probiert? Und was ist die Idee hinter der Strategie, die Du umsetzen willst?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten