首页 > 解决方案 > 蛇游戏中更新列表的问题

问题描述

因此,我一直在使用 python 模式编写一个蛇游戏进行处理,但是我为跟踪蛇本身而设置的列表一直存在问题。

我当前的实现使用向量列表来跟踪蛇的每个部分的位置。然后我遍历这个列表以显示每个段的正方形。游戏开始时,列表只有 1 个条目(头部),但在吃完一块食物后,我在列表的前面插入了一个与当前头部相同值的新向量。然后我更新列表但循环遍历它,最后,我使用速度向量更新头部。

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

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

标签: pythonprocessing

解决方案


您似乎误解了 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))

推荐阅读