2017-05-14 79 views
1
class Area(): 
    def __init__(self, pos, desc): 
     self.pos = pos 
     self.desc = desc 

area1 = Area([0,0], "desc") 
area2 = Area([0,1], "desc") 
area3 = Area([0,2], "desc") 
area4 = Area([1,1], "desc") 
area5 = Area([2,1], "desc") 
area6 = Area([3,1], "desc") 
area7 = Area([3,2], "desc") 

map_coordinates = [area1.pos, area2.pos, area3.pos, area4.pos, area5.pos, area6.pos, area7.pos] 
player_pos = area1.pos 

print type(map_coordinates) 
print type(map_coordinates[2]) 
print type(player_pos) 

def command(x): 
    print "\n" #Just for readability 
    global player_pos 
    old_pos = player_pos 
    if x == "north": 
     player_pos[1] += 1 
    if player_pos not in map_coordinates: 
     player_pos = old_pos 
     print "Can't go that way" 
    else: 
     print "You go north" 

while True: 
    x = raw_input("type 'north' ") 
    command (x) 
    print player_pos 

我在這裏想要做的是讓一個人如果座標位於map_coordinates時向北走,但如果他們超出界限則停止它們。然而,發生的卻是玩家可以永遠向北,而「不能這樣走」永遠不會被打印出來。我的猜測是'in'關鍵字播放不好,但所有類型都是列表。Python:不想一起工作的列表

+0

'map_coordinates'是'list's的'list'。 –

回答

4

您遇到的問題是您正在修改列表,而不是使用基於舊值的新值創建新列表。

player_pos = area1.posold_pos = player_pos都沒有創建一個新列表。相反,他們只是創建新的引用,以創建在您的第一個Area調用中創建的相同的2元素列表。每次修改player_pos的內容時,在引用該列表的其他任何地方都可以看到相同的更改(因此area1.pos,map_coordinates[0]player_posold_pos都將看到相同的更改)。

我認爲你可以通過使上面的兩行復制列表內容而不是僅僅創建一個新的引用來解決你的問題。 (淺)複製列表的簡單方法是簡單地在其上調用list。嘗試:

player_pos = list(area1.pos) 

和:

old_pos = list(player_pos)