2017-10-19 10 views
1

Je suis novice en programmation et j'essaie de résoudre une tâche que j'ai reçue de l'école. Je dois construire une fonction qui utilise une tortue pour dessiner quelque chose, à partir d'un argument de type chaîne (comme 'fdltfd' - aller de l'avant, gauche et avancer à nouveau). Ces commandes sont dans un dictionnaire, donc je dois comparer les éléments de la chaîne avec les clés du dictionnaire. S'ils correspondent, ordonnez à la tortue de se déplacer. Le code que j'ai écrit:Un dictionnaire contrôle le mouvement d'une tortue

def execute(turtle, length, args, *cmd): 

map = {'fd': turtle.fd(length), 'lt': turtle.lt(args), 'bk': turtle.bk(length), 'rt': turtle.rt(args), 'nop':None} 

for command in cmd: 
    if command in map.keys(): 
     map[command]() 

execute(bob, 50, 45, 'fdltfd') 

Le problème est que la tortue fait exactement ce qui est dans le dictionnaire, se déplace vers l'avant, vers l'arrière, à gauche et à droite, il ne prend pas la peine de regarder mon boucle for.

Pouvez-vous s'il vous plaît me donner quelques idées de comment je pourrais faire ce travail? Ou si j'y pense bien? Bien sûr, pas le code pour cela:) ... Merci beaucoup

Répondre

2

problèmes spécifiques avec votre code: L'astérisque devant l'argument cmd est incorrect:

def execute(turtle, length, args, *cmd): 

donné la façon dont vous » re invoquer:

execute(bob, 50, 45, 'fdltfd') 

Donc, se débarrasser de l'astérisque. Le paramètre turtle est également le nom d'un package, donc modifiez-le, par ex. . De même map est le nom d'un built-in Python, alors changez-le.

Votre dictionnaire doit contenir des fonctions à appeler, pas les résultats des fonctions d'appel. C'est à dire. au lieu de:

map = {'fd': turtle.fd(length), 'lt': turtle.lt(args), 'bk': turtle.bk(length), 'rt': turtle.rt(args), 'nop':None} 

Je me attends quelque chose comme:

commands = {'fd': turtle.fd, 'lt': turtle.lt, 'bk': turtle.bk, 'rt': turtle.rt, 'nop': None} 

ou:

LENGTH = 50 
ANGLE = 45 

commands = { \ 
    'fd': lambda t: t.fd(LENGTH), \ 
    'lt': lambda t: t.lt(ANGLE), \ 
    'bk': lambda t: t.bk(LENGTH), \ 
    'rt': lambda t: t.rt(ANGLE), \ 
    } 

Compte tenu de la valeur de cmd, 'fdltfd', je ne vois pas comment vous attendez ceci pour fonctionner:

for command in cmd: 

comme il chercherait 'f', 'd', 'l', 't', etc. dans le dictionnaire au lieu de 'fd', 'lt', etc. Vous voulez probablement quelque chose de plus:

# 'fdltfd' -> ['fd', 'lt', 'fd'] 
for command in [a + b for a, b in zip(cmd[0::2], cmd[1::2])]: 

Mettre tout ce qui précède ensemble, nous obtenons une mise en œuvre difficile qui fonctionne essentiellement:

import turtle 

LENGTH = 50 
ANGLE = 45 

commands = { \ 
    'fd': lambda t: t.fd(LENGTH), \ 
    'lt': lambda t: t.lt(ANGLE), \ 
    'bk': lambda t: t.bk(LENGTH), \ 
    'rt': lambda t: t.rt(ANGLE), \ 
    } 

def execute(my_turtle, cmd): 
    for command in [a + b for a, b in zip(cmd[0::2], cmd[1::2])]: 
     if command in commands: 
      commands[command](my_turtle) 

execute(turtle.Turtle(), 'fdltfdltfdltfdltfdltfdltfdltfd') 

turtle.mainloop() 
+0

Merci beaucoup, monsieur. Tu es un sauveur. Avec votre aide, j'ai réussi à changer la fonction d'exécution, alors maintenant, il faut aussi LENGTH et ANGLE comme arguments. J'ai aussi oublié de lambda. Donc, ma tortue est entièrement basée sur la fonction. Encore, merci beaucoup. –