2015-04-23 72 views
0

我正在嘗試創建一個遊戲連接四個程序,其中的主板可以是anysize。系統會提示用戶輸入行數和列數,通過某些代碼創建一個0空格的二維列表。因此,對於由4排板3列Python,更改列表中的列表索引

blankBoard = [[0,0,0],[0,0,0],[0,0,0],[0,0,0]] 

我想創建一個函數的輸入,列表,列砸打成片,由X表示...因此,例如,如果您選擇第3列,更新的董事會名單會出現這樣

blankBoard = [[0,0,0],[0,0,0],[0,0,X],[0,0,0]] 

我的功能是假設採取列的輸入,並找到列列表,它是最後一個是空白的內部指標。我的問題在於刪除並替換那個特定的索引而不更改所有列表。

def move(blankBoard, column): 
    newBoard = blankBoard[:] 
    col = column - 1 # The first column in connect four is 1, not 0 
    index = -1 
    i = 0 
    while i < len(newBoard[col]): 
     if newBoard[col][i] == 0: 
      index = index + 1 
     i = i + 1 
    newBoard[col][index] = "X" # This line of code I think is bad 
    print(newBoard) 
    return "" 

與下面的輸出...

newBoard = [[0,0,X],[0,0,X],[0,0,X],[0,0,X]] 

但正如我所說,我只希望X將在由「關口」 爲什麼通過所有列循環表示的子表(子列表)如果改變子列表的特定索引的代碼行不在while循環中嗎?

回答

0

難道你不能只是通過反向列表循環並設置第一個(在倒轉後,真的是最後一個)0x

a = [0,0,'x'] 
for i in reversed(range(len(a))): 
    if a[i] == 0: 
    a[i] = 'x' 
    break 
print a # will print [0, 'x', 'x'] 

[編輯]

與運行到move調用使用blankBoard你的代碼作爲參數將使預期的結果,而不是您所描述的行爲。如果,但是,調用move[[0]*3]*4作爲一個參數或[arr,arr,arr,arr]作爲參數(其中arr = [0,0,0]),會出現重複的行爲。這是因爲在最後兩個例子中,所有的子列表都是對同一個列表的引用。

請參閱https://stackoverflow.com/a/240205/1458374

+0

......可能有效。但我更關心爲什麼我的代碼不起作用。我將會有許多類似的代碼,這些代碼涉及循環列表的不同子列表,並替換特定子列表/ – JoeStat1986