Seite 1 von 1

Pythonkara

Verfasst: Samstag 5. November 2016, 16:39
von strucki
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)

Re: Pythonkara

Verfasst: Sonntag 6. November 2016, 04:52
von heiner88
1. Mehr Unterfunktionen wie zum Beispiel back()
2. oder eine Funktion supermove( ["left", "move", "right", "move", ...] )

Re: Pythonkara

Verfasst: Sonntag 6. November 2016, 05:28
von heiner88

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")

Re: Pythonkara

Verfasst: Sonntag 6. November 2016, 11:13
von 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)()

Re: Pythonkara

Verfasst: Sonntag 6. November 2016, 15:14
von strucki
Okay vielen Dank das hat mir echt geholfen :) Da ich erst vor wenigen Tagen mit Python angefangen habe. :D

Re: Pythonkara

Verfasst: Sonntag 6. November 2016, 17:06
von strucki

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 ?

Re: Pythonkara

Verfasst: Sonntag 6. November 2016, 17:32
von 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.

Re: Pythonkara

Verfasst: Sonntag 6. November 2016, 18:26
von strucki
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" .

Re: Pythonkara

Verfasst: Sonntag 6. November 2016, 19:52
von heiner88
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"])
...
...
 ...

Re: Pythonkara

Verfasst: Sonntag 6. November 2016, 23:02
von strucki
Vielen Dank, nun habe ich es verstanden! :)

Re: Pythonkara

Verfasst: Mittwoch 21. Dezember 2022, 20:36
von Yukinekun
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.

Re: Pythonkara

Verfasst: Mittwoch 21. Dezember 2022, 22:10
von __blackjack__
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?