蛇游戏中的更新列表问题

时间:2019-06-09 18:05:24

标签: python processing

所以我一直在使用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

我希望输出是不同向量的列表,每个向量在上一个和下一个条目旁边绘制一个正方形。相反,在吃完食物后,身体列表中的所有向量都是相同的。有谁知道我该如何解决?

1 个答案:

答案 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))