2
import pygame, sys

pygame.init()

display_width = 800
display_height = 500

white = (255, 255, 255)

display = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('Pong')
clock = pygame.time.Clock()

platform_y = display_height * 0.38

def platform(color, x, y):
    global platform_y

    pygame.draw.rect(display, color, (x, y, 25, 100))

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

def ball():
    pygame.draw.circle(display, white, (400, 250), 12)
    pygame.display.update()

def game():
    global platform_y
    y_change = 0
    while True:
        platform(white, 100, platform_y)
        platform(white, 675, platform_y)
        ball()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit(0)
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                sys.exit(0)

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    y_change -= 2
                if event.key == pygame.K_DOWN:
                    y_change += 2

            if event.type == pygame.KEYUP:
                    if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                        y_change = 0

        platform_y += y_change
        pygame.display.update()
        clock.tick(80)

if __name__ == '__main__':
    game()

我想这不是最好的代码,但我一直在搞乱 pygame 并且到了我必须创建 Pong 的地步,虽然我不确定为什么矩形(平台)只是越来越高而不是上下(我知道两个平台会一起崛起,会解决这个问题,这只是为了测试)

4

1 回答 1

3

您的代码有几个问题:

  1. 你只需要调用pygame.display.update一次,而不是每次之后pygame.draw
  2. clock.tick设置在主游戏循环中,而不是在其他地方,
  3. 您必须在绘制之前清除屏幕。

这可能会按您的预期工作:

import pygame, sys

pygame.init()

display_width = 800
display_height = 500

white = (255, 255, 255)

display = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('Pong')
clock = pygame.time.Clock()

platform_y = display_height * 0.38


def platform(color, x, y):
    global platform_y

    pygame.draw.rect(display, color, (x, y, 25, 100))


def ball():
    pygame.draw.circle(display, white, (400, 250), 12)


def game():
    global platform_y
    y_change = 0

    while True:
        platform(white, 100, platform_y)
        platform(white, 675, platform_y)
        ball()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit(0)
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                sys.exit(0)

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    y_change -= 2
                if event.key == pygame.K_DOWN:
                    y_change += 2

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    y_change = 0

        platform_y += y_change

        pygame.display.update()
        clock.tick(80)
        display.fill((0, 0, 0))


if __name__ == '__main__':
    game()

几个建议:

  1. 不要使用global!这是坏代码的味道。当然有更好的方法可以在不使用它的情况下实现你想要的。
  2. 尽量避免很多条件嵌套。它很难阅读,一两天后阅读需要大量的精神能量。

快乐编码!

于 2018-02-12T20:59:29.883 回答