2017-05-14 1 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.posまたはold_pos = player_posのいずれも新しいリストを作成しません。代わりに、最初のArea呼び出しで作成された同じ2要素リストへの新しい参照を作成します。 player_posの内容を変更するたびに、リストが参照される他の場所にも同じ変更が表示されます(したがって、area1.posmap_coordinates[0]player_pos、およびold_posに同じ変更が表示されます)。

私は上記の両方の行を新しい参照を作成するのではなくリストの内容をコピーすることで問題を解決できると思います。リストをコピーする簡単な方法の1つは、単にlistと呼ぶだけです。試してみてください:

player_pos = list(area1.pos) 

そして:

old_pos = list(player_pos) 
関連する問題