gpt4 book ai didi

python - 我可以让函数返回列表中的多个值吗?

转载 作者:行者123 更新时间:2023-12-04 10:48:43 25 4
gpt4 key购买 nike

这是我的圈子类:

class circle:
def __init__(self):
self.x = random.randint(10, SW-10)
self.y = random.randint(10, SH-10)
self.radius = random.randint(5, 50)
self.color = (random.randint(1, 255),random.randint(1, 255), random.randint(1, 255))

def draw(self):
pygame.draw.circle(d, (self.color), (self.x, self.y), self.radius)

def move(self):
self.x = X
self.y = Y

从这个圈子类,我通过做 user = circle() 做了一个用户圈子和 20 个随机圆圈
circles = list()
for i in range(20):
circles.append(circle())`

这是我的 cillision 检测:
def circle_collision(cir1, cir2):
a = abs(cir2.x - cir1.x)**2
b = abs(cir2.y - cir1.y)**2
distance = math.sqrt((a) + (b))
if distance < cir1.radius + cir2.radius:
return True
else:
return False

我的问题是我无法通过列表 circles作为我的碰撞检测参数之一,但我也希望程序检测到 user = circle()圆与任何其他随机圆碰撞。
最初,我尝试这样做来解决我的问题:
def foo():
for i in range(len(circles)):
result = circles[i]
return result

我希望这能返回列表中的每个项目,这样我就可以在 while True 中调用碰撞检测,如下所示循环为:
collided = circle_collision(user, foo())

但是 foo函数仅返回一个值,因此碰撞检测只能检测到一个圆。我该怎么做才能使 collision_detection检查每个圆圈?有没有办法让函数返回多个值?还是我必须完全改变我的逻辑?谢谢你的帮助。

这是我的整个程序供引用。
import pygame, math, os, random

os.environ["SDL_VIDEO_CENTERED"]="1"
pygame.init()

win = pygame.display
win.set_caption("A lot a circles")
SW = 1200
SH = 600
d = win.set_mode((SW, SH))
pygame.time.Clock().tick(60)

def write(size, text, x, y):
font = pygame.font.SysFont("Aeiral", size)
text = font.render(text, True, (0, 0, 0))
d.blit(text, (x, y))

def circle_collision(cir1, cir2):
a = abs(cir2.x - cir1.x)**2
b = abs(cir2.y - cir1.y)**2
distance = math.sqrt((a) + (b))
if distance < cir1.radius + cir2.radius:
return True
else:
return False

class circle:
def __init__(self):
self.x = random.randint(10, SW-10)
self.y = random.randint(10, SH-10)
self.radius = random.randint(5, 50)
self.color = (random.randint(1, 255),random.randint(1, 255), random.randint(1, 255))

def draw(self):
pygame.draw.circle(d, (self.color), (self.x, self.y), self.radius)

def move(self):
self.x = X
self.y = Y

user = circle()

def foo():
for i in range(len(circles)):
result = circles[i]
return result

circles = list()
for i in range(20):
circles.append(circle())

mainloop = True
while mainloop:
X, Y = pygame.mouse.get_pos()
d.fill((98, 98, 98))
for i in circles:
i.draw()
user.draw()
user.move()
write(user.radius, "USER", user.x - user.radius + 2, user.y - 7)
collided = circle_collision(user, foo())
if collided == True:
user.color = (255, 0, 0)
if collided == False:
user.color = (255, 255, 255)

for event in pygame.event.get():
if event.type == pygame.QUIT:
mainloop = False

win.flip()

pygame.quit()
quit()

最佳答案

您必须添加另一个函数来评估圆是否与列表中的圆发生碰撞,并使用碰撞的圆创建一个新列表:

def circles_collision(cir1, cirlist):
collidlist = []
for cir2 in cirlist:
if circle_collision(cir1, cir2):
collidlist.append(cir2)
return collidlist

或者更短:

def circles_collision(cir1, cirlist):
return [cir2 for cir2 in cirlist if circle_collision(cir1, cir2)]

测试是否 collidelist any 元素:

collidelist = circles_collision(user, circles)
if any(collidelist):
user.color = (255, 0, 0)
else:
user.color = (255, 255, 255)

如果您只想评估是否有任何圆碰撞,那么您根本不需要列表和单独的函数:

if any(circle_collision(user, circle) for circle in circles):  
user.color = (255, 0, 0)
else:
user.color = (255, 255, 255)

关于python - 我可以让函数返回列表中的多个值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59583431/

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