gpt4 book ai didi

python - 蛇游戏中更新列表的问题

转载 作者:行者123 更新时间:2023-12-01 07:44:45 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

在 eat 函数中:

self.body.insert(0, PVector(tmp[0].x, tmp[0].y))

关于python - 蛇游戏中更新列表的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56517149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com