2014-01-25 89 views
0

我正在編寫一個程序來解決經典的河流謎題,我有點困惑於此。基本上我有一個功能getmoves,它給了我一個包含有效遊戲狀態列表的列表。該函數通過執行所有可能的移動並將有效的移動添加到輸出來計算有效的遊戲狀態。我的list.append發生了什麼問題?

問題是我每次追加到output整個output的變化。

def getmoves(gamestate): 
    """ 
    Returns a list of all possible moves 
    """ 
    boatshore=None 
    moveablemen=[] 
    moveableobjects=[] 
    output = [] 
    gs = gamestate 

    for item in gs: 
     if item['name'] == 'boat': 
      boatshore = item['shore'] 

    for item in gs: 
     if (item['shore'] == boatshore and item['name'].find('man')!=-1): 
      moveablemen.append(item) 

    for item in gs: 
     if (item['shore'] == boatshore and item['name'] != 'boat'): 
      moveableobjects.append(item) 

    for man in moveablemen: 
     for obj in moveableobjects: 
      if (man != obj and man['value']>=obj['value']): 
       possiblemove = move(man['name'], obj['name'],gs) 

       if shorenetworth(possiblemove) == True: 
        output.append(possiblemove) 
        pp.pprint(output) 

    return output 

輸出是這個追加後的操作:

[ [ { 'name': 'manA', 'shore': -1, 'value': 3}, 
     { 'name': 'manB', 'shore': 1, 'value': 5}, 
     { 'name': 'manC', 'shore': 1, 'value': 8}, 
     { 'name': 'coinA', 'shore': -1, 'value': 3}, 
     { 'name': 'coinB', 'shore': 1, 'value': 5}, 
     { 'name': 'coinC', 'shore': 1, 'value': 8}, 
     { 'name': 'boat', 'shore': -1}]] 

輸出是這最後:

[ [ { 'name': 'manA', 'shore': -1, 'value': 3}, 
     { 'name': 'manB', 'shore': 1, 'value': 5}, 
     { 'name': 'manC', 'shore': -1, 'value': 8}, 
     { 'name': 'coinA', 'shore': -1, 'value': 3}, 
     { 'name': 'coinB', 'shore': 1, 'value': 5}, 
     { 'name': 'coinC', 'shore': -1, 'value': 8}, 
     { 'name': 'boat', 'shore': -1}], 
    [ { 'name': 'manA', 'shore': -1, 'value': 3}, 
     { 'name': 'manB', 'shore': 1, 'value': 5}, 
     { 'name': 'manC', 'shore': -1, 'value': 8}, 
     { 'name': 'coinA', 'shore': -1, 'value': 3}, 
     { 'name': 'coinB', 'shore': 1, 'value': 5}, 
     { 'name': 'coinC', 'shore': -1, 'value': 8}, 
     { 'name': 'boat', 'shore': -1}], 
    [ { 'name': 'manA', 'shore': -1, 'value': 3}, 
     { 'name': 'manB', 'shore': 1, 'value': 5}, 
     { 'name': 'manC', 'shore': -1, 'value': 8}, 
     { 'name': 'coinA', 'shore': -1, 'value': 3}, 
     { 'name': 'coinB', 'shore': 1, 'value': 5}, 
     { 'name': 'coinC', 'shore': -1, 'value': 8}, 
     { 'name': 'boat', 'shore': -1}], 
    [ { 'name': 'manA', 'shore': -1, 'value': 3}, 
     { 'name': 'manB', 'shore': 1, 'value': 5}, 
     { 'name': 'manC', 'shore': -1, 'value': 8}, 
     { 'name': 'coinA', 'shore': -1, 'value': 3}, 
     { 'name': 'coinB', 'shore': 1, 'value': 5}, 
     { 'name': 'coinC', 'shore': -1, 'value': 8}, 
     { 'name': 'boat', 'shore': -1}], 
    [ { 'name': 'manA', 'shore': -1, 'value': 3}, 
     { 'name': 'manB', 'shore': 1, 'value': 5}, 
     { 'name': 'manC', 'shore': -1, 'value': 8}, 
     { 'name': 'coinA', 'shore': -1, 'value': 3}, 
     { 'name': 'coinB', 'shore': 1, 'value': 5}, 
     { 'name': 'coinC', 'shore': -1, 'value': 8}, 
     { 'name': 'boat', 'shore': -1}]] 

我敢肯定,我可能犯了一個愚蠢的錯誤的地方,但我不知道如有任何幫助,將不勝感激。

編輯:

def move(man, name, gsinput): 
    """ 
    move two items 
    """ 
    for item in gsinput: 
     if (item['name'] == name or item['name'] == man or item['name'] == 'boat'): 
      item['shore'] *= -1 
    return gsinput 

這是值被附加到output功能。

+0

'move'做什麼? –

+0

給出兩個'name's和gamestate,將包含名字的字典的'shore'的值乘以'-1'。 – chronologos

+0

最好將該功能的代碼添加到您的問題中。畢竟,這是函數的返回值。 –

回答

0

啊,我得到了問題。我將變量possiblemove追加到我的列表中,而不是一個字符串,所以當變量改變輸出時也改變了。