2017-10-19 131 views
1

我是編程新手,我試圖解決我從學校獲得的任務。我必須建立一個函數,使用烏龜來繪製一些東西,從一個字符串類型的參數(例如'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循環。

你可以給我一些關於如何做這項工作的想法嗎?或者如果我正在考慮它是正確的?當然,並不是說代碼:)......非常感謝你

回答

2

具體問題與您的代碼:在cmd參數前面的星號是不正確:

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

給你的方式」重新調用它:

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

所以擺脫星號。參數turtle也是一個包的名稱,因此可以對其進行更改,例如my_turtle。同樣,map是內置Python的名稱,因此請對其進行更改。

你的字典應該包含調用的函數,而不是調用函數的結果。即而不是:

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

非常感謝你,先生。你是救生員。在你的幫助下,我管理着改變執行功能,所以現在它也需要LENGTH和ANGLE作爲參數。我也忘記了拉姆達。所以,我的烏龜完全基於這個功能。再次,非常感謝。 –