Python 为什么在Pygame中,当我编写“Pong”代码时,球不能在我的代码中移动?有人能帮我检查一下代码吗?

Python 为什么在Pygame中,当我编写“Pong”代码时,球不能在我的代码中移动?有人能帮我检查一下代码吗?,python,pygame,Python,Pygame,我是Pygame的初学者。我已经编写了一个函数,用于在不同方向移动两个球,我按照说明编写了代码,但它似乎不起作用。我可以在屏幕上画两个球,但它们不会移动。我修复了将近一个小时,但不知道为什么球不动 那么,有人能帮我检查一下代码并给我一些提示吗。我会非常感激任何帮助我的人 我的代码如下所示 你的代码有很多问题。最基本的问题是,您还没有弄清楚事件驱动编程是如何工作的。你需要在你的循环中放置移动球的代码 另一个问题是,我认为您不想使用pygame.draw模块。我已经很久没有写pygame脚本了,但我

我是Pygame的初学者。我已经编写了一个函数,用于在不同方向移动两个球,我按照说明编写了代码,但它似乎不起作用。我可以在屏幕上画两个球,但它们不会移动。我修复了将近一个小时,但不知道为什么球不动

那么,有人能帮我检查一下代码并给我一些提示吗。我会非常感激任何帮助我的人

我的代码如下所示
你的代码有很多问题。最基本的问题是,您还没有弄清楚事件驱动编程是如何工作的。你需要在你的循环中放置移动球的代码

另一个问题是,我认为您不想使用pygame.draw模块。我已经很久没有写pygame脚本了,但我记得,这个模块对于绘制固定对象很有用,比如背景。快速查看文档似乎可以证实这一点

对于移动对象,我认为您需要查看pygame.sprite模块。即使你让这个代码工作,它也不会移动球。它只会在另一个位置引出一个新球。所以你会先有两个球,然后是四个,然后是八个。精灵实际上在移动。对象不仅在新位置绘制,而且在旧位置被擦除。您的代码根本不解决擦除问题


希望这有帮助

索尔斯帕茨回答的一部分是正确的,另一部分是不正确的。如果你不想,你不必使用精灵。pygame.draw虽然不漂亮,但非常实用。主要的问题似乎是您对在事件循环中做什么的理解。所有这些都应该包括在内:

while running:
    # Handdle your events
    # update your state
    # draw to your display
    pygame.display.update()
我还注意到,在循环后的不可访问代码中,您在绘制后填充了循环。记住,无论是填充、blit还是绘制,最新的内容都会超过其他内容。以你为例:

import pygame ,sys, time
from pygame.locals import *

# User define function
def ball_move(surface, pos, rad, speed):
    def _add(l_pos, l_speed, l_size):
        l_pos += l_speed
        if l_pos <= rad or l_pos >= l_size - rad:
            l_speed = -l_speed
        return l_pos, l_speed
    size = surface.get_size()
    pos_x, speed_x = _add(pos[0], speed[0], size[0])
    pos_y, speed_y = _add(pos[1], speed[1], size[1])
    return (pos_x, pos_y), (speed_x, speed_y)

pygame.init()
screen_size = (500, 400)
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption('Pong')
running = True

pos1 = (100, 200)
pos2 = (400, 200)
speed1 = (2, -2)
speed2 = (-2, 2)
rad = 10

while running:
    # Handdle your events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # update your state
    pos1, speed1 = ball_move(screen, pos1, rad, speed1)
    pos2, speed2 = ball_move(screen, pos2, rad, speed2)

    # draw to your display
    screen.fill(pygame.Color('black'))
    pygame.draw.circle(screen, pygame.Color('white'), pos1, rad)
    pygame.draw.circle(screen, pygame.Color('white'), pos2, rad)
    pygame.display.update()

这基本上是好的,但pos和speed变量是不可变元组还有一个问题。这意味着ball_move函数无法在适当的位置更改它们。是的,我添加了ball_move的代码。然而,如果这是我的代码,我会使用矢量来表示球的速度和位置,这样你们就可以添加它们了。我也会把球移到教室里。非常感谢!我通过你的代码意识到了我的愚蠢问题!真的谢谢你!
import pygame ,sys, time
from pygame.locals import *

# User define function
def ball_move(surface, pos, rad, speed):
    def _add(l_pos, l_speed, l_size):
        l_pos += l_speed
        if l_pos <= rad or l_pos >= l_size - rad:
            l_speed = -l_speed
        return l_pos, l_speed
    size = surface.get_size()
    pos_x, speed_x = _add(pos[0], speed[0], size[0])
    pos_y, speed_y = _add(pos[1], speed[1], size[1])
    return (pos_x, pos_y), (speed_x, speed_y)

pygame.init()
screen_size = (500, 400)
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption('Pong')
running = True

pos1 = (100, 200)
pos2 = (400, 200)
speed1 = (2, -2)
speed2 = (-2, 2)
rad = 10

while running:
    # Handdle your events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # update your state
    pos1, speed1 = ball_move(screen, pos1, rad, speed1)
    pos2, speed2 = ball_move(screen, pos2, rad, speed2)

    # draw to your display
    screen.fill(pygame.Color('black'))
    pygame.draw.circle(screen, pygame.Color('white'), pos1, rad)
    pygame.draw.circle(screen, pygame.Color('white'), pos2, rad)
    pygame.display.update()