首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以让一个函数在一个列表中返回多个值吗?

我可以让一个函数在一个列表中返回多个值吗?
EN

Stack Overflow用户
提问于 2020-01-03 18:17:37
回答 2查看 67关注 0票数 2

这是我的圆圈课:

代码语言:javascript
复制
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个随机圆

代码语言:javascript
复制
circles = list()
for i in range(20):
   circles.append(circle())`

这是我的纤毛检测:

代码语言:javascript
复制
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()圆圈与任何其他随机圆圈发生碰撞时的情况。起初,我尝试这样做来解决我的问题:

代码语言:javascript
复制
def foo():
    for i in range(len(circles)):
        result = circles[i]
    return result

我希望这样可以返回列表中的每一项,这样我就可以调用while True循环中的碰撞检测,如下所示:

代码语言:javascript
复制
collided = circle_collision(user, foo())

但是foo函数只返回一个值,所以碰撞检测只能检测一个圆。我能做些什么让collision_detection检查每一个圆圈?有办法使一个函数返回多个值吗?还是我要彻底改变我的逻辑?谢谢你的帮助。

这是我的整个程序供参考。

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-03 18:28:04

您必须添加另一个函数,该函数计算一个圆圈是否与列表中的一个圆发生碰撞,并与碰撞圆创建一个新的列表:

代码语言:javascript
复制
def circles_collision(cir1, cirlist):
    collidlist = []
    for cir2 in cirlist:
        if circle_collision(cir1, cir2):
            collidlist.append(cir2)
    return collidlist

甚至更短:

代码语言:javascript
复制
def circles_collision(cir1, cirlist):
    return [cir2 for cir2 in cirlist if circle_collision(cir1, cir2)]

测试collidelist是否有any元素:

代码语言:javascript
复制
collidelist = circles_collision(user, circles)
if any(collidelist):
    user.color = (255, 0, 0)
else:
    user.color = (255, 255, 255) 

如果您只想计算是否有任何圆发生碰撞,那么根本不需要一个列表和一个单独的函数:

代码语言:javascript
复制
if any(circle_collision(user, circle) for circle in circles):  
    user.color = (255, 0, 0)
else:
    user.color = (255, 255, 255)
票数 1
EN

Stack Overflow用户

发布于 2020-01-03 18:30:02

是的,你可以回一份名单。此外,不需要执行for i in range(len(circles));您可以更容易地编写for circle in circles。此外,在本例中,没有理由只返回该列表的副本就遍历circles列表。并且确保你没有重新设置每个圆圈的颜色--如果发生任何碰撞,你只想设置颜色,如果你每次通过循环设置它,你最终只会使用上次的碰撞。尝试:

代码语言:javascript
复制
collisions = (circle_collision(user, circle) for circle in circles)
if any(collisions):
    user.color = (255, 0, 0)
else:
    user.color = (255, 255, 255)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59583431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档