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'关键字效果不佳,但所有类型都是列表。
答案 0 :(得分:4)
您遇到的问题是您正在修改列表,而不是使用基于旧值的新值创建新列表。
player_pos = area1.pos
或old_pos = player_pos
行都没有创建新列表。相反,它们只是创建对第一个Area
调用中创建的同一个2元素列表的新引用。每次修改player_pos
的内容时,相同的更改都会在引用列表的其他位置可见(因此area1.pos
,map_coordinates[0]
,player_pos
和{{ 1}}都会看到相同的变化。)
我认为您可以通过使上面的两行复制列表内容而不是仅创建新引用来解决您的问题。 (浅)复制列表的一种简单方法就是在其上调用old_pos
。尝试:
list
和
player_pos = list(area1.pos)