如何让球从上到下反弹?

1 投票
1 回答
701 浏览
提问于 2025-04-18 01:33

我正在制作一个简单的乒乓球游戏,想让球在上下之间反弹。我知道我需要修改代码中的“test_collide_top_ball”和“test_collide_bottom_ball”这两个部分(在下面的第二个代码块中找到),但我有点不确定我的逻辑和解决方案是否正确。

所以,如果我想让球在碰到顶部时反弹回去,是否可以这样说:“self.y = self.y - dy”?当球碰到底部时也是同样的道理,只不过这次是加上去,而不是减去?

另外,我对如何让球在基础代码中移动有点困惑。谢谢你们的帮助!

这是我的基础代码:

import math
import random
import sys, pygame
from pygame.locals import *

import ball
import colors
import paddle

# draw the scene
def draw(screen, ball1, paddle1) :
   screen.fill((128, 128, 128))
   ball1.draw_ball(screen)
   paddle1.draw_paddle(screen)

#function to start up the main drawing
def main():

   pygame.init()
   width = 600
   height = 600
   screen = pygame.display.set_mode((width, height))

   ball1 = ball.Ball(300, 1, 40, colors.RED)
   paddle1 = paddle.Paddle(100, 575, colors.BLUE, 100, 20)

   while 1:
      for event in pygame.event.get():
         if event.type == QUIT: sys.exit()
         elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
               paddle1.update_paddle('right', 15)
            if event.key == pygame.K_LEFT:
               paddle1.update_paddle('left', 15)

      draw(screen, ball1, paddle1)
      pygame.display.flip()

if __name__ == '__main__':
   main()

这是我为球定义的类和方法:

import pygame

class Ball:
   def __init__(self, x, y, radius, color):
      self.x = x
      self.y = y
      self.radius = radius
      self.color = color

   def draw_ball(self, screen):
      pygame.draw.ellipse(screen, self.color,
         pygame.Rect(self.x, self.y, self.radius, self.radius))

   def update_ball(self, dx, dy):
      self.x += dx
      self.y += dy

   def test_collide_top_ball(self, top_height):
      if (self.y == top_height):
         return True
      else:
         return False

   def test_collide_bottom_ball(self, coll_height):
      if (self.y == coll_height):
         return True
      else:
         return False

提前谢谢你们!

1 个回答

0

问题在于,球的 self.y 值和屏幕的宽度很少会“相等”。所以,你应该检查一下球是否超出了屏幕的边界。你的更新方法应该是这样的:

[注意] dxdy 这两个变量应该是类的属性,而不是从外部传入的。

def update_ball(self, dx, dy, screen_w, screen_h):  #added screen width and height parameters
    self.x += self.dx
    self.y += self.dy
    if self.y > screen_h:
        self.y -= 5
        self.dy *= -1
    elif self.y < 0:
        self.y += 5
        self.dy *= -1
    if self.x > screen_w:
        self.x -= 5
        self.dx *= -1
    elif self.x < 0:
        self.x += 5
        self.dx *= -1

撰写回答