【问题标题】:A dictionary controls a turtle's movement字典控制乌龟的运动
【发布时间】:2018-03-31 22:46:42
【问题描述】:

我是编程新手,我正在尝试解决我从学校得到的一项任务。我必须构建一个函数,该函数使用海龟从字符串类型的参数(例如'fdltfd' - 再次向前、向左和向前移动)中绘制一些东西。这些命令在字典中,因此我必须将字符串中的元素与字典键进行比较。如果它们匹配,命令乌龟移动。我写的代码:

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

问题是乌龟只做字典里的事情,向前、向后、向左和向右移动,它甚至不看我的for循环。

能否请您给我一些想法,让我了解如何完成这项工作?或者,如果我想对了?当然,不是那个代码:)...非常感谢

【问题讨论】:

    标签: python string function dictionary turtle-graphics


    【解决方案1】:

    您的代码的具体问题:cmd 参数前面的星号不正确:

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

    鉴于您调用它的方式:

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

    所以去掉星号。参数turtle 也是包的名称,因此请更改它,例如my_turtle。同样map 是 Python 内置的名称,因此请更改它。

    您的字典应该包含要调用的函数,而不是调用函数的结果。 IE。而不是:

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

    我希望有更多类似的东西:

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

    或:

    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), \
        }
    

    鉴于cmd'fdltfd' 的值,我看不出你期望它如何工作:

    for command in cmd:
    

    因为它会在字典中查找 'f'、'd'、'l'、't' 等,而不是 'fd'、'lt' 等。您可能想要更多类似的内容:

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

    将以上所有内容放在一起,我们得到了一个基本可行的粗略实现:

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

    【讨论】:

    • 非常感谢,先生。你是救生员。在您的帮助下,我设法更改了执行函数,所以现在它也将 LENGTH 和 ANGLE 作为参数。我也忘记了 lambda。所以,我的乌龟完全是基于函数的。再次,非常感谢。
    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2020-03-03
    相关资源
    最近更新 更多