gpt4 book ai didi

python - 为什么球的行为方式是这样的?

转载 作者:行者123 更新时间:2023-11-28 17:43:42 28 4
gpt4 key购买 nike

我希望每个球独立移动。我认为问题与它们都具有相同的速度有关,但我不知道它们为什么这样做,或者这是否就是问题所在。另外,为什么屏幕的右侧部分会这样?我希望球能够在整个屏幕上正常移动。

import sys
import pygame
import random

screen_size = (screen_x, screen_y) = (640, 480)
screen = pygame.display.set_mode(screen_size)

size = {"width": 10, "height": 10}
velocity = {"x": {"mag": random.randint(3,7), "dir": random.randrange(-1,2,2)}, "y": {"mag": random.randint(3,7), "dir": random.randrange(-1,2,2)}}


class Ball(object):
def __init__(self, size, position, velocity):
self.size = size
self.position = position
self.velocity = velocity
self.color = (255, 255, 255)

def update(self):
self.position["x"] += (self.velocity["x"]["mag"] * self.velocity["x"]["dir"])
self.position["y"] += (self.velocity["y"]["mag"] * self.velocity["y"]["dir"])

if self.position["x"] <= 0 or self.position["x"] >= screen_y:
self.velocity["x"]["dir"] *= -1

if self.position["y"] <= 0 or self.position["y"] >= screen_y:
self.velocity["y"]["dir"] *= -1

self.rect = pygame.Rect(self.position["x"], self.position["y"], size["width"], size["height"])

def display(self):
pygame.draw.rect(screen, self.color, self.rect)


def main():
pygame.init()
fps = 30
clock = pygame.time.Clock()
balls = []

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
(x, y) = event.pos
position = {"x": x, "y": y}
new_ball = Ball(size, position, velocity)
balls.append(new_ball)

for ball in balls:
ball.update()

screen.fill((0,0,0))

for ball in balls:
ball.display()

pygame.display.update()
clock.tick(fps)

if __name__ == "__main__":
main()

最佳答案

屏幕右侧的问题是由于 update() 中这一行的拼写错误:

if self.position["x"] <= 0 or self.position["x"] >= screen_y:
# ^ should be x

这可以防止您的进入屏幕最右边的640 - 480 == 160像素。

所有球的行为都相同,因为当您第一次创建 velocity 时,您只调用 randint 获取一次随机值。尝试将 randint 调用移动到 __init__ 中,例如

def __init__(self, size, position, velocity=None):
if velocity is None:
velocity = {"x": {"mag": random.randint(3,7),
"dir": random.randrange(-1,2,2)},
"y": {"mag": random.randint(3,7),
"dir": random.randrange(-1,2,2)}}
self.size = size
self.position = position
self.velocity = velocity
self.color = (255, 255, 255)

这允许您提供一个 velocity 或被分配一个随机的。在 main() 中,您可以调用:

balls.append(Ball(size, position))

以随机速度在鼠标位置添加一个新的Ball

附带说明一下,您可以将 positionvelocity 属性简化为 (x, y) 元组,如 pygame,而不是你的 dict 结构,即:

velocity == (velocity['x']['mag'] * velocity['x']['dir'],
velocity['y']['mag'] * velocity['y']['dir'])

position == (position['x'], position['y'])

那么你在 main() 中的调用可能是:

balls.append(Ball(size, event.pos))

关于python - 为什么球的行为方式是这样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20953986/

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