我正在开发一个Snake游戏,而Tail确实遇到了麻烦。我创建的代码应该可以使用,但是列表和我使用的变量存在一些问题。
在程序开始时,我声明了2个列表:
playerpos=[552,352]
snake=[]
当我移动蛇时,playerpos会增加或减少50。 然后,将列表“ playerpos”插入列表“ snake
”的位置0snake.insert(0,playerpos)
我打印蛇头
screen.blit(serpente,snake[0])
pygame.display.flip #upgrade the screen
程序的其余部分:
if prevscore==score:
del snake[0]
elif prevscore<score:
prevscore+=1
for i in range(0,score):
screen.blit(tail,snake[i])
pygame.display.flip()
现在,我使用此代码来查看蛇是否吃了一个苹果。 如果他做到了,我什么也不会做。如果他没有,我只是删除列表的第一个元素(以保持蛇的长度相同)
然后,我开始进行“ for cycle”打印蛇尾。
我希望它出现在尾巴上,但不是。我调试了程序,发现当我更改“ playerpos”的值时,所有“ snake”列表都会改变。 看起来不是
snake=[[value took from playerpos] , [value took from playerpos] , [value took from playerpos]]
但更像是
snake=[playerpos, playerpos, playerpos]
因此,当我更改playerpos值以移动蛇时,整个蛇列表都会更改
答案 0 :(得分:1)
playerpos=[552,352]
是一个列表。您必须创建玩家位置的浅表副本:
snake.insert(0, playerpos[:])
注意,在python中,变量名是对对象的引用。数据包含在对象中。进行分配时,将分配引用,并且两个变量都引用同一对象。
这样做的时候
snake.insert(0, playerpos)
然后将名称playerpos
后面的对象的引用插入到列表中。最后,列表的所有元素都引用同一对象。因此,如果您更改playerpos
的内容,那么所有元素似乎也都发生了神奇的变化。
[:]
创建一个list的浅表副本。因此,将插入对列表副本(playerpos
)的引用。