You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PyGame中让触碰到边界的小球(LOPTICA)重置至默认位置?

Ping Pong游戏小球重置问题解决办法

你需要在小球(LOPTICA)超出左右屏幕边界的判断块中,添加重置小球位置、速度以及球拍位置的逻辑,具体修改如下:

修改关键代码段

原代码中的判断部分:

LOPTICA = LOPTICA.move(BRZINA_LOPTICE)
if LOPTICA.left < 0 or LOPTICA.right > width:
    ##what i should put here ?

替换为:

LOPTICA = LOPTICA.move(BRZINA_LOPTICE)
if LOPTICA.left < 0 or LOPTICA.right > width:
    # 重置小球到屏幕中心
    LOPTICA.center = (width//2, height//2)
    # 重置小球速度(x方向反向,y方向回到初始值)
    BRZINA_LOPTICE[0] = -BRZINA_LOPTICE[0]
    BRZINA_LOPTICE[1] = 4.5
    # 重置左右球拍回到初始位置(可选,按需保留)
    LEVALINIJA.y = 220
    DESNALINIJA.y = 220

完整修改后的代码

import pygame
import os

width, height = 900, 500
screen = pygame.display.set_mode((width, height))

FPS = 60
BRZINA = 6
BRZINA_LOPTICE = [4.5, 4.5]

ikonica = pygame.image.load(os.path.join('dodaci', "ikonica.png"))
pygame.display.set_caption('Ping Pong')
pygame.display.set_icon(ikonica)

pozadina = pygame.image.load(os.path.join('dodaci', 'pozadina.jpg'))
BOJALINIJE = (255, 255, 255)
BOJALOPTICE = (224, 15, 0)

LEVALINIJA = pygame.Rect(100, 220, 7, 100)
DESNALINIJA= pygame.Rect(800, 220, 7, 100)
radius= 10

LOPTICA = pygame.Rect(width//2, height//2, radius*2, radius)


def prikaz_pozadine():
    screen.blit(pozadina, (0, 0))
    pygame.draw.rect(screen, BOJALINIJE, LEVALINIJA)
    pygame.draw.rect(screen, BOJALINIJE, DESNALINIJA)
    pygame.draw.circle(screen, BOJALOPTICE, LOPTICA.center, radius)
    pygame.display.update()


def kretanje_linija(LEVALINIJA, DESNALINIJA):
    tasteri_kretanja = pygame.key.get_pressed()

    if tasteri_kretanja[pygame.K_w] and LEVALINIJA.y - BRZINA > 0:
        LEVALINIJA.y -= BRZINA
    if tasteri_kretanja[pygame.K_s] and LEVALINIJA.y + BRZINA + LEVALINIJA.height < height:
        LEVALINIJA.y += BRZINA
    if tasteri_kretanja[pygame.K_UP] and DESNALINIJA.y - BRZINA > 0:
        DESNALINIJA.y -= BRZINA
    if tasteri_kretanja[pygame.K_DOWN] and DESNALINIJA.y + BRZINA + LEVALINIJA.height < height:
        DESNALINIJA.y += BRZINA


def glavnica():
    clock = pygame.time.Clock()
    running = True
    while running:
        global LOPTICA
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        LOPTICA = LOPTICA.move(BRZINA_LOPTICE)
        if LOPTICA.left < 0 or LOPTICA.right > width:
            # 重置小球到屏幕中心
            LOPTICA.center = (width//2, height//2)
            # 重置小球速度方向
            BRZINA_LOPTICE[0] = -BRZINA_LOPTICE[0]
            BRZINA_LOPTICE[1] = 4.5
            # 重置球拍位置
            LEVALINIJA.y = 220
            DESNALINIJA.y = 220
        if LOPTICA.top < 0 or LOPTICA.bottom > height:
            BRZINA_LOPTICE[1] = -BRZINA_LOPTICE[1]

        if LOPTICA.colliderect(LEVALINIJA):
            BRZINA_LOPTICE[0] = abs(BRZINA_LOPTICE[0])

        if LOPTICA.colliderect(DESNALINIJA):
            BRZINA_LOPTICE[0] = -abs(BRZINA_LOPTICE[0])

        prikaz_pozadine()
        kretanje_linija(LEVALINIJA, DESNALINIJA)


if __name__ == "__main__":
    glavnica()

说明

  • 用LOPTICA.center = (width//2, height//2)直接定位小球到中心,比重新创建Rect对象更稳妥,避免引用问题。
  • 重置速度时让x方向反向,保证下一次发球朝向得分对侧;y方向回到初始值,也可改成随机方向增加游戏性。
  • 球拍重置是可选操作,不需要的话可以删除对应两行代码。

内容的提问来源于stack exchange,提问作者GigaBurek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:57:23