所以我一直在使用python模式编写蛇游戏来进行处理,但是我在设置列表时一直遇到问题,该列表用于跟踪蛇本身的身体。
我当前的实现使用向量列表来跟踪蛇的每个片段的位置。然后,我遍历此列表以显示每个线段的正方形。在游戏开始时,列表只有一个条目(头部),但是在吃了一块食物后,我在列表的前面插入了一个与当前头部相同的值的新向量。然后,我更新列表,但遍历整个列表,最后,我使用速度矢量更新了头部。
scl = 10
dim = 20
def setup():
global s
global f
size(dim * scl, dim * scl)
s = Snake()
f = Food()
def draw():
background(201)
global s
global f
if s.eat(f):
f.location()
s.update()
s.display()
f.display()
delay(50)
class Snake:
def __init__(self):
self.body = [PVector(0, 0)]
self.v = PVector(1, 0)
self.total = 1
def update(self):
for i in range(self.total - 1):
self.body[self.total - 1 - i] = self.body[self.total - 2 - i]
print("Position")
print(self.body)
self.body[0].x += self.v.x * scl
print(self.body)
self.body[0].y += self.v.y * scl
print(self.body)
def display(self):
fill(101)
for i in range(self.total):
rect(self.body[i].x + 1, self.body[i].y + 1, scl - 2, scl - 2)
def eat(self, p):
tmp = self.body[:]
dis = dist(self.body[0].x, self.body[0].y, p.pos.x, p.pos.y)
if dis < 1:
self.total += 1
self.body.insert(0, tmp[0])
return True
else:
return False
我希望输出是不同向量的列表,每个向量在上一个和下一个条目旁边绘制一个正方形。相反,在吃完食物后,身体列表中的所有向量都是相同的。有谁知道我该如何解决?
答案 0 :(得分:1)
您似乎误解了python的列表如何处理其值。
tmp = self.body[:]
进行浅拷贝,而不是深拷贝。并且:
self.body[...] = self.body[...]
不复制该值。它只是将值从一个地方传递到另一个地方。因此,当您将self.body
中的值移动一个偏移量时,第一个和第二个元素将结束指向相同的值。
尝试这样的事情:
def update(self):
for i in range(self.total - 1):
self.body[self.total - 1 - i] = self.body[self.total - 2 - i]
print("Position")
print(self.body)
self.body[0] = PVector(self.body[0].x + self.v.x * scl, self.body[0].y + self.v.y * scl)
print(self.body)
和进餐功能:
self.body.insert(0, PVector(tmp[0].x, tmp[0].y))